You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/10/18 23:23:34 UTC

[sling-org-apache-sling-resource-editor] 18/50: SLING-4462 Integrated the frontend-maven-plugin to use NodeJS, npm and Grunt. Also for SLING-4205.

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resource-editor.git

commit 96012775ffd58167fdd12a0bab9b98c26a721269
Author: Sandro Boehme <sb...@apache.org>
AuthorDate: Fri Mar 27 13:34:13 2015 +0000

    SLING-4462 Integrated the frontend-maven-plugin to use NodeJS, npm and Grunt. Also for SLING-4205.
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1669584 13f79535-47bb-0310-9956-ffa450edef68
---
 README                                             |   28 +-
 frontend/Gruntfile.js                              |  139 +
 frontend/grunt                                     |    3 +
 frontend/grunt.cmd                                 |    3 +
 frontend/karma                                     |    2 +
 frontend/karma.cmd                                 |    3 +
 frontend/karma.conf.js                             |   44 +
 frontend/licenselist                               |    2 +
 frontend/npm                                       |    2 +
 frontend/npm.cmd                                   |    3 +
 frontend/package.json                              |   38 +
 pom.xml                                            |   43 +-
 src/main/less/alerts.less                          |   69 +-
 src/main/less/badges.less                          |   55 -
 src/main/less/bootstrap.less                       |   51 -
 src/main/less/breadcrumbs.less                     |   26 -
 src/main/less/button-groups.less                   |  226 -
 src/main/less/buttons.less                         |  152 +-
 src/main/less/carousel.less                        |  232 -
 src/main/less/close.less                           |   33 -
 src/main/less/code.less                            |   63 -
 src/main/less/component-animations.less            |   29 -
 src/main/less/dropdowns.less                       |  213 -
 src/main/less/{reseditor => }/elements.less        |    0
 src/main/less/forms.less                           |  439 +-
 src/main/less/glyphicons.less                      |  233 -
 src/main/less/grid.less                            |   84 -
 src/main/less/input-groups.less                    |  162 -
 src/main/less/jumbotron.less                       |   44 -
 src/main/less/labels.less                          |   64 -
 src/main/less/list-group.less                      |  110 -
 src/main/less/media.less                           |   56 -
 src/main/less/mixins.less                          |  929 ---
 src/main/less/modals.less                          |  137 +-
 src/main/less/navbar.less                          |  616 --
 src/main/less/navs.less                            |  273 +-
 src/main/less/normalize.less                       |  423 --
 src/main/less/pager.less                           |   55 -
 src/main/less/pagination.less                      |   88 -
 src/main/less/panels.less                          |  241 -
 src/main/less/popovers.less                        |  133 -
 src/main/less/print.less                           |  101 -
 src/main/less/progress-bars.less                   |   80 -
 src/main/less/{reseditor => }/reseditor.less       |    2 +
 src/main/less/reseditor/alerts.less                |   10 -
 src/main/less/reseditor/buttons.less               |   11 -
 src/main/less/reseditor/forms.less                 |   37 -
 src/main/less/reseditor/modals.less                |   14 -
 src/main/less/reseditor/navs.less                  |   63 -
 src/main/less/reseditor/scaffolding.less           |   11 -
 src/main/less/reseditor/variables.less             |   17 -
 src/main/less/responsive-utilities.less            |   92 -
 src/main/less/scaffolding.less                     |  129 +-
 src/main/less/tables.less                          |  233 -
 src/main/less/theme.less                           |  247 -
 src/main/less/thumbnails.less                      |   36 -
 src/main/less/tooltip.less                         |   95 -
 src/main/less/type.less                            |  293 -
 src/main/less/utilities.less                       |   56 -
 src/main/less/variables.less                       |  834 +--
 src/main/less/wells.less                           |   29 -
 .../css/animate.min.css                            |    1 -
 .../resource-editor-static-content/css/font.css    |    2 +-
 .../resource-editor-static-content/css/font_ie.css |    4 +-
 .../resource-editor-static-content/css/select2.css |  704 --
 .../resource-editor-static-content/css/select2.png |  Bin 613 -> 0 bytes
 .../resource-editor-static-content/css/shake.css   |   64 -
 .../font/{ => 3rd_party}/Michroma.eot              |  Bin
 .../font/{ => 3rd_party}/Michroma.woff             |  Bin
 .../js/bootbox.min.js                              |    6 -
 .../js/bootstrap.min.js                            |    6 -
 .../js/jquery.min.js                               |    6 -
 .../js/jquery.scrollTo-min.js                      |   11 -
 .../resource-editor-static-content/js/jstree.js    | 6743 --------------------
 .../js/select2.min.js                              |   23 -
 .../SLING-INF/libs/sling/resource-editor/html.jsp  |   18 +-
 src/test/javascript/e2e/spec/e2e_spec.js           |   14 +
 src/test/javascript/spec/resource_editor_spec.js   |   34 +
 78 files changed, 431 insertions(+), 15141 deletions(-)

diff --git a/README b/README
index 6e56a7d..ab99764 100644
--- a/README
+++ b/README
@@ -2,23 +2,17 @@ Apache Sling Resource Editor
 
 The Apache Sling Resource Editor allows to edit Apache Sling content based on the Sling API. 
 
-++ Deploy Binaries ++
-o Navigate to the OSGi Repository page of the management console within your running Sling instance (/system/console/obr)
-o If the OSGi Repository page is not there, install `http://search.maven.org/#artifactdetails|org.apache.felix|org.apache.felix.webconsole.plugins.obr|1.0.2|bundle` at `system/console/bundles` to make it available.
-o Add the OSGi repository URL (http://www.jcrbrowser.org/sling/obr/repository.xml). 
-o Search for the "Apache Sling Resource Editor" resource and navigate to the latest version.
-o Click "Deploy and Start".
-o At /system/console/bundles you will see that the Resource Editor bundle is active.
-o Open "/reseditor/.html" at your server to see the web application.
+++ Installation ++
+o First install the JSNodeTypes library here: 'contrib/commons/js/nodetypes'. You find the short installation instruction in its README file.
+o Then use 'mvn install -P autoInstallBundle' to install this bundle to your local Sling instance at port 8080. 
+o After that you find the web application at "/reseditor/.html" on your server.
 
-++ Build the Sling Resource Editor ++
-o Deploy the binaries as described above. 
-o Download and install Git from http://www.git-scm.com/download
-o Call `git clone git://github.com/sandroboehme/resourceeditor.git` in a shell. It will create the resourceeditor subfolder containing the source. 
-o Change to the resourceeditor subdirectory and call `mvn clean package` there to install the sources into the running Sling instance.
-
-++ Develop with the Sling Resource Editor ++
+++ Development with the Sling Resource Editor ++
 o Use `mvn install sling:install` to deploy changes of Java classes
-o To have frontend changes automatically deployed call `mvn install`
-o To have the less sources automatically compiled call `mvn lesscss:compile -Dlesscss.watch=true`
+o To have frontend changes automatically deployed call `mvn install -P autoInstallBundle -Dsling.mountByFS=true`
+o To have the less sources automatically compiled on change call `./grunt watch:less` in the frontend directory. Press Ctrl-Z to stop watching.
+o To run the build on your local maschine call './grunt local_build' within the frontend directory. It includes end to end tests with firefox and chrome.
+
+
 
+Enjoy!
\ No newline at end of file
diff --git a/frontend/Gruntfile.js b/frontend/Gruntfile.js
new file mode 100644
index 0000000..d7db9e6
--- /dev/null
+++ b/frontend/Gruntfile.js
@@ -0,0 +1,139 @@
+module.exports = function(grunt) {
+	grunt.initConfig({
+	    less: {
+	      compileCore: {
+	        options: {
+	          strictMath: true,
+	          sourceMap: true,
+	          outputSourceFiles: true,
+	          sourceMapURL: 'bootstrap.css.map',
+	          sourceMapFilename: '../src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/bootstrap.css.map'
+	        },
+	        src: '../src/main/less/reseditor.less',
+	        dest: '../src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/bootstrap.css'
+	      }
+	    }, 
+	    watch: {
+			less : {
+				files : '../src/main/less/**/*.less',
+				tasks : [ 'less' ],
+			}
+	    },
+	    _comment:'The google web fonts could be downloaded and copied via grunt-goog-webfont-dl. But goog-webfont-dl directly points to the global #!/usr/bin/env node and not to the local one.',
+	    copy: {
+	    	js_dependencies: {
+		        files: [
+		          {
+		            expand: true,     // Enable dynamic expansion.
+		            cwd: 'node_modules/',      // Src matches are relative to this path.
+		            src: [
+		                  'bootstrap/dist/js/bootstrap.min.js',
+		                  'select2/select2.min.js',
+		                  'jquery/dist/jquery.min.js',
+		                  'bootbox/bootbox.min.js',
+		                  'jstree/dist/jstree.min.js'
+		                 ], // Actual pattern(s) to match.
+		            dest: '../src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/3rd_party',   // Destination path prefix.
+		            flatten: true
+		          },
+		        ],
+		      },
+    	css_dependencies: {
+	        files: [
+	          {
+	            expand: true,     // Enable dynamic expansion.
+	            cwd: 'node_modules/',      // Src matches are relative to this path.
+	            src: [
+	                  'select2/select2.css',
+	                  'select2/select2.png',
+	                  'animate.css/animate.min.css',
+	                 ], // Actual pattern(s) to match.
+	            dest: '../src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/3rd_party',   // Destination path prefix.
+	            flatten: true
+	          },
+	        ],
+	      }
+	    },
+	    jasmine: {
+	        main: {
+	          src: ['../src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/jquery.min.js',
+	                '../src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/**/*.js'],
+	          options: {
+	            specs: '../src/test/javascript/spec/*spec.js',
+	            helpers: '../src/test/javascript/spec/*Helper.js',
+	            version: '2.2.1',
+	            summary: true
+	          }
+	        }
+	    },
+	    karma: {
+	    	options: {
+	    	    runnerPort: 9999,
+	    	    singleRun: true,
+	    	    browsers: ['PhantomJS'],
+	    	    plugins : ['karma-jasmine', 'karma-phantomjs-launcher'],
+	    	    frameworks: ['jasmine']
+	    	},
+	    	build: {
+	    	    singleRun: true,
+	    	    files: [
+	    	            { src: ['../src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/3rd_party/jquery.min.js']},
+	    	            { src: ['../src/test/javascript/spec/*spec.js']},
+	    	            { src: ['../src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/**/*.js']}
+	    	          ]
+	    	},
+	    	local_build: {
+	    	    singleRun: true,
+	    	    browsers: ['Chrome', 'Firefox', 'PhantomJS'],
+	    	    plugins : ['karma-jasmine', 'karma-phantomjs-launcher', 'karma-chrome-launcher', 'karma-firefox-launcher', 'karma-ie-launcher'],
+	    	    files: [
+	    	            { src: ['../src/test/javascript/spec/*spec.js']},
+	    	            { src: ['../src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/3rd_party/jquery.min.js']},
+	    	            { src: ['../src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/**/*.js']}
+	    	          ]
+	    	},
+	    	watch: {
+	    	    reporters: 'dots',
+	    	    autoWatch: true,
+	    	    background: true,
+	    	    singleRun: false
+	    	}
+	    },
+        webdriver: {
+            options: {
+//                desiredCapabilities: {
+//                    browserName: 'chrome'
+//                }
+            },
+            chrome: {
+                tests: ['../src/test/javascript/e2e/spec/**/*spec.js'],
+                options: {
+                    // overwrite default settings 
+                    desiredCapabilities: {
+                        browserName: 'chrome'
+                    }
+                }
+            },
+            firefox: {
+                tests: ['../src/test/javascript/e2e/spec/**/*spec.js'],
+                options: {
+                    // overwrite default settings 
+                    desiredCapabilities: {
+                        browserName: 'firefox'
+                    }
+                }
+            }
+          }
+	})
+	
+    // These plugins provide necessary tasks.
+    require('load-grunt-tasks')(grunt, { scope: 'devDependencies' });
+
+//	grunt.registerTask('build', ['less', 'copy', 'jasmine', 'karma:build']);
+	grunt.registerTask('build', ['less', 'copy', 'karma:build']);
+
+	grunt.registerTask('default', ['build']);
+	
+
+    grunt.registerTask('local_build', ['less', 'copy', 'karma:local_build', 'webdriver:chrome', 'webdriver:firefox', 'build']);
+};
\ No newline at end of file
diff --git a/frontend/grunt b/frontend/grunt
new file mode 100755
index 0000000..9581eec
--- /dev/null
+++ b/frontend/grunt
@@ -0,0 +1,3 @@
+#!/bin/sh
+"node/node" "node_modules/grunt-cli/bin/grunt" "$@"
+
diff --git a/frontend/grunt.cmd b/frontend/grunt.cmd
new file mode 100644
index 0000000..5dacf04
--- /dev/null
+++ b/frontend/grunt.cmd
@@ -0,0 +1,3 @@
+@echo off
+%~dp0node/node node_modules/grunt-cli/bin/grunt %*
+@echo on
\ No newline at end of file
diff --git a/frontend/karma b/frontend/karma
new file mode 100755
index 0000000..9b8f4d6
--- /dev/null
+++ b/frontend/karma
@@ -0,0 +1,2 @@
+#!/bin/sh
+"node/node" "node_modules/karma/bin/karma" "$@"
diff --git a/frontend/karma.cmd b/frontend/karma.cmd
new file mode 100644
index 0000000..e856ff9
--- /dev/null
+++ b/frontend/karma.cmd
@@ -0,0 +1,3 @@
+@echo off
+%~dp0node/node node_modules/karma/bin/karma %*
+@echo on
\ No newline at end of file
diff --git a/frontend/karma.conf.js b/frontend/karma.conf.js
new file mode 100644
index 0000000..3c362a3
--- /dev/null
+++ b/frontend/karma.conf.js
@@ -0,0 +1,44 @@
+module.exports = function(config) {
+    config.set({
+ 
+        // base path, that will be used to resolve files and exclude
+        basePath: '../src/',
+ 
+        // frameworks to use
+        frameworks: ['jasmine'],
+ 
+        // list of files / patterns to load in the browser
+        files: [
+            '**/*.js'
+        ],
+ 
+        // list of files to exclude
+        exclude: [
+        ],
+ 
+        // test results reporter to use
+        reporters: ['progress'],
+ 
+        // web server port
+        port: 9876,
+ 
+        // enable / disable colors in the output (reporters and logs)
+        colors: true,
+ 
+        // level of logging
+        logLevel: config.LOG_INFO,
+ 
+        // enable / disable watching file and executing tests whenever any file changes
+        autoWatch: true,
+ 
+        // Start these browsers
+        browsers: ['PhantomJS'],
+ 
+        // If browser does not capture in given timeout [ms], kill it
+        captureTimeout: 60000,
+ 
+        // Continuous Integration mode
+        // if true, it capture browsers, run tests and exit
+        singleRun: false
+    });
+};
\ No newline at end of file
diff --git a/frontend/licenselist b/frontend/licenselist
new file mode 100755
index 0000000..86bd837
--- /dev/null
+++ b/frontend/licenselist
@@ -0,0 +1,2 @@
+#!/bin/sh
+node_modules/nlf/bin/nlf -d -r 0
\ No newline at end of file
diff --git a/frontend/npm b/frontend/npm
new file mode 100755
index 0000000..e52f477
--- /dev/null
+++ b/frontend/npm
@@ -0,0 +1,2 @@
+#!/bin/sh
+"node/node" "node/npm/bin/npm-cli.js" "$@"
diff --git a/frontend/npm.cmd b/frontend/npm.cmd
new file mode 100644
index 0000000..13ddcac
--- /dev/null
+++ b/frontend/npm.cmd
@@ -0,0 +1,3 @@
+@echo off
+%~dp0node/node node/npm/bin/npm-cli.js %*
+@echo on
\ No newline at end of file
diff --git a/frontend/package.json b/frontend/package.json
new file mode 100644
index 0000000..d537f1f
--- /dev/null
+++ b/frontend/package.json
@@ -0,0 +1,38 @@
+{
+  "name": "resource-editor",
+  "version": "0.1.0",
+  "readme": "A resource editor frontend for Apache Sling.",
+  "dependencies": {
+  	"jquery": "1.11.2",
+  	"bootbox": "4.4.0",
+  	"jstree": "3.1.0",
+  	"animate.css": "3.2.1",
+  	"bootstrap": "3.3.2",
+  	"select2": "3.5.2-browserify",
+  	"jstree": "3.0.9",
+  	"animate.css": "3.1.1",
+  	"jquery-scrollto": "1.4.4"
+  },
+  "devDependencies": {
+    "grunt": "0.4.5",
+    "load-grunt-tasks": "2.0.0",
+    "grunt-cli": "0.1.13",
+    "grunt-contrib-less": "1.0.0",
+    "grunt-contrib-copy": "0.8.0",
+    "grunt-contrib-watch": "0.6.1",
+    "jasmine":"2.2.1",
+    "grunt-contrib-jasmine":"0.8.2",
+    "grunt-karma": "0.10.1",
+    "karma-phantomjs-launcher": "0.1.2",
+    "karma-jasmine": "0.3.5",
+    "karma-chrome-launcher": "0.1.7",
+    "karma-firefox-launcher": "0.1.4",
+    "karma-ie-launcher": "0.1.5",
+    "webdriver-manager": "3.0.0",
+    "grunt-webdriver": "0.4.8",
+    "nlf": "1.1.0"
+  },
+    "scripts": {
+    "postinstall": "node_modules/.bin/webdriver-manager update --standalone"
+  }
+}
diff --git a/pom.xml b/pom.xml
index 99b921b..0e263de 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,24 +38,6 @@
 		</resources>
 		<plugins>
 			<plugin>
-				<groupId>org.lesscss</groupId>
-				<artifactId>lesscss-maven-plugin</artifactId>
-				<version>1.7.0.1.1</version>
-				<configuration>
-					<outputDirectory>${project.basedir}/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css</outputDirectory>
-					<includes>
-						<include>bootstrap.less</include>
-					</includes>
-				</configuration>
-				<executions>
-					<execution>
-						<goals>
-							<goal>compile</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
 				<groupId>org.apache.felix</groupId>
 				<artifactId>maven-scr-plugin</artifactId>
 				<executions>
@@ -99,6 +81,31 @@
 					<remoteOBR>www.jcrbrowser.org</remoteOBR>
 				</configuration>
 			</plugin>
+			<plugin>
+		        <groupId>com.github.eirslett</groupId>
+		        <artifactId>frontend-maven-plugin</artifactId>
+		        <version>0.0.22</version>
+		        <configuration>
+			        <workingDirectory>frontend</workingDirectory>
+			    </configuration>
+			    <executions>
+				    <execution>
+					    <goals> <goal>install-node-and-npm</goal> </goals>
+					    <configuration>
+					        <nodeVersion>v0.12.1</nodeVersion>
+					        <npmVersion>1.4.9</npmVersion>
+					    </configuration>
+					</execution>
+					<execution> 
+						<id>npm install</id> 	
+						<goals> <goal>npm</goal> 	</goals>
+					</execution>
+					<execution>
+						<id>grunt build</id>
+						<goals> <goal>grunt</goal> </goals>
+					</execution>
+				</executions>
+		    </plugin>
 		</plugins>
 		<extensions>
 			<extension>
diff --git a/src/main/less/alerts.less b/src/main/less/alerts.less
index 3eab066..cdaad6c 100644
--- a/src/main/less/alerts.less
+++ b/src/main/less/alerts.less
@@ -1,67 +1,10 @@
-//
-// Alerts
-// --------------------------------------------------
-
-
-// Base styles
-// -------------------------
-
 .alert {
-  padding: @alert-padding;
-  margin-bottom: @line-height-computed;
-  border: 1px solid transparent;
-  border-radius: @alert-border-radius;
-
-  // Headings for larger alerts
-  h4 {
-    margin-top: 0;
-    // Specified for the h4 to prevent conflicts of changing @headings-color
-    color: inherit;
-  }
-  // Provide class for links that match alerts
-  .alert-link {
-    font-weight: @alert-link-font-weight;
-  }
-
-  // Improve alignment and spacing of inner content
-  > p,
-  > ul {
-    margin-bottom: 0;
-  }
-  > p + p {
-    margin-top: 5px;
-  }
-}
-
-// Dismissable alerts
-//
-// Expand the right padding and account for the close button's positioning.
-
-.alert-dismissable {
- padding-right: (@alert-padding + 20);
-
-  // Adjust close link position
-  .close {
-    position: relative;
-    top: -2px;
-    right: -21px;
-    color: inherit;
-  }
+  text-shadow: 1px 1px 0 rgba(255,255,255,.5);
+  .rounded(5px);
+  .plate-box-shadow;
+  .plate-margin;
 }
 
-// Alternate styles
-//
-// Generate contextual modifier classes for colorizing the alert.
-
-.alert-success {
-  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);
-}
-.alert-info {
-  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);
-}
 .alert-warning {
-  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);
-}
-.alert-danger {
-  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);
-}
+  .alert-variant(transparent; #AA6600; #AA6600);
+}
\ No newline at end of file
diff --git a/src/main/less/badges.less b/src/main/less/badges.less
deleted file mode 100644
index 56828ca..0000000
--- a/src/main/less/badges.less
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-// Badges
-// --------------------------------------------------
-
-
-// Base classes
-.badge {
-  display: inline-block;
-  min-width: 10px;
-  padding: 3px 7px;
-  font-size: @font-size-small;
-  font-weight: @badge-font-weight;
-  color: @badge-color;
-  line-height: @badge-line-height;
-  vertical-align: baseline;
-  white-space: nowrap;
-  text-align: center;
-  background-color: @badge-bg;
-  border-radius: @badge-border-radius;
-
-  // Empty badges collapse automatically (not available in IE8)
-  &:empty {
-    display: none;
-  }
-
-  // Quick fix for badges in buttons
-  .btn & {
-    position: relative;
-    top: -1px;
-  }
-  .btn-xs & {
-    top: 0;
-    padding: 1px 5px;
-  }
-}
-
-// Hover state, but only for links
-a.badge {
-  &:hover,
-  &:focus {
-    color: @badge-link-hover-color;
-    text-decoration: none;
-    cursor: pointer;
-  }
-}
-
-// Account for counters in navs
-a.list-group-item.active > .badge,
-.nav-pills > .active > a > .badge {
-  color: @badge-active-color;
-  background-color: @badge-active-bg;
-}
-.nav-pills > li > a > .badge {
-  margin-left: 3px;
-}
diff --git a/src/main/less/bootstrap.less b/src/main/less/bootstrap.less
deleted file mode 100644
index dd6f018..0000000
--- a/src/main/less/bootstrap.less
+++ /dev/null
@@ -1,51 +0,0 @@
-// Core variables and mixins
-@import "variables.less";
-@import "mixins.less";
-
-// Reset
-@import "normalize.less";
-@import "print.less";
-
-// Core CSS
-@import "scaffolding.less";
-@import "type.less";
-@import "code.less";
-@import "grid.less";
-@import "tables.less";
-@import "forms.less";
-@import "buttons.less";
-
-// Components
-@import "component-animations.less";
-@import "glyphicons.less";
-@import "dropdowns.less";
-@import "button-groups.less";
-@import "input-groups.less";
-@import "navs.less";
-@import "navbar.less";
-@import "breadcrumbs.less";
-@import "pagination.less";
-@import "pager.less";
-@import "labels.less";
-@import "badges.less";
-@import "jumbotron.less";
-@import "thumbnails.less";
-@import "alerts.less";
-@import "progress-bars.less";
-@import "media.less";
-@import "list-group.less";
-@import "panels.less";
-@import "wells.less";
-@import "close.less";
-
-// Components w/ JavaScript
-@import "modals.less";
-@import "tooltip.less";
-@import "popovers.less";
-@import "carousel.less";
-
-// Utility classes
-@import "utilities.less";
-@import "responsive-utilities.less";
-
-@import "reseditor/reseditor.less";
diff --git a/src/main/less/breadcrumbs.less b/src/main/less/breadcrumbs.less
deleted file mode 100644
index cb01d50..0000000
--- a/src/main/less/breadcrumbs.less
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Breadcrumbs
-// --------------------------------------------------
-
-
-.breadcrumb {
-  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;
-  margin-bottom: @line-height-computed;
-  list-style: none;
-  background-color: @breadcrumb-bg;
-  border-radius: @border-radius-base;
-
-  > li {
-    display: inline-block;
-
-    + li:before {
-      content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space
-      padding: 0 5px;
-      color: @breadcrumb-color;
-    }
-  }
-
-  > .active {
-    color: @breadcrumb-active-color;
-  }
-}
diff --git a/src/main/less/button-groups.less b/src/main/less/button-groups.less
deleted file mode 100644
index 27eb796..0000000
--- a/src/main/less/button-groups.less
+++ /dev/null
@@ -1,226 +0,0 @@
-//
-// Button groups
-// --------------------------------------------------
-
-// Make the div behave like a button
-.btn-group,
-.btn-group-vertical {
-  position: relative;
-  display: inline-block;
-  vertical-align: middle; // match .btn alignment given font-size hack above
-  > .btn {
-    position: relative;
-    float: left;
-    // Bring the "active" button to the front
-    &:hover,
-    &:focus,
-    &:active,
-    &.active {
-      z-index: 2;
-    }
-    &:focus {
-      // Remove focus outline when dropdown JS adds it after closing the menu
-      outline: none;
-    }
-  }
-}
-
-// Prevent double borders when buttons are next to each other
-.btn-group {
-  .btn + .btn,
-  .btn + .btn-group,
-  .btn-group + .btn,
-  .btn-group + .btn-group {
-    margin-left: -1px;
-  }
-}
-
-// Optional: Group multiple button groups together for a toolbar
-.btn-toolbar {
-  margin-left: -5px; // Offset the first child's margin
-  &:extend(.clearfix all);
-
-  .btn-group,
-  .input-group {
-    float: left;
-  }
-  > .btn,
-  > .btn-group,
-  > .input-group {
-    margin-left: 5px;
-  }
-}
-
-.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
-  border-radius: 0;
-}
-
-// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
-.btn-group > .btn:first-child {
-  margin-left: 0;
-  &:not(:last-child):not(.dropdown-toggle) {
-    .border-right-radius(0);
-  }
-}
-// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
-.btn-group > .btn:last-child:not(:first-child),
-.btn-group > .dropdown-toggle:not(:first-child) {
-  .border-left-radius(0);
-}
-
-// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
-.btn-group > .btn-group {
-  float: left;
-}
-.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-.btn-group > .btn-group:first-child {
-  > .btn:last-child,
-  > .dropdown-toggle {
-    .border-right-radius(0);
-  }
-}
-.btn-group > .btn-group:last-child > .btn:first-child {
-  .border-left-radius(0);
-}
-
-// On active and open, don't show outline
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
-  outline: 0;
-}
-
-
-// Sizing
-//
-// Remix the default button sizing classes into new ones for easier manipulation.
-
-.btn-group-xs > .btn { &:extend(.btn-xs); }
-.btn-group-sm > .btn { &:extend(.btn-sm); }
-.btn-group-lg > .btn { &:extend(.btn-lg); }
-
-
-// Split button dropdowns
-// ----------------------
-
-// Give the line between buttons some depth
-.btn-group > .btn + .dropdown-toggle {
-  padding-left: 8px;
-  padding-right: 8px;
-}
-.btn-group > .btn-lg + .dropdown-toggle {
-  padding-left: 12px;
-  padding-right: 12px;
-}
-
-// The clickable button for toggling the menu
-// Remove the gradient and set the same inset shadow as the :active state
-.btn-group.open .dropdown-toggle {
-  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
-
-  // Show no shadow for `.btn-link` since it has no other button styles.
-  &.btn-link {
-    .box-shadow(none);
-  }
-}
-
-
-// Reposition the caret
-.btn .caret {
-  margin-left: 0;
-}
-// Carets in other button sizes
-.btn-lg .caret {
-  border-width: @caret-width-large @caret-width-large 0;
-  border-bottom-width: 0;
-}
-// Upside down carets for .dropup
-.dropup .btn-lg .caret {
-  border-width: 0 @caret-width-large @caret-width-large;
-}
-
-
-// Vertical button groups
-// ----------------------
-
-.btn-group-vertical {
-  > .btn,
-  > .btn-group,
-  > .btn-group > .btn {
-    display: block;
-    float: none;
-    width: 100%;
-    max-width: 100%;
-  }
-
-  // Clear floats so dropdown menus can be properly placed
-  > .btn-group {
-    &:extend(.clearfix all);
-    > .btn {
-      float: none;
-    }
-  }
-
-  > .btn + .btn,
-  > .btn + .btn-group,
-  > .btn-group + .btn,
-  > .btn-group + .btn-group {
-    margin-top: -1px;
-    margin-left: 0;
-  }
-}
-
-.btn-group-vertical > .btn {
-  &:not(:first-child):not(:last-child) {
-    border-radius: 0;
-  }
-  &:first-child:not(:last-child) {
-    border-top-right-radius: @border-radius-base;
-    .border-bottom-radius(0);
-  }
-  &:last-child:not(:first-child) {
-    border-bottom-left-radius: @border-radius-base;
-    .border-top-radius(0);
-  }
-}
-.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
-  border-radius: 0;
-}
-.btn-group-vertical > .btn-group:first-child:not(:last-child) {
-  > .btn:last-child,
-  > .dropdown-toggle {
-    .border-bottom-radius(0);
-  }
-}
-.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  .border-top-radius(0);
-}
-
-
-
-// Justified button groups
-// ----------------------
-
-.btn-group-justified {
-  display: table;
-  width: 100%;
-  table-layout: fixed;
-  border-collapse: separate;
-  > .btn,
-  > .btn-group {
-    float: none;
-    display: table-cell;
-    width: 1%;
-  }
-  > .btn-group .btn {
-    width: 100%;
-  }
-}
-
-
-// Checkbox and radio options
-[data-toggle="buttons"] > .btn > input[type="radio"],
-[data-toggle="buttons"] > .btn > input[type="checkbox"] {
-  display: none;
-}
diff --git a/src/main/less/buttons.less b/src/main/less/buttons.less
index d4fc156..59ad206 100644
--- a/src/main/less/buttons.less
+++ b/src/main/less/buttons.less
@@ -6,154 +6,6 @@
 // Base styles
 // --------------------------------------------------
 
-.btn {
-  display: inline-block;
-  margin-bottom: 0; // For input.btn
-  font-weight: @btn-font-weight;
-  text-align: center;
-  vertical-align: middle;
-  cursor: pointer;
-  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
-  border: 1px solid transparent;
-  white-space: nowrap;
-  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);
-  .user-select(none);
-
-  &,
-  &:active,
-  &.active {
-    &:focus {
-      .tab-focus();
-    }
-  }
-
-  &:hover,
-  &:focus {
-    color: @btn-default-color;
-    text-decoration: none;
-  }
-
-  &:active,
-  &.active {
-    outline: 0;
-    background-image: none;
-    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
-  }
-
-  &.disabled,
-  &[disabled],
-  fieldset[disabled] & {
-    cursor: not-allowed;
-    pointer-events: none; // Future-proof disabling of clicks
-    .opacity(.65);
-    .box-shadow(none);
-  }
-}
-
-
-// Alternate buttons
-// --------------------------------------------------
-
-.btn-default {
-  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);
-}
-.btn-primary {
-  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);
-}
-// Success appears as green
-.btn-success {
-  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);
-}
-// Info appears as blue-green
-.btn-info {
-  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);
-}
-// Warning appears as orange
-.btn-warning {
-  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);
-}
-// Danger and error appear as red
-.btn-danger {
-  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);
-}
-
-
-// Link buttons
-// -------------------------
-
-// Make a button look and behave like a link
-.btn-link {
-  color: @link-color;
-  font-weight: normal;
-  cursor: pointer;
-  border-radius: 0;
-
-  &,
-  &:active,
-  &[disabled],
-  fieldset[disabled] & {
-    background-color: transparent;
-    .box-shadow(none);
-  }
-  &,
-  &:hover,
-  &:focus,
-  &:active {
-    border-color: transparent;
-  }
-  &:hover,
-  &:focus {
-    color: @link-hover-color;
-    text-decoration: underline;
-    background-color: transparent;
-  }
-  &[disabled],
-  fieldset[disabled] & {
-    &:hover,
-    &:focus {
-      color: @btn-link-disabled-color;
-      text-decoration: none;
-    }
-  }
-}
-
-
-// Button Sizes
-// --------------------------------------------------
-
-.btn-lg {
-  // line-height: ensure even-numbered height of button next to large input
-  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
-}
-.btn-sm {
-  // line-height: ensure proper height of button next to small input
-  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
-}
-.btn-xs {
-  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);
-}
-
-
-// Block button
-// --------------------------------------------------
-
-.btn-block {
-  display: block;
-  width: 100%;
-  padding-left: 0;
-  padding-right: 0;
-}
-
-// Vertically space out multiple block buttons
-.btn-block + .btn-block {
-  margin-top: 5px;
-}
-
-// Specificity overrides
-input[type="submit"],
-input[type="reset"],
-input[type="button"] {
-  &.btn-block {
-    width: 100%;
-  }
+#login_submit {
+	margin: 20px 0px;
 }
diff --git a/src/main/less/carousel.less b/src/main/less/carousel.less
deleted file mode 100644
index e3fb8a2..0000000
--- a/src/main/less/carousel.less
+++ /dev/null
@@ -1,232 +0,0 @@
-//
-// Carousel
-// --------------------------------------------------
-
-
-// Wrapper for the slide container and indicators
-.carousel {
-  position: relative;
-}
-
-.carousel-inner {
-  position: relative;
-  overflow: hidden;
-  width: 100%;
-
-  > .item {
-    display: none;
-    position: relative;
-    .transition(.6s ease-in-out left);
-
-    // Account for jankitude on images
-    > img,
-    > a > img {
-      &:extend(.img-responsive);
-      line-height: 1;
-    }
-  }
-
-  > .active,
-  > .next,
-  > .prev { display: block; }
-
-  > .active {
-    left: 0;
-  }
-
-  > .next,
-  > .prev {
-    position: absolute;
-    top: 0;
-    width: 100%;
-  }
-
-  > .next {
-    left: 100%;
-  }
-  > .prev {
-    left: -100%;
-  }
-  > .next.left,
-  > .prev.right {
-    left: 0;
-  }
-
-  > .active.left {
-    left: -100%;
-  }
-  > .active.right {
-    left: 100%;
-  }
-
-}
-
-// Left/right controls for nav
-// ---------------------------
-
-.carousel-control {
-  position: absolute;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  width: @carousel-control-width;
-  .opacity(@carousel-control-opacity);
-  font-size: @carousel-control-font-size;
-  color: @carousel-control-color;
-  text-align: center;
-  text-shadow: @carousel-text-shadow;
-  // We can't have this transition here because WebKit cancels the carousel
-  // animation if you trip this while in the middle of another animation.
-
-  // Set gradients for backgrounds
-  &.left {
-    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));
-  }
-  &.right {
-    left: auto;
-    right: 0;
-    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));
-  }
-
-  // Hover/focus state
-  &:hover,
-  &:focus {
-    outline: none;
-    color: @carousel-control-color;
-    text-decoration: none;
-    .opacity(.9);
-  }
-
-  // Toggles
-  .icon-prev,
-  .icon-next,
-  .glyphicon-chevron-left,
-  .glyphicon-chevron-right {
-    position: absolute;
-    top: 50%;
-    z-index: 5;
-    display: inline-block;
-  }
-  .icon-prev,
-  .glyphicon-chevron-left {
-    left: 50%;
-  }
-  .icon-next,
-  .glyphicon-chevron-right {
-    right: 50%;
-  }
-  .icon-prev,
-  .icon-next {
-    width:  20px;
-    height: 20px;
-    margin-top: -10px;
-    margin-left: -10px;
-    font-family: serif;
-  }
-
-  .icon-prev {
-    &:before {
-      content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
-    }
-  }
-  .icon-next {
-    &:before {
-      content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
-    }
-  }
-}
-
-// Optional indicator pips
-//
-// Add an unordered list with the following class and add a list item for each
-// slide your carousel holds.
-
-.carousel-indicators {
-  position: absolute;
-  bottom: 10px;
-  left: 50%;
-  z-index: 15;
-  width: 60%;
-  margin-left: -30%;
-  padding-left: 0;
-  list-style: none;
-  text-align: center;
-
-  li {
-    display: inline-block;
-    width:  10px;
-    height: 10px;
-    margin: 1px;
-    text-indent: -999px;
-    border: 1px solid @carousel-indicator-border-color;
-    border-radius: 10px;
-    cursor: pointer;
-
-    // IE8-9 hack for event handling
-    //
-    // Internet Explorer 8-9 does not support clicks on elements without a set
-    // `background-color`. We cannot use `filter` since that's not viewed as a
-    // background color by the browser. Thus, a hack is needed.
-    //
-    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
-    // set alpha transparency for the best results possible.
-    background-color: #000 \9; // IE8
-    background-color: rgba(0,0,0,0); // IE9
-  }
-  .active {
-    margin: 0;
-    width:  12px;
-    height: 12px;
-    background-color: @carousel-indicator-active-bg;
-  }
-}
-
-// Optional captions
-// -----------------------------
-// Hidden by default for smaller viewports
-.carousel-caption {
-  position: absolute;
-  left: 15%;
-  right: 15%;
-  bottom: 20px;
-  z-index: 10;
-  padding-top: 20px;
-  padding-bottom: 20px;
-  color: @carousel-caption-color;
-  text-align: center;
-  text-shadow: @carousel-text-shadow;
-  & .btn {
-    text-shadow: none; // No shadow for button elements in carousel-caption
-  }
-}
-
-
-// Scale up controls for tablets and up
-@media screen and (min-width: @screen-sm-min) {
-
-  // Scale up the controls a smidge
-  .carousel-control {
-    .glyphicon-chevron-left,
-    .glyphicon-chevron-right,
-    .icon-prev,
-    .icon-next {
-      width: 30px;
-      height: 30px;
-      margin-top: -15px;
-      margin-left: -15px;
-      font-size: 30px;
-    }
-  }
-
-  // Show and left align the captions
-  .carousel-caption {
-    left: 20%;
-    right: 20%;
-    padding-bottom: 30px;
-  }
-
-  // Move up the indicators
-  .carousel-indicators {
-    bottom: 20px;
-  }
-}
diff --git a/src/main/less/close.less b/src/main/less/close.less
deleted file mode 100644
index 9b4e74f..0000000
--- a/src/main/less/close.less
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// Close icons
-// --------------------------------------------------
-
-
-.close {
-  float: right;
-  font-size: (@font-size-base * 1.5);
-  font-weight: @close-font-weight;
-  line-height: 1;
-  color: @close-color;
-  text-shadow: @close-text-shadow;
-  .opacity(.2);
-
-  &:hover,
-  &:focus {
-    color: @close-color;
-    text-decoration: none;
-    cursor: pointer;
-    .opacity(.5);
-  }
-
-  // Additional properties for button version
-  // iOS requires the button element instead of an anchor tag.
-  // If you want the anchor version, it requires `href="#"`.
-  button& {
-    padding: 0;
-    cursor: pointer;
-    background: transparent;
-    border: 0;
-    -webkit-appearance: none;
-  }
-}
diff --git a/src/main/less/code.less b/src/main/less/code.less
deleted file mode 100644
index 3eed26c..0000000
--- a/src/main/less/code.less
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// Code (inline and block)
-// --------------------------------------------------
-
-
-// Inline and block code styles
-code,
-kbd,
-pre,
-samp {
-  font-family: @font-family-monospace;
-}
-
-// Inline code
-code {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: @code-color;
-  background-color: @code-bg;
-  white-space: nowrap;
-  border-radius: @border-radius-base;
-}
-
-// User input typically entered via keyboard
-kbd {
-  padding: 2px 4px;
-  font-size: 90%;
-  color: @kbd-color;
-  background-color: @kbd-bg;
-  border-radius: @border-radius-small;
-  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
-}
-
-// Blocks of code
-pre {
-  display: block;
-  padding: ((@line-height-computed - 1) / 2);
-  margin: 0 0 (@line-height-computed / 2);
-  font-size: (@font-size-base - 1); // 14px to 13px
-  line-height: @line-height-base;
-  word-break: break-all;
-  word-wrap: break-word;
-  color: @pre-color;
-  background-color: @pre-bg;
-  border: 1px solid @pre-border-color;
-  border-radius: @border-radius-base;
-
-  // Account for some code outputs that place code tags in pre tags
-  code {
-    padding: 0;
-    font-size: inherit;
-    color: inherit;
-    white-space: pre-wrap;
-    background-color: transparent;
-    border-radius: 0;
-  }
-}
-
-// Enable scrollable blocks of code
-.pre-scrollable {
-  max-height: @pre-scrollable-max-height;
-  overflow-y: scroll;
-}
diff --git a/src/main/less/component-animations.less b/src/main/less/component-animations.less
deleted file mode 100644
index 1efe45e..0000000
--- a/src/main/less/component-animations.less
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Component animations
-// --------------------------------------------------
-
-// Heads up!
-//
-// We don't use the `.opacity()` mixin here since it causes a bug with text
-// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.
-
-.fade {
-  opacity: 0;
-  .transition(opacity .15s linear);
-  &.in {
-    opacity: 1;
-  }
-}
-
-.collapse {
-  display: none;
-  &.in {
-    display: block;
-  }
-}
-.collapsing {
-  position: relative;
-  height: 0;
-  overflow: hidden;
-  .transition(height .35s ease);
-}
diff --git a/src/main/less/dropdowns.less b/src/main/less/dropdowns.less
deleted file mode 100644
index f165165..0000000
--- a/src/main/less/dropdowns.less
+++ /dev/null
@@ -1,213 +0,0 @@
-//
-// Dropdown menus
-// --------------------------------------------------
-
-
-// Dropdown arrow/caret
-.caret {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  margin-left: 2px;
-  vertical-align: middle;
-  border-top:   @caret-width-base solid;
-  border-right: @caret-width-base solid transparent;
-  border-left:  @caret-width-base solid transparent;
-}
-
-// The dropdown wrapper (div)
-.dropdown {
-  position: relative;
-}
-
-// Prevent the focus on the dropdown toggle when closing dropdowns
-.dropdown-toggle:focus {
-  outline: 0;
-}
-
-// The dropdown menu (ul)
-.dropdown-menu {
-  position: absolute;
-  top: 100%;
-  left: 0;
-  z-index: @zindex-dropdown;
-  display: none; // none by default, but block on "open" of the menu
-  float: left;
-  min-width: 160px;
-  padding: 5px 0;
-  margin: 2px 0 0; // override default ul
-  list-style: none;
-  font-size: @font-size-base;
-  background-color: @dropdown-bg;
-  border: 1px solid @dropdown-fallback-border; // IE8 fallback
-  border: 1px solid @dropdown-border;
-  border-radius: @border-radius-base;
-  .box-shadow(0 6px 12px rgba(0,0,0,.175));
-  background-clip: padding-box;
-
-  // Aligns the dropdown menu to right
-  //
-  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
-  &.pull-right {
-    right: 0;
-    left: auto;
-  }
-
-  // Dividers (basically an hr) within the dropdown
-  .divider {
-    .nav-divider(@dropdown-divider-bg);
-  }
-
-  // Links within the dropdown menu
-  > li > a {
-    display: block;
-    padding: 3px 20px;
-    clear: both;
-    font-weight: normal;
-    line-height: @line-height-base;
-    color: @dropdown-link-color;
-    white-space: nowrap; // prevent links from randomly breaking onto new lines
-  }
-}
-
-// Hover/Focus state
-.dropdown-menu > li > a {
-  &:hover,
-  &:focus {
-    text-decoration: none;
-    color: @dropdown-link-hover-color;
-    background-color: @dropdown-link-hover-bg;
-  }
-}
-
-// Active state
-.dropdown-menu > .active > a {
-  &,
-  &:hover,
-  &:focus {
-    color: @dropdown-link-active-color;
-    text-decoration: none;
-    outline: 0;
-    background-color: @dropdown-link-active-bg;
-  }
-}
-
-// Disabled state
-//
-// Gray out text and ensure the hover/focus state remains gray
-
-.dropdown-menu > .disabled > a {
-  &,
-  &:hover,
-  &:focus {
-    color: @dropdown-link-disabled-color;
-  }
-}
-// Nuke hover/focus effects
-.dropdown-menu > .disabled > a {
-  &:hover,
-  &:focus {
-    text-decoration: none;
-    background-color: transparent;
-    background-image: none; // Remove CSS gradient
-    .reset-filter();
-    cursor: not-allowed;
-  }
-}
-
-// Open state for the dropdown
-.open {
-  // Show the menu
-  > .dropdown-menu {
-    display: block;
-  }
-
-  // Remove the outline when :focus is triggered
-  > a {
-    outline: 0;
-  }
-}
-
-// Menu positioning
-//
-// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
-// menu with the parent.
-.dropdown-menu-right {
-  left: auto; // Reset the default from `.dropdown-menu`
-  right: 0;
-}
-// With v3, we enabled auto-flipping if you have a dropdown within a right
-// aligned nav component. To enable the undoing of that, we provide an override
-// to restore the default dropdown menu alignment.
-//
-// This is only for left-aligning a dropdown menu within a `.navbar-right` or
-// `.pull-right` nav component.
-.dropdown-menu-left {
-  left: 0;
-  right: auto;
-}
-
-// Dropdown section headers
-.dropdown-header {
-  display: block;
-  padding: 3px 20px;
-  font-size: @font-size-small;
-  line-height: @line-height-base;
-  color: @dropdown-header-color;
-}
-
-// Backdrop to catch body clicks on mobile, etc.
-.dropdown-backdrop {
-  position: fixed;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  top: 0;
-  z-index: (@zindex-dropdown - 10);
-}
-
-// Right aligned dropdowns
-.pull-right > .dropdown-menu {
-  right: 0;
-  left: auto;
-}
-
-// Allow for dropdowns to go bottom up (aka, dropup-menu)
-//
-// Just add .dropup after the standard .dropdown class and you're set, bro.
-// TODO: abstract this so that the navbar fixed styles are not placed here?
-
-.dropup,
-.navbar-fixed-bottom .dropdown {
-  // Reverse the caret
-  .caret {
-    border-top: 0;
-    border-bottom: @caret-width-base solid;
-    content: "";
-  }
-  // Different positioning for bottom up menu
-  .dropdown-menu {
-    top: auto;
-    bottom: 100%;
-    margin-bottom: 1px;
-  }
-}
-
-
-// Component alignment
-//
-// Reiterate per navbar.less and the modified component alignment there.
-
-@media (min-width: @grid-float-breakpoint) {
-  .navbar-right {
-    .dropdown-menu {
-      .dropdown-menu-right();
-    }
-    // Necessary for overrides of the default right aligned menu.
-    // Will remove come v4 in all likelihood.
-    .dropdown-menu-left {
-      .dropdown-menu-left();
-    }
-  }
-}
-
diff --git a/src/main/less/reseditor/elements.less b/src/main/less/elements.less
similarity index 100%
rename from src/main/less/reseditor/elements.less
rename to src/main/less/elements.less
diff --git a/src/main/less/forms.less b/src/main/less/forms.less
index f607b85..86e5c90 100644
--- a/src/main/less/forms.less
+++ b/src/main/less/forms.less
@@ -3,436 +3,35 @@
 // --------------------------------------------------
 
 
-// Normalize non-controls
-//
-// Restyle and baseline non-control form elements.
-
-fieldset {
-  padding: 0;
-  margin: 0;
-  border: 0;
-  // Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets,
-  // so we reset that to ensure it behaves more like a standard block element.
-  // See https://github.com/twbs/bootstrap/issues/12359.
-  min-width: 0;
-}
-
-legend {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: @line-height-computed;
-  font-size: (@font-size-base * 1.5);
-  line-height: inherit;
-  color: @legend-color;
-  border: 0;
-  border-bottom: 1px solid @legend-border-color;
-}
-
-label {
-  display: inline-block;
-  margin-bottom: 5px;
-  font-weight: bold;
-}
-
-
-// Normalize form controls
-//
-// While most of our form styles require extra classes, some basic normalization
-// is required to ensure optimum display with or without those classes to better
-// address browser inconsistencies.
-
-// Override content-box in Normalize (* isn't specific enough)
-input[type="search"] {
-  .box-sizing(border-box);
-}
-
-// Position radios and checkboxes better
-input[type="radio"],
-input[type="checkbox"] {
-  margin: 4px 0 0;
-  margin-top: 1px \9; /* IE8-9 */
-  line-height: normal;
-}
-
-// Set the height of file controls to match text inputs
-input[type="file"] {
-  display: block;
-}
+// FORM FIELD FEEDBACK STATES
+// --------------------------
 
-// Make range inputs behave like textual form controls
-input[type="range"] {
-  display: block;
-  width: 100%;
+// Error
+#login .form-group.error {
+  display: none;
 }
 
-// Make multiple select elements height not fixed
-select[multiple],
-select[size] {
-  height: auto;
+.control-label {
+	line-height: 24px;
+	color: #C0C0C0;
+	font-weight: normal;
 }
 
-// Focus for file, radio, and checkbox
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
-  .tab-focus();
+.form-horizontal .form-group {
+	margin-left: 20px;
+	margin-right: 0px;
 }
 
-// Adjust output element
-output {
-  display: block;
-  padding-top: (@padding-base-vertical + 1);
-  font-size: @font-size-base;
-  line-height: @line-height-base;
-  color: @input-color;
-}
-
-
-// Common form controls
-//
-// Shared size and type resets for form controls. Apply `.form-control` to any
-// of the following form controls:
-//
-// select
-// textarea
-// input[type="text"]
-// input[type="password"]
-// input[type="datetime"]
-// input[type="datetime-local"]
-// input[type="date"]
-// input[type="month"]
-// input[type="time"]
-// input[type="week"]
-// input[type="number"]
-// input[type="email"]
-// input[type="url"]
-// input[type="search"]
-// input[type="tel"]
-// input[type="color"]
-
 .form-control {
-  display: block;
-  width: 100%;
-  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
-  padding: @padding-base-vertical @padding-base-horizontal;
-  font-size: @font-size-base;
-  line-height: @line-height-base;
-  color: @input-color;
-  background-color: @input-bg;
-  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
-  border: 1px solid @input-border;
-  border-radius: @input-border-radius;
-  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
-  .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s");
-
-  // Customize the `:focus` state to imitate native WebKit styles.
-  .form-control-focus();
-
-  // Placeholder
-  .placeholder();
-
-  // Disabled and read-only inputs
-  //
-  // HTML5 says that controls under a fieldset > legend:first-child won't be
-  // disabled if the fieldset is disabled. Due to implementation difficulty, we
-  // don't honor that edge case; we style them as disabled anyway.
-  &[disabled],
-  &[readonly],
-  fieldset[disabled] & {
-    cursor: not-allowed;
-    background-color: @input-bg-disabled;
-    opacity: 1; // iOS fix for unreadable disabled content
-  }
-
-  // Reset height for `textarea`s
-  textarea& {
-    height: auto;
-  }
+	height: 27px;
+	padding: 0 10px;
 }
 
-
-// Search inputs in iOS
-//
-// This overrides the extra rounded corners on search inputs in iOS so that our
-// `.form-control` class can properly style them. Note that this cannot simply
-// be added to `.form-control` as it's not specific enough. For details, see
-// https://github.com/twbs/bootstrap/issues/11586.
-
-input[type="search"] {
-  -webkit-appearance: none;
-}
-
-
-// Special styles for iOS date input
-//
-// In Mobile Safari, date inputs require a pixel line-height that matches the
-// given height of the input.
-
-input[type="date"] {
-  line-height: @input-height-base;
-}
-
-
-// Form groups
-//
-// Designed to help with the organization and spacing of vertical forms. For
-// horizontal forms, use the predefined grid classes.
-
 .form-group {
-  margin-bottom: 15px;
-}
-
-
-// Checkboxes and radios
-//
-// Indent the labels to position radios/checkboxes as hanging controls.
-
-.radio,
-.checkbox {
-  display: block;
-  min-height: @line-height-computed; // clear the floating input if there is no label text
-  margin-top: 10px;
-  margin-bottom: 10px;
-  padding-left: 20px;
-  label {
-    display: inline;
-    font-weight: normal;
-    cursor: pointer;
-  }
-}
-.radio input[type="radio"],
-.radio-inline input[type="radio"],
-.checkbox input[type="checkbox"],
-.checkbox-inline input[type="checkbox"] {
-  float: left;
-  margin-left: -20px;
-}
-.radio + .radio,
-.checkbox + .checkbox {
-  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
-}
-
-// Radios and checkboxes on same line
-.radio-inline,
-.checkbox-inline {
-  display: inline-block;
-  padding-left: 20px;
-  margin-bottom: 0;
-  vertical-align: middle;
-  font-weight: normal;
-  cursor: pointer;
-}
-.radio-inline + .radio-inline,
-.checkbox-inline + .checkbox-inline {
-  margin-top: 0;
-  margin-left: 10px; // space out consecutive inline controls
-}
-
-// Apply same disabled cursor tweak as for inputs
-//
-// Note: Neither radios nor checkboxes can be readonly.
-input[type="radio"],
-input[type="checkbox"],
-.radio,
-.radio-inline,
-.checkbox,
-.checkbox-inline {
-  &[disabled],
-  fieldset[disabled] & {
-    cursor: not-allowed;
-  }
-}
-
-
-// Form control sizing
-//
-// Build on `.form-control` with modifier classes to decrease or increase the
-// height and font-size of form controls.
-
-.input-sm {
-  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
-}
-
-.input-lg {
-  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
-}
-
-
-// Form control feedback states
-//
-// Apply contextual and semantic states to individual form controls.
-
-.has-feedback {
-  // Enable absolute positioning
-  position: relative;
-
-  // Ensure icons don't overlap text
-  .form-control {
-    padding-right: (@input-height-base * 1.25);
-  }
-
-  // Feedback icon (requires .glyphicon classes)
-  .form-control-feedback {
-    position: absolute;
-    top: (@line-height-computed + 5); // Height of the `label` and its margin
-    right: 0;
-    display: block;
-    width: @input-height-base;
-    height: @input-height-base;
-    line-height: @input-height-base;
-    text-align: center;
-  }
-}
-
-// Feedback states
-.has-success {
-  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);
+	margin-bottom: 0;
 }
-.has-warning {
-  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);
-}
-.has-error {
-  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);
-}
-
 
-// Static form control text
-//
-// Apply class to a `p` element to make any string of text align with labels in
-// a horizontal form layout.
-
-.form-control-static {
-  margin-bottom: 0; // Remove default margin from `p`
-}
-
-
-// Help text
-//
-// Apply to any element you wish to create light text for placement immediately
-// below a form control. Use for general help, formatting, or instructional text.
-
-.help-block {
-  display: block; // account for any element using help-block
-  margin-top: 5px;
-  margin-bottom: 10px;
-  color: lighten(@text-color, 25%); // lighten the text some for contrast
-}
-
-
-
-// Inline forms
-//
-// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
-// forms begin stacked on extra small (mobile) devices and then go inline when
-// viewports reach <768px.
-//
-// Requires wrapping inputs and labels with `.form-group` for proper display of
-// default HTML form controls and our custom form controls (e.g., input groups).
-//
-// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
-
-.form-inline {
-
-  // Kick in the inline
-  @media (min-width: @screen-sm-min) {
-    // Inline-block all the things for "inline"
-    .form-group {
-      display: inline-block;
-      margin-bottom: 0;
-      vertical-align: middle;
-    }
-
-    // In navbar-form, allow folks to *not* use `.form-group`
-    .form-control {
-      display: inline-block;
-      width: auto; // Prevent labels from stacking above inputs in `.form-group`
-      vertical-align: middle;
-    }
-    // Input groups need that 100% width though
-    .input-group > .form-control {
-      width: 100%;
-    }
-
-    .control-label {
-      margin-bottom: 0;
-      vertical-align: middle;
-    }
-
-    // Remove default margin on radios/checkboxes that were used for stacking, and
-    // then undo the floating of radios and checkboxes to match (which also avoids
-    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).
-    .radio,
-    .checkbox {
-      display: inline-block;
-      margin-top: 0;
-      margin-bottom: 0;
-      padding-left: 0;
-      vertical-align: middle;
-    }
-    .radio input[type="radio"],
-    .checkbox input[type="checkbox"] {
-      float: none;
-      margin-left: 0;
-    }
-
-    // Validation states
-    //
-    // Reposition the icon because it's now within a grid column and columns have
-    // `position: relative;` on them. Also accounts for the grid gutter padding.
-    .has-feedback .form-control-feedback {
-      top: 0;
-    }
-  }
-}
-
-
-// Horizontal forms
-//
-// Horizontal forms are built on grid classes and allow you to create forms with
-// labels on the left and inputs on the right.
-
-.form-horizontal {
-
-  // Consistent vertical alignment of labels, radios, and checkboxes
-  .control-label,
-  .radio,
-  .checkbox,
-  .radio-inline,
-  .checkbox-inline {
-    margin-top: 0;
-    margin-bottom: 0;
-    padding-top: (@padding-base-vertical + 1); // Default padding plus a border
-  }
-  // Account for padding we're adding to ensure the alignment and of help text
-  // and other content below items
-  .radio,
-  .checkbox {
-    min-height: (@line-height-computed + (@padding-base-vertical + 1));
-  }
-
-  // Make form groups behave like rows
-  .form-group {
-    .make-row();
-  }
-
-  .form-control-static {
-    padding-top: (@padding-base-vertical + 1);
-  }
-
-  // Only right align form labels here when the columns stop stacking
-  @media (min-width: @screen-sm-min) {
-    .control-label {
-      text-align: right;
-    }
-  }
-
-  // Validation states
-  //
-  // Reposition the icon because it's now within a grid column and columns have
-  // `position: relative;` on them. Also accounts for the grid gutter padding.
-  .has-feedback .form-control-feedback {
-    top: 0;
-    right: (@grid-gutter-width / 2);
-  }
-}
+// vertical-form is a custom class
+.modal-body.vertical-form label {
+	display: block;
+}
\ No newline at end of file
diff --git a/src/main/less/glyphicons.less b/src/main/less/glyphicons.less
deleted file mode 100644
index 789c5e7..0000000
--- a/src/main/less/glyphicons.less
+++ /dev/null
@@ -1,233 +0,0 @@
-//
-// Glyphicons for Bootstrap
-//
-// Since icons are fonts, they can be placed anywhere text is placed and are
-// thus automatically sized to match the surrounding child. To use, create an
-// inline element with the appropriate classes, like so:
-//
-// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
-
-// Import the fonts
-@font-face {
-  font-family: 'Glyphicons Halflings';
-  src: ~"url('@{icon-font-path}@{icon-font-name}.eot')";
-  src: ~"url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype')",
-       ~"url('@{icon-font-path}@{icon-font-name}.woff') format('woff')",
-       ~"url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype')",
-       ~"url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg')";
-}
-
-// Catchall baseclass
-.glyphicon {
-  position: relative;
-  top: 1px;
-  display: inline-block;
-  font-family: 'Glyphicons Halflings';
-  font-style: normal;
-  font-weight: normal;
-  line-height: 1;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-// Individual icons
-.glyphicon-asterisk               { &:before { content: "\2a"; } }
-.glyphicon-plus                   { &:before { content: "\2b"; } }
-.glyphicon-euro                   { &:before { content: "\20ac"; } }
-.glyphicon-minus                  { &:before { content: "\2212"; } }
-.glyphicon-cloud                  { &:before { content: "\2601"; } }
-.glyphicon-envelope               { &:before { content: "\2709"; } }
-.glyphicon-pencil                 { &:before { content: "\270f"; } }
-.glyphicon-glass                  { &:before { content: "\e001"; } }
-.glyphicon-music                  { &:before { content: "\e002"; } }
-.glyphicon-search                 { &:before { content: "\e003"; } }
-.glyphicon-heart                  { &:before { content: "\e005"; } }
-.glyphicon-star                   { &:before { content: "\e006"; } }
-.glyphicon-star-empty             { &:before { content: "\e007"; } }
-.glyphicon-user                   { &:before { content: "\e008"; } }
-.glyphicon-film                   { &:before { content: "\e009"; } }
-.glyphicon-th-large               { &:before { content: "\e010"; } }
-.glyphicon-th                     { &:before { content: "\e011"; } }
-.glyphicon-th-list                { &:before { content: "\e012"; } }
-.glyphicon-ok                     { &:before { content: "\e013"; } }
-.glyphicon-remove                 { &:before { content: "\e014"; } }
-.glyphicon-zoom-in                { &:before { content: "\e015"; } }
-.glyphicon-zoom-out               { &:before { content: "\e016"; } }
-.glyphicon-off                    { &:before { content: "\e017"; } }
-.glyphicon-signal                 { &:before { content: "\e018"; } }
-.glyphicon-cog                    { &:before { content: "\e019"; } }
-.glyphicon-trash                  { &:before { content: "\e020"; } }
-.glyphicon-home                   { &:before { content: "\e021"; } }
-.glyphicon-file                   { &:before { content: "\e022"; } }
-.glyphicon-time                   { &:before { content: "\e023"; } }
-.glyphicon-road                   { &:before { content: "\e024"; } }
-.glyphicon-download-alt           { &:before { content: "\e025"; } }
-.glyphicon-download               { &:before { content: "\e026"; } }
-.glyphicon-upload                 { &:before { content: "\e027"; } }
-.glyphicon-inbox                  { &:before { content: "\e028"; } }
-.glyphicon-play-circle            { &:before { content: "\e029"; } }
-.glyphicon-repeat                 { &:before { content: "\e030"; } }
-.glyphicon-refresh                { &:before { content: "\e031"; } }
-.glyphicon-list-alt               { &:before { content: "\e032"; } }
-.glyphicon-lock                   { &:before { content: "\e033"; } }
-.glyphicon-flag                   { &:before { content: "\e034"; } }
-.glyphicon-headphones             { &:before { content: "\e035"; } }
-.glyphicon-volume-off             { &:before { content: "\e036"; } }
-.glyphicon-volume-down            { &:before { content: "\e037"; } }
-.glyphicon-volume-up              { &:before { content: "\e038"; } }
-.glyphicon-qrcode                 { &:before { content: "\e039"; } }
-.glyphicon-barcode                { &:before { content: "\e040"; } }
-.glyphicon-tag                    { &:before { content: "\e041"; } }
-.glyphicon-tags                   { &:before { content: "\e042"; } }
-.glyphicon-book                   { &:before { content: "\e043"; } }
-.glyphicon-bookmark               { &:before { content: "\e044"; } }
-.glyphicon-print                  { &:before { content: "\e045"; } }
-.glyphicon-camera                 { &:before { content: "\e046"; } }
-.glyphicon-font                   { &:before { content: "\e047"; } }
-.glyphicon-bold                   { &:before { content: "\e048"; } }
-.glyphicon-italic                 { &:before { content: "\e049"; } }
-.glyphicon-text-height            { &:before { content: "\e050"; } }
-.glyphicon-text-width             { &:before { content: "\e051"; } }
-.glyphicon-align-left             { &:before { content: "\e052"; } }
-.glyphicon-align-center           { &:before { content: "\e053"; } }
-.glyphicon-align-right            { &:before { content: "\e054"; } }
-.glyphicon-align-justify          { &:before { content: "\e055"; } }
-.glyphicon-list                   { &:before { content: "\e056"; } }
-.glyphicon-indent-left            { &:before { content: "\e057"; } }
-.glyphicon-indent-right           { &:before { content: "\e058"; } }
-.glyphicon-facetime-video         { &:before { content: "\e059"; } }
-.glyphicon-picture                { &:before { content: "\e060"; } }
-.glyphicon-map-marker             { &:before { content: "\e062"; } }
-.glyphicon-adjust                 { &:before { content: "\e063"; } }
-.glyphicon-tint                   { &:before { content: "\e064"; } }
-.glyphicon-edit                   { &:before { content: "\e065"; } }
-.glyphicon-share                  { &:before { content: "\e066"; } }
-.glyphicon-check                  { &:before { content: "\e067"; } }
-.glyphicon-move                   { &:before { content: "\e068"; } }
-.glyphicon-step-backward          { &:before { content: "\e069"; } }
-.glyphicon-fast-backward          { &:before { content: "\e070"; } }
-.glyphicon-backward               { &:before { content: "\e071"; } }
-.glyphicon-play                   { &:before { content: "\e072"; } }
-.glyphicon-pause                  { &:before { content: "\e073"; } }
-.glyphicon-stop                   { &:before { content: "\e074"; } }
-.glyphicon-forward                { &:before { content: "\e075"; } }
-.glyphicon-fast-forward           { &:before { content: "\e076"; } }
-.glyphicon-step-forward           { &:before { content: "\e077"; } }
-.glyphicon-eject                  { &:before { content: "\e078"; } }
-.glyphicon-chevron-left           { &:before { content: "\e079"; } }
-.glyphicon-chevron-right          { &:before { content: "\e080"; } }
-.glyphicon-plus-sign              { &:before { content: "\e081"; } }
-.glyphicon-minus-sign             { &:before { content: "\e082"; } }
-.glyphicon-remove-sign            { &:before { content: "\e083"; } }
-.glyphicon-ok-sign                { &:before { content: "\e084"; } }
-.glyphicon-question-sign          { &:before { content: "\e085"; } }
-.glyphicon-info-sign              { &:before { content: "\e086"; } }
-.glyphicon-screenshot             { &:before { content: "\e087"; } }
-.glyphicon-remove-circle          { &:before { content: "\e088"; } }
-.glyphicon-ok-circle              { &:before { content: "\e089"; } }
-.glyphicon-ban-circle             { &:before { content: "\e090"; } }
-.glyphicon-arrow-left             { &:before { content: "\e091"; } }
-.glyphicon-arrow-right            { &:before { content: "\e092"; } }
-.glyphicon-arrow-up               { &:before { content: "\e093"; } }
-.glyphicon-arrow-down             { &:before { content: "\e094"; } }
-.glyphicon-share-alt              { &:before { content: "\e095"; } }
-.glyphicon-resize-full            { &:before { content: "\e096"; } }
-.glyphicon-resize-small           { &:before { content: "\e097"; } }
-.glyphicon-exclamation-sign       { &:before { content: "\e101"; } }
-.glyphicon-gift                   { &:before { content: "\e102"; } }
-.glyphicon-leaf                   { &:before { content: "\e103"; } }
-.glyphicon-fire                   { &:before { content: "\e104"; } }
-.glyphicon-eye-open               { &:before { content: "\e105"; } }
-.glyphicon-eye-close              { &:before { content: "\e106"; } }
-.glyphicon-warning-sign           { &:before { content: "\e107"; } }
-.glyphicon-plane                  { &:before { content: "\e108"; } }
-.glyphicon-calendar               { &:before { content: "\e109"; } }
-.glyphicon-random                 { &:before { content: "\e110"; } }
-.glyphicon-comment                { &:before { content: "\e111"; } }
-.glyphicon-magnet                 { &:before { content: "\e112"; } }
-.glyphicon-chevron-up             { &:before { content: "\e113"; } }
-.glyphicon-chevron-down           { &:before { content: "\e114"; } }
-.glyphicon-retweet                { &:before { content: "\e115"; } }
-.glyphicon-shopping-cart          { &:before { content: "\e116"; } }
-.glyphicon-folder-close           { &:before { content: "\e117"; } }
-.glyphicon-folder-open            { &:before { content: "\e118"; } }
-.glyphicon-resize-vertical        { &:before { content: "\e119"; } }
-.glyphicon-resize-horizontal      { &:before { content: "\e120"; } }
-.glyphicon-hdd                    { &:before { content: "\e121"; } }
-.glyphicon-bullhorn               { &:before { content: "\e122"; } }
-.glyphicon-bell                   { &:before { content: "\e123"; } }
-.glyphicon-certificate            { &:before { content: "\e124"; } }
-.glyphicon-thumbs-up              { &:before { content: "\e125"; } }
-.glyphicon-thumbs-down            { &:before { content: "\e126"; } }
-.glyphicon-hand-right             { &:before { content: "\e127"; } }
-.glyphicon-hand-left              { &:before { content: "\e128"; } }
-.glyphicon-hand-up                { &:before { content: "\e129"; } }
-.glyphicon-hand-down              { &:before { content: "\e130"; } }
-.glyphicon-circle-arrow-right     { &:before { content: "\e131"; } }
-.glyphicon-circle-arrow-left      { &:before { content: "\e132"; } }
-.glyphicon-circle-arrow-up        { &:before { content: "\e133"; } }
-.glyphicon-circle-arrow-down      { &:before { content: "\e134"; } }
-.glyphicon-globe                  { &:before { content: "\e135"; } }
-.glyphicon-wrench                 { &:before { content: "\e136"; } }
-.glyphicon-tasks                  { &:before { content: "\e137"; } }
-.glyphicon-filter                 { &:before { content: "\e138"; } }
-.glyphicon-briefcase              { &:before { content: "\e139"; } }
-.glyphicon-fullscreen             { &:before { content: "\e140"; } }
-.glyphicon-dashboard              { &:before { content: "\e141"; } }
-.glyphicon-paperclip              { &:before { content: "\e142"; } }
-.glyphicon-heart-empty            { &:before { content: "\e143"; } }
-.glyphicon-link                   { &:before { content: "\e144"; } }
-.glyphicon-phone                  { &:before { content: "\e145"; } }
-.glyphicon-pushpin                { &:before { content: "\e146"; } }
-.glyphicon-usd                    { &:before { content: "\e148"; } }
-.glyphicon-gbp                    { &:before { content: "\e149"; } }
-.glyphicon-sort                   { &:before { content: "\e150"; } }
-.glyphicon-sort-by-alphabet       { &:before { content: "\e151"; } }
-.glyphicon-sort-by-alphabet-alt   { &:before { content: "\e152"; } }
-.glyphicon-sort-by-order          { &:before { content: "\e153"; } }
-.glyphicon-sort-by-order-alt      { &:before { content: "\e154"; } }
-.glyphicon-sort-by-attributes     { &:before { content: "\e155"; } }
-.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
-.glyphicon-unchecked              { &:before { content: "\e157"; } }
-.glyphicon-expand                 { &:before { content: "\e158"; } }
-.glyphicon-collapse-down          { &:before { content: "\e159"; } }
-.glyphicon-collapse-up            { &:before { content: "\e160"; } }
-.glyphicon-log-in                 { &:before { content: "\e161"; } }
-.glyphicon-flash                  { &:before { content: "\e162"; } }
-.glyphicon-log-out                { &:before { content: "\e163"; } }
-.glyphicon-new-window             { &:before { content: "\e164"; } }
-.glyphicon-record                 { &:before { content: "\e165"; } }
-.glyphicon-save                   { &:before { content: "\e166"; } }
-.glyphicon-open                   { &:before { content: "\e167"; } }
-.glyphicon-saved                  { &:before { content: "\e168"; } }
-.glyphicon-import                 { &:before { content: "\e169"; } }
-.glyphicon-export                 { &:before { content: "\e170"; } }
-.glyphicon-send                   { &:before { content: "\e171"; } }
-.glyphicon-floppy-disk            { &:before { content: "\e172"; } }
-.glyphicon-floppy-saved           { &:before { content: "\e173"; } }
-.glyphicon-floppy-remove          { &:before { content: "\e174"; } }
-.glyphicon-floppy-save            { &:before { content: "\e175"; } }
-.glyphicon-floppy-open            { &:before { content: "\e176"; } }
-.glyphicon-credit-card            { &:before { content: "\e177"; } }
-.glyphicon-transfer               { &:before { content: "\e178"; } }
-.glyphicon-cutlery                { &:before { content: "\e179"; } }
-.glyphicon-header                 { &:before { content: "\e180"; } }
-.glyphicon-compressed             { &:before { content: "\e181"; } }
-.glyphicon-earphone               { &:before { content: "\e182"; } }
-.glyphicon-phone-alt              { &:before { content: "\e183"; } }
-.glyphicon-tower                  { &:before { content: "\e184"; } }
-.glyphicon-stats                  { &:before { content: "\e185"; } }
-.glyphicon-sd-video               { &:before { content: "\e186"; } }
-.glyphicon-hd-video               { &:before { content: "\e187"; } }
-.glyphicon-subtitles              { &:before { content: "\e188"; } }
-.glyphicon-sound-stereo           { &:before { content: "\e189"; } }
-.glyphicon-sound-dolby            { &:before { content: "\e190"; } }
-.glyphicon-sound-5-1              { &:before { content: "\e191"; } }
-.glyphicon-sound-6-1              { &:before { content: "\e192"; } }
-.glyphicon-sound-7-1              { &:before { content: "\e193"; } }
-.glyphicon-copyright-mark         { &:before { content: "\e194"; } }
-.glyphicon-registration-mark      { &:before { content: "\e195"; } }
-.glyphicon-cloud-download         { &:before { content: "\e197"; } }
-.glyphicon-cloud-upload           { &:before { content: "\e198"; } }
-.glyphicon-tree-conifer           { &:before { content: "\e199"; } }
-.glyphicon-tree-deciduous         { &:before { content: "\e200"; } }
diff --git a/src/main/less/grid.less b/src/main/less/grid.less
deleted file mode 100644
index e100655..0000000
--- a/src/main/less/grid.less
+++ /dev/null
@@ -1,84 +0,0 @@
-//
-// Grid system
-// --------------------------------------------------
-
-
-// Container widths
-//
-// Set the container width, and override it for fixed navbars in media queries.
-
-.container {
-  .container-fixed();
-
-  @media (min-width: @screen-sm-min) {
-    width: @container-sm;
-  }
-  @media (min-width: @screen-md-min) {
-    width: @container-md;
-  }
-  @media (min-width: @screen-lg-min) {
-    width: @container-lg;
-  }
-}
-
-
-// Fluid container
-//
-// Utilizes the mixin meant for fixed width containers, but without any defined
-// width for fluid, full width layouts.
-
-.container-fluid {
-  .container-fixed();
-}
-
-
-// Row
-//
-// Rows contain and clear the floats of your columns.
-
-.row {
-  .make-row();
-}
-
-
-// Columns
-//
-// Common styles for small and large grid columns
-
-.make-grid-columns();
-
-
-// Extra small grid
-//
-// Columns, offsets, pushes, and pulls for extra small devices like
-// smartphones.
-
-.make-grid(xs);
-
-
-// Small grid
-//
-// Columns, offsets, pushes, and pulls for the small device range, from phones
-// to tablets.
-
-@media (min-width: @screen-sm-min) {
-  .make-grid(sm);
-}
-
-
-// Medium grid
-//
-// Columns, offsets, pushes, and pulls for the desktop device range.
-
-@media (min-width: @screen-md-min) {
-  .make-grid(md);
-}
-
-
-// Large grid
-//
-// Columns, offsets, pushes, and pulls for the large desktop device range.
-
-@media (min-width: @screen-lg-min) {
-  .make-grid(lg);
-}
diff --git a/src/main/less/input-groups.less b/src/main/less/input-groups.less
deleted file mode 100644
index a111474..0000000
--- a/src/main/less/input-groups.less
+++ /dev/null
@@ -1,162 +0,0 @@
-//
-// Input groups
-// --------------------------------------------------
-
-// Base styles
-// -------------------------
-.input-group {
-  position: relative; // For dropdowns
-  display: table;
-  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
-
-  // Undo padding and float of grid classes
-  &[class*="col-"] {
-    float: none;
-    padding-left: 0;
-    padding-right: 0;
-  }
-
-  .form-control {
-    // Ensure that the input is always above the *appended* addon button for
-    // proper border colors.
-    position: relative;
-    z-index: 2;
-
-    // IE9 fubars the placeholder attribute in text inputs and the arrows on
-    // select elements in input groups. To fix it, we float the input. Details:
-    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855
-    float: left;
-
-    width: 100%;
-    margin-bottom: 0;
-  }
-}
-
-// Sizing options
-//
-// Remix the default form control sizing classes into new ones for easier
-// manipulation.
-
-.input-group-lg > .form-control,
-.input-group-lg > .input-group-addon,
-.input-group-lg > .input-group-btn > .btn { .input-lg(); }
-.input-group-sm > .form-control,
-.input-group-sm > .input-group-addon,
-.input-group-sm > .input-group-btn > .btn { .input-sm(); }
-
-
-// Display as table-cell
-// -------------------------
-.input-group-addon,
-.input-group-btn,
-.input-group .form-control {
-  display: table-cell;
-
-  &:not(:first-child):not(:last-child) {
-    border-radius: 0;
-  }
-}
-// Addon and addon wrapper for buttons
-.input-group-addon,
-.input-group-btn {
-  width: 1%;
-  white-space: nowrap;
-  vertical-align: middle; // Match the inputs
-}
-
-// Text input groups
-// -------------------------
-.input-group-addon {
-  padding: @padding-base-vertical @padding-base-horizontal;
-  font-size: @font-size-base;
-  font-weight: normal;
-  line-height: 1;
-  color: @input-color;
-  text-align: center;
-  background-color: @input-group-addon-bg;
-  border: 1px solid @input-group-addon-border-color;
-  border-radius: @border-radius-base;
-
-  // Sizing
-  &.input-sm {
-    padding: @padding-small-vertical @padding-small-horizontal;
-    font-size: @font-size-small;
-    border-radius: @border-radius-small;
-  }
-  &.input-lg {
-    padding: @padding-large-vertical @padding-large-horizontal;
-    font-size: @font-size-large;
-    border-radius: @border-radius-large;
-  }
-
-  // Nuke default margins from checkboxes and radios to vertically center within.
-  input[type="radio"],
-  input[type="checkbox"] {
-    margin-top: 0;
-  }
-}
-
-// Reset rounded corners
-.input-group .form-control:first-child,
-.input-group-addon:first-child,
-.input-group-btn:first-child > .btn,
-.input-group-btn:first-child > .btn-group > .btn,
-.input-group-btn:first-child > .dropdown-toggle,
-.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
-  .border-right-radius(0);
-}
-.input-group-addon:first-child {
-  border-right: 0;
-}
-.input-group .form-control:last-child,
-.input-group-addon:last-child,
-.input-group-btn:last-child > .btn,
-.input-group-btn:last-child > .btn-group > .btn,
-.input-group-btn:last-child > .dropdown-toggle,
-.input-group-btn:first-child > .btn:not(:first-child),
-.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
-  .border-left-radius(0);
-}
-.input-group-addon:last-child {
-  border-left: 0;
-}
-
-// Button input groups
-// -------------------------
-.input-group-btn {
-  position: relative;
-  // Jankily prevent input button groups from wrapping with `white-space` and
-  // `font-size` in combination with `inline-block` on buttons.
-  font-size: 0;
-  white-space: nowrap;
-
-  // Negative margin for spacing, position for bringing hovered/focused/actived
-  // element above the siblings.
-  > .btn {
-    position: relative;
-    + .btn {
-      margin-left: -1px;
-    }
-    // Bring the "active" button to the front
-    &:hover,
-    &:focus,
-    &:active {
-      z-index: 2;
-    }
-  }
-
-  // Negative margin to only have a 1px border between the two
-  &:first-child {
-    > .btn,
-    > .btn-group {
-      margin-right: -1px;
-    }
-  }
-  &:last-child {
-    > .btn,
-    > .btn-group {
-      margin-left: -1px;
-    }
-  }
-}
diff --git a/src/main/less/jumbotron.less b/src/main/less/jumbotron.less
deleted file mode 100644
index a15e169..0000000
--- a/src/main/less/jumbotron.less
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-// Jumbotron
-// --------------------------------------------------
-
-
-.jumbotron {
-  padding: @jumbotron-padding;
-  margin-bottom: @jumbotron-padding;
-  color: @jumbotron-color;
-  background-color: @jumbotron-bg;
-
-  h1,
-  .h1 {
-    color: @jumbotron-heading-color;
-  }
-  p {
-    margin-bottom: (@jumbotron-padding / 2);
-    font-size: @jumbotron-font-size;
-    font-weight: 200;
-  }
-
-  .container & {
-    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container
-  }
-
-  .container {
-    max-width: 100%;
-  }
-
-  @media screen and (min-width: @screen-sm-min) {
-    padding-top:    (@jumbotron-padding * 1.6);
-    padding-bottom: (@jumbotron-padding * 1.6);
-
-    .container & {
-      padding-left:  (@jumbotron-padding * 2);
-      padding-right: (@jumbotron-padding * 2);
-    }
-
-    h1,
-    .h1 {
-      font-size: (@font-size-base * 4.5);
-    }
-  }
-}
diff --git a/src/main/less/labels.less b/src/main/less/labels.less
deleted file mode 100644
index 5db1ed1..0000000
--- a/src/main/less/labels.less
+++ /dev/null
@@ -1,64 +0,0 @@
-//
-// Labels
-// --------------------------------------------------
-
-.label {
-  display: inline;
-  padding: .2em .6em .3em;
-  font-size: 75%;
-  font-weight: bold;
-  line-height: 1;
-  color: @label-color;
-  text-align: center;
-  white-space: nowrap;
-  vertical-align: baseline;
-  border-radius: .25em;
-
-  // Add hover effects, but only for links
-  &[href] {
-    &:hover,
-    &:focus {
-      color: @label-link-hover-color;
-      text-decoration: none;
-      cursor: pointer;
-    }
-  }
-
-  // Empty labels collapse automatically (not available in IE8)
-  &:empty {
-    display: none;
-  }
-
-  // Quick fix for labels in buttons
-  .btn & {
-    position: relative;
-    top: -1px;
-  }
-}
-
-// Colors
-// Contextual variations (linked labels get darker on :hover)
-
-.label-default {
-  .label-variant(@label-default-bg);
-}
-
-.label-primary {
-  .label-variant(@label-primary-bg);
-}
-
-.label-success {
-  .label-variant(@label-success-bg);
-}
-
-.label-info {
-  .label-variant(@label-info-bg);
-}
-
-.label-warning {
-  .label-variant(@label-warning-bg);
-}
-
-.label-danger {
-  .label-variant(@label-danger-bg);
-}
diff --git a/src/main/less/list-group.less b/src/main/less/list-group.less
deleted file mode 100644
index 3343f8e..0000000
--- a/src/main/less/list-group.less
+++ /dev/null
@@ -1,110 +0,0 @@
-//
-// List groups
-// --------------------------------------------------
-
-
-// Base class
-//
-// Easily usable on <ul>, <ol>, or <div>.
-
-.list-group {
-  // No need to set list-style: none; since .list-group-item is block level
-  margin-bottom: 20px;
-  padding-left: 0; // reset padding because ul and ol
-}
-
-
-// Individual list items
-//
-// Use on `li`s or `div`s within the `.list-group` parent.
-
-.list-group-item {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  // Place the border on the list items and negative margin up for better styling
-  margin-bottom: -1px;
-  background-color: @list-group-bg;
-  border: 1px solid @list-group-border;
-
-  // Round the first and last items
-  &:first-child {
-    .border-top-radius(@list-group-border-radius);
-  }
-  &:last-child {
-    margin-bottom: 0;
-    .border-bottom-radius(@list-group-border-radius);
-  }
-
-  // Align badges within list items
-  > .badge {
-    float: right;
-  }
-  > .badge + .badge {
-    margin-right: 5px;
-  }
-}
-
-
-// Linked list items
-//
-// Use anchor elements instead of `li`s or `div`s to create linked list items.
-// Includes an extra `.active` modifier class for showing selected items.
-
-a.list-group-item {
-  color: @list-group-link-color;
-
-  .list-group-item-heading {
-    color: @list-group-link-heading-color;
-  }
-
-  // Hover state
-  &:hover,
-  &:focus {
-    text-decoration: none;
-    background-color: @list-group-hover-bg;
-  }
-
-  // Active class on item itself, not parent
-  &.active,
-  &.active:hover,
-  &.active:focus {
-    z-index: 2; // Place active items above their siblings for proper border styling
-    color: @list-group-active-color;
-    background-color: @list-group-active-bg;
-    border-color: @list-group-active-border;
-
-    // Force color to inherit for custom content
-    .list-group-item-heading {
-      color: inherit;
-    }
-    .list-group-item-text {
-      color: @list-group-active-text-color;
-    }
-  }
-}
-
-
-// Contextual variants
-//
-// Add modifier classes to change text and background color on individual items.
-// Organizationally, this must come after the `:hover` states.
-
-.list-group-item-variant(success; @state-success-bg; @state-success-text);
-.list-group-item-variant(info; @state-info-bg; @state-info-text);
-.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);
-.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);
-
-
-// Custom content options
-//
-// Extra classes for creating well-formatted content within `.list-group-item`s.
-
-.list-group-item-heading {
-  margin-top: 0;
-  margin-bottom: 5px;
-}
-.list-group-item-text {
-  margin-bottom: 0;
-  line-height: 1.3;
-}
diff --git a/src/main/less/media.less b/src/main/less/media.less
deleted file mode 100644
index 5ad22cd..0000000
--- a/src/main/less/media.less
+++ /dev/null
@@ -1,56 +0,0 @@
-// Media objects
-// Source: http://stubbornella.org/content/?p=497
-// --------------------------------------------------
-
-
-// Common styles
-// -------------------------
-
-// Clear the floats
-.media,
-.media-body {
-  overflow: hidden;
-  zoom: 1;
-}
-
-// Proper spacing between instances of .media
-.media,
-.media .media {
-  margin-top: 15px;
-}
-.media:first-child {
-  margin-top: 0;
-}
-
-// For images and videos, set to block
-.media-object {
-  display: block;
-}
-
-// Reset margins on headings for tighter default spacing
-.media-heading {
-  margin: 0 0 5px;
-}
-
-
-// Media image alignment
-// -------------------------
-
-.media {
-  > .pull-left {
-    margin-right: 10px;
-  }
-  > .pull-right {
-    margin-left: 10px;
-  }
-}
-
-
-// Media list variation
-// -------------------------
-
-// Undo default ul/ol styles
-.media-list {
-  padding-left: 0;
-  list-style: none;
-}
diff --git a/src/main/less/mixins.less b/src/main/less/mixins.less
deleted file mode 100644
index 71723db..0000000
--- a/src/main/less/mixins.less
+++ /dev/null
@@ -1,929 +0,0 @@
-//
-// Mixins
-// --------------------------------------------------
-
-
-// Utilities
-// -------------------------
-
-// Clearfix
-// Source: http://nicolasgallagher.com/micro-clearfix-hack/
-//
-// For modern browsers
-// 1. The space content is one way to avoid an Opera bug when the
-//    contenteditable attribute is included anywhere else in the document.
-//    Otherwise it causes space to appear at the top and bottom of elements
-//    that are clearfixed.
-// 2. The use of `table` rather than `block` is only necessary if using
-//    `:before` to contain the top-margins of child elements.
-.clearfix() {
-  &:before,
-  &:after {
-    content: " "; // 1
-    display: table; // 2
-  }
-  &:after {
-    clear: both;
-  }
-}
-
-// WebKit-style focus
-.tab-focus() {
-  // Default
-  outline: thin dotted;
-  // WebKit
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-// Center-align a block level element
-.center-block() {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-// Sizing shortcuts
-.size(@width; @height) {
-  width: @width;
-  height: @height;
-}
-.square(@size) {
-  .size(@size; @size);
-}
-
-// Placeholder text
-.placeholder(@color: @input-color-placeholder) {
-  &::-moz-placeholder           { color: @color;   // Firefox
-                                  opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526
-  &:-ms-input-placeholder       { color: @color; } // Internet Explorer 10+
-  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome
-}
-
-// Text overflow
-// Requires inline-block or block for proper styling
-.text-overflow() {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-// CSS image replacement
-//
-// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for
-// mixins being reused as classes with the same name, this doesn't hold up. As
-// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note
-// that we cannot chain the mixins together in Less, so they are repeated.
-//
-// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
-
-// Deprecated as of v3.0.1 (will be removed in v4)
-.hide-text() {
-  font: ~"0/0" a;
-  color: transparent;
-  text-shadow: none;
-  background-color: transparent;
-  border: 0;
-}
-// New mixin to use as of v3.0.1
-.text-hide() {
-  .hide-text();
-}
-
-
-
-// CSS3 PROPERTIES
-// --------------------------------------------------
-
-// Single side border-radius
-.border-top-radius(@radius) {
-  border-top-right-radius: @radius;
-   border-top-left-radius: @radius;
-}
-.border-right-radius(@radius) {
-  border-bottom-right-radius: @radius;
-     border-top-right-radius: @radius;
-}
-.border-bottom-radius(@radius) {
-  border-bottom-right-radius: @radius;
-   border-bottom-left-radius: @radius;
-}
-.border-left-radius(@radius) {
-  border-bottom-left-radius: @radius;
-     border-top-left-radius: @radius;
-}
-
-// Drop shadows
-//
-// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
-//   supported browsers that have box shadow capabilities now support the
-//   standard `box-shadow` property.
-.box-shadow(@shadow) {
-  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1
-          box-shadow: @shadow;
-}
-
-// Transitions
-.transition(@transition) {
-  -webkit-transition: @transition;
-          transition: @transition;
-}
-.transition-property(@transition-property) {
-  -webkit-transition-property: @transition-property;
-          transition-property: @transition-property;
-}
-.transition-delay(@transition-delay) {
-  -webkit-transition-delay: @transition-delay;
-          transition-delay: @transition-delay;
-}
-.transition-duration(@transition-duration) {
-  -webkit-transition-duration: @transition-duration;
-          transition-duration: @transition-duration;
-}
-.transition-transform(@transition) {
-  -webkit-transition: -webkit-transform @transition;
-     -moz-transition: -moz-transform @transition;
-       -o-transition: -o-transform @transition;
-          transition: transform @transition;
-}
-
-// Transformations
-.rotate(@degrees) {
-  -webkit-transform: rotate(@degrees);
-      -ms-transform: rotate(@degrees); // IE9 only
-          transform: rotate(@degrees);
-}
-.scale(@ratio; @ratio-y...) {
-  -webkit-transform: scale(@ratio, @ratio-y);
-      -ms-transform: scale(@ratio, @ratio-y); // IE9 only
-          transform: scale(@ratio, @ratio-y);
-}
-.translate(@x; @y) {
-  -webkit-transform: translate(@x, @y);
-      -ms-transform: translate(@x, @y); // IE9 only
-          transform: translate(@x, @y);
-}
-.skew(@x; @y) {
-  -webkit-transform: skew(@x, @y);
-      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
-          transform: skew(@x, @y);
-}
-.translate3d(@x; @y; @z) {
-  -webkit-transform: translate3d(@x, @y, @z);
-          transform: translate3d(@x, @y, @z);
-}
-
-.rotateX(@degrees) {
-  -webkit-transform: rotateX(@degrees);
-      -ms-transform: rotateX(@degrees); // IE9 only
-          transform: rotateX(@degrees);
-}
-.rotateY(@degrees) {
-  -webkit-transform: rotateY(@degrees);
-      -ms-transform: rotateY(@degrees); // IE9 only
-          transform: rotateY(@degrees);
-}
-.perspective(@perspective) {
-  -webkit-perspective: @perspective;
-     -moz-perspective: @perspective;
-          perspective: @perspective;
-}
-.perspective-origin(@perspective) {
-  -webkit-perspective-origin: @perspective;
-     -moz-perspective-origin: @perspective;
-          perspective-origin: @perspective;
-}
-.transform-origin(@origin) {
-  -webkit-transform-origin: @origin;
-     -moz-transform-origin: @origin;
-      -ms-transform-origin: @origin; // IE9 only
-          transform-origin: @origin;
-}
-
-// Animations
-.animation(@animation) {
-  -webkit-animation: @animation;
-          animation: @animation;
-}
-.animation-name(@name) {
-  -webkit-animation-name: @name;
-          animation-name: @name;
-}
-.animation-duration(@duration) {
-  -webkit-animation-duration: @duration;
-          animation-duration: @duration;
-}
-.animation-timing-function(@timing-function) {
-  -webkit-animation-timing-function: @timing-function;
-          animation-timing-function: @timing-function;
-}
-.animation-delay(@delay) {
-  -webkit-animation-delay: @delay;
-          animation-delay: @delay;
-}
-.animation-iteration-count(@iteration-count) {
-  -webkit-animation-iteration-count: @iteration-count;
-          animation-iteration-count: @iteration-count;
-}
-.animation-direction(@direction) {
-  -webkit-animation-direction: @direction;
-          animation-direction: @direction;
-}
-
-// Backface visibility
-// Prevent browsers from flickering when using CSS 3D transforms.
-// Default value is `visible`, but can be changed to `hidden`
-.backface-visibility(@visibility){
-  -webkit-backface-visibility: @visibility;
-     -moz-backface-visibility: @visibility;
-          backface-visibility: @visibility;
-}
-
-// Box sizing
-.box-sizing(@boxmodel) {
-  -webkit-box-sizing: @boxmodel;
-     -moz-box-sizing: @boxmodel;
-          box-sizing: @boxmodel;
-}
-
-// User select
-// For selecting text on the page
-.user-select(@select) {
-  -webkit-user-select: @select;
-     -moz-user-select: @select;
-      -ms-user-select: @select; // IE10+
-          user-select: @select;
-}
-
-// Resize anything
-.resizable(@direction) {
-  resize: @direction; // Options: horizontal, vertical, both
-  overflow: auto; // Safari fix
-}
-
-// CSS3 Content Columns
-.content-columns(@column-count; @column-gap: @grid-gutter-width) {
-  -webkit-column-count: @column-count;
-     -moz-column-count: @column-count;
-          column-count: @column-count;
-  -webkit-column-gap: @column-gap;
-     -moz-column-gap: @column-gap;
-          column-gap: @column-gap;
-}
-
-// Optional hyphenation
-.hyphens(@mode: auto) {
-  word-wrap: break-word;
-  -webkit-hyphens: @mode;
-     -moz-hyphens: @mode;
-      -ms-hyphens: @mode; // IE10+
-       -o-hyphens: @mode;
-          hyphens: @mode;
-}
-
-// Opacity
-.opacity(@opacity) {
-  opacity: @opacity;
-  // IE8 filter
-  @opacity-ie: (@opacity * 100);
-  filter: ~"alpha(opacity=@{opacity-ie})";
-}
-
-
-
-// GRADIENTS
-// --------------------------------------------------
-
-#gradient {
-
-  // Horizontal gradient, from left to right
-  //
-  // Creates two color stops, start and end, by specifying a color and position for each color stop.
-  // Color stops are not available in IE9 and below.
-  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
-    background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+
-    background-image:  linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
-    background-repeat: repeat-x;
-    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down
-  }
-
-  // Vertical gradient, from top to bottom
-  //
-  // Creates two color stops, start and end, by specifying a color and position for each color stop.
-  // Color stops are not available in IE9 and below.
-  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
-    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+
-    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
-    background-repeat: repeat-x;
-    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down
-  }
-
-  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
-    background-repeat: repeat-x;
-    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+
-    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
-  }
-  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
-    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
-    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);
-    background-repeat: no-repeat;
-    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
-  }
-  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
-    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
-    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
-    background-repeat: no-repeat;
-    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
-  }
-  .radial(@inner-color: #555; @outer-color: #333) {
-    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
-    background-image: radial-gradient(circle, @inner-color, @outer-color);
-    background-repeat: no-repeat;
-  }
-  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {
-    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
-    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
-  }
-}
-
-// Reset filters for IE
-//
-// When you need to remove a gradient background, do not forget to use this to reset
-// the IE filter for IE9 and below.
-.reset-filter() {
-  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
-}
-
-
-
-// Retina images
-//
-// Short retina mixin for setting background-image and -size
-
-.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {
-  background-image: url("@{file-1x}");
-
-  @media
-  only screen and (-webkit-min-device-pixel-ratio: 2),
-  only screen and (   min--moz-device-pixel-ratio: 2),
-  only screen and (     -o-min-device-pixel-ratio: 2/1),
-  only screen and (        min-device-pixel-ratio: 2),
-  only screen and (                min-resolution: 192dpi),
-  only screen and (                min-resolution: 2dppx) {
-    background-image: url("@{file-2x}");
-    background-size: @width-1x @height-1x;
-  }
-}
-
-
-// Responsive image
-//
-// Keep images from scaling beyond the width of their parents.
-
-.img-responsive(@display: block) {
-  display: @display;
-  max-width: 100%; // Part 1: Set a maximum relative to the parent
-  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
-}
-
-
-// COMPONENT MIXINS
-// --------------------------------------------------
-
-// Horizontal dividers
-// -------------------------
-// Dividers (basically an hr) within dropdowns and nav lists
-.nav-divider(@color: #e5e5e5) {
-  height: 1px;
-  margin: ((@line-height-computed / 2) - 1) 0;
-  overflow: hidden;
-  background-color: @color;
-}
-
-// Panels
-// -------------------------
-.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {
-  border-color: @border;
-
-  & > .panel-heading {
-    color: @heading-text-color;
-    background-color: @heading-bg-color;
-    border-color: @heading-border;
-
-    + .panel-collapse .panel-body {
-      border-top-color: @border;
-    }
-  }
-  & > .panel-footer {
-    + .panel-collapse .panel-body {
-      border-bottom-color: @border;
-    }
-  }
-}
-
-// Alerts
-// -------------------------
-.alert-variant(@background; @border; @text-color) {
-  background-color: @background;
-  border-color: @border;
-  color: @text-color;
-
-  hr {
-    border-top-color: darken(@border, 5%);
-  }
-  .alert-link {
-    color: darken(@text-color, 10%);
-  }
-}
-
-// Tables
-// -------------------------
-.table-row-variant(@state; @background) {
-  // Exact selectors below required to override `.table-striped` and prevent
-  // inheritance to nested tables.
-  .table > thead > tr,
-  .table > tbody > tr,
-  .table > tfoot > tr {
-    > td.@{state},
-    > th.@{state},
-    &.@{state} > td,
-    &.@{state} > th {
-      background-color: @background;
-    }
-  }
-
-  // Hover states for `.table-hover`
-  // Note: this is not available for cells or rows within `thead` or `tfoot`.
-  .table-hover > tbody > tr {
-    > td.@{state}:hover,
-    > th.@{state}:hover,
-    &.@{state}:hover > td,
-    &.@{state}:hover > th {
-      background-color: darken(@background, 5%);
-    }
-  }
-}
-
-// List Groups
-// -------------------------
-.list-group-item-variant(@state; @background; @color) {
-  .list-group-item-@{state} {
-    color: @color;
-    background-color: @background;
-
-    a& {
-      color: @color;
-
-      .list-group-item-heading { color: inherit; }
-
-      &:hover,
-      &:focus {
-        color: @color;
-        background-color: darken(@background, 5%);
-      }
-      &.active,
-      &.active:hover,
-      &.active:focus {
-        color: #fff;
-        background-color: @color;
-        border-color: @color;
-      }
-    }
-  }
-}
-
-// Button variants
-// -------------------------
-// Easily pump out default styles, as well as :hover, :focus, :active,
-// and disabled options for all buttons
-.button-variant(@color; @background; @border) {
-  color: @color;
-  background-color: @background;
-  border-color: @border;
-
-  &:hover,
-  &:focus,
-  &:active,
-  &.active,
-  .open .dropdown-toggle& {
-    color: @color;
-    background-color: darken(@background, 8%);
-        border-color: darken(@border, 12%);
-  }
-  &:active,
-  &.active,
-  .open .dropdown-toggle& {
-    background-image: none;
-  }
-  &.disabled,
-  &[disabled],
-  fieldset[disabled] & {
-    &,
-    &:hover,
-    &:focus,
-    &:active,
-    &.active {
-      background-color: @background;
-          border-color: @border;
-    }
-  }
-
-  .badge {
-    color: @background;
-    background-color: @color;
-  }
-}
-
-// Button sizes
-// -------------------------
-.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
-  padding: @padding-vertical @padding-horizontal;
-  font-size: @font-size;
-  line-height: @line-height;
-  border-radius: @border-radius;
-}
-
-// Pagination
-// -------------------------
-.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {
-  > li {
-    > a,
-    > span {
-      padding: @padding-vertical @padding-horizontal;
-      font-size: @font-size;
-    }
-    &:first-child {
-      > a,
-      > span {
-        .border-left-radius(@border-radius);
-      }
-    }
-    &:last-child {
-      > a,
-      > span {
-        .border-right-radius(@border-radius);
-      }
-    }
-  }
-}
-
-// Labels
-// -------------------------
-.label-variant(@color) {
-  background-color: @color;
-  &[href] {
-    &:hover,
-    &:focus {
-      background-color: darken(@color, 10%);
-    }
-  }
-}
-
-// Contextual backgrounds
-// -------------------------
-.bg-variant(@color) {
-  background-color: @color;
-  a&:hover {
-    background-color: darken(@color, 10%);
-  }
-}
-
-// Typography
-// -------------------------
-.text-emphasis-variant(@color) {
-  color: @color;
-  a&:hover {
-    color: darken(@color, 10%);
-  }
-}
-
-// Navbar vertical align
-// -------------------------
-// Vertically center elements in the navbar.
-// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
-.navbar-vertical-align(@element-height) {
-  margin-top: ((@navbar-height - @element-height) / 2);
-  margin-bottom: ((@navbar-height - @element-height) / 2);
-}
-
-// Progress bars
-// -------------------------
-.progress-bar-variant(@color) {
-  background-color: @color;
-  .progress-striped & {
-    #gradient > .striped();
-  }
-}
-
-// Responsive utilities
-// -------------------------
-// More easily include all the states for responsive-utilities.less.
-.responsive-visibility() {
-  display: block !important;
-  table&  { display: table; }
-  tr&     { display: table-row !important; }
-  th&,
-  td&     { display: table-cell !important; }
-}
-
-.responsive-invisibility() {
-  display: none !important;
-}
-
-
-// Grid System
-// -----------
-
-// Centered container element
-.container-fixed() {
-  margin-right: auto;
-  margin-left: auto;
-  padding-left:  (@grid-gutter-width / 2);
-  padding-right: (@grid-gutter-width / 2);
-  &:extend(.clearfix all);
-}
-
-// Creates a wrapper for a series of columns
-.make-row(@gutter: @grid-gutter-width) {
-  margin-left:  (@gutter / -2);
-  margin-right: (@gutter / -2);
-  &:extend(.clearfix all);
-}
-
-// Generate the extra small columns
-.make-xs-column(@columns; @gutter: @grid-gutter-width) {
-  position: relative;
-  float: left;
-  width: percentage((@columns / @grid-columns));
-  min-height: 1px;
-  padding-left:  (@gutter / 2);
-  padding-right: (@gutter / 2);
-}
-.make-xs-column-offset(@columns) {
-  @media (min-width: @screen-xs-min) {
-    margin-left: percentage((@columns / @grid-columns));
-  }
-}
-.make-xs-column-push(@columns) {
-  @media (min-width: @screen-xs-min) {
-    left: percentage((@columns / @grid-columns));
-  }
-}
-.make-xs-column-pull(@columns) {
-  @media (min-width: @screen-xs-min) {
-    right: percentage((@columns / @grid-columns));
-  }
-}
-
-
-// Generate the small columns
-.make-sm-column(@columns; @gutter: @grid-gutter-width) {
-  position: relative;
-  min-height: 1px;
-  padding-left:  (@gutter / 2);
-  padding-right: (@gutter / 2);
-
-  @media (min-width: @screen-sm-min) {
-    float: left;
-    width: percentage((@columns / @grid-columns));
-  }
-}
-.make-sm-column-offset(@columns) {
-  @media (min-width: @screen-sm-min) {
-    margin-left: percentage((@columns / @grid-columns));
-  }
-}
-.make-sm-column-push(@columns) {
-  @media (min-width: @screen-sm-min) {
-    left: percentage((@columns / @grid-columns));
-  }
-}
-.make-sm-column-pull(@columns) {
-  @media (min-width: @screen-sm-min) {
-    right: percentage((@columns / @grid-columns));
-  }
-}
-
-
-// Generate the medium columns
-.make-md-column(@columns; @gutter: @grid-gutter-width) {
-  position: relative;
-  min-height: 1px;
-  padding-left:  (@gutter / 2);
-  padding-right: (@gutter / 2);
-
-  @media (min-width: @screen-md-min) {
-    float: left;
-    width: percentage((@columns / @grid-columns));
-  }
-}
-.make-md-column-offset(@columns) {
-  @media (min-width: @screen-md-min) {
-    margin-left: percentage((@columns / @grid-columns));
-  }
-}
-.make-md-column-push(@columns) {
-  @media (min-width: @screen-md-min) {
-    left: percentage((@columns / @grid-columns));
-  }
-}
-.make-md-column-pull(@columns) {
-  @media (min-width: @screen-md-min) {
-    right: percentage((@columns / @grid-columns));
-  }
-}
-
-
-// Generate the large columns
-.make-lg-column(@columns; @gutter: @grid-gutter-width) {
-  position: relative;
-  min-height: 1px;
-  padding-left:  (@gutter / 2);
-  padding-right: (@gutter / 2);
-
-  @media (min-width: @screen-lg-min) {
-    float: left;
-    width: percentage((@columns / @grid-columns));
-  }
-}
-.make-lg-column-offset(@columns) {
-  @media (min-width: @screen-lg-min) {
-    margin-left: percentage((@columns / @grid-columns));
-  }
-}
-.make-lg-column-push(@columns) {
-  @media (min-width: @screen-lg-min) {
-    left: percentage((@columns / @grid-columns));
-  }
-}
-.make-lg-column-pull(@columns) {
-  @media (min-width: @screen-lg-min) {
-    right: percentage((@columns / @grid-columns));
-  }
-}
-
-
-// Framework grid generation
-//
-// Used only by Bootstrap to generate the correct number of grid classes given
-// any value of `@grid-columns`.
-
-.make-grid-columns() {
-  // Common styles for all sizes of grid columns, widths 1-12
-  .col(@index) when (@index = 1) { // initial
-    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
-    .col((@index + 1), @item);
-  }
-  .col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo
-    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
-    .col((@index + 1), ~"@{list}, @{item}");
-  }
-  .col(@index, @list) when (@index > @grid-columns) { // terminal
-    @{list} {
-      position: relative;
-      // Prevent columns from collapsing when empty
-      min-height: 1px;
-      // Inner gutter via padding
-      padding-left:  (@grid-gutter-width / 2);
-      padding-right: (@grid-gutter-width / 2);
-    }
-  }
-  .col(1); // kickstart it
-}
-
-.float-grid-columns(@class) {
-  .col(@index) when (@index = 1) { // initial
-    @item: ~".col-@{class}-@{index}";
-    .col((@index + 1), @item);
-  }
-  .col(@index, @list) when (@index =< @grid-columns) { // general
-    @item: ~".col-@{class}-@{index}";
-    .col((@index + 1), ~"@{list}, @{item}");
-  }
-  .col(@index, @list) when (@index > @grid-columns) { // terminal
-    @{list} {
-      float: left;
-    }
-  }
-  .col(1); // kickstart it
-}
-
-.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {
-  .col-@{class}-@{index} {
-    width: percentage((@index / @grid-columns));
-  }
-}
-.calc-grid-column(@index, @class, @type) when (@type = push) {
-  .col-@{class}-push-@{index} {
-    left: percentage((@index / @grid-columns));
-  }
-}
-.calc-grid-column(@index, @class, @type) when (@type = pull) {
-  .col-@{class}-pull-@{index} {
-    right: percentage((@index / @grid-columns));
-  }
-}
-.calc-grid-column(@index, @class, @type) when (@type = offset) {
-  .col-@{class}-offset-@{index} {
-    margin-left: percentage((@index / @grid-columns));
-  }
-}
-
-// Basic looping in LESS
-.loop-grid-columns(@index, @class, @type) when (@index >= 0) {
-  .calc-grid-column(@index, @class, @type);
-  // next iteration
-  .loop-grid-columns((@index - 1), @class, @type);
-}
-
-// Create grid for specific class
-.make-grid(@class) {
-  .float-grid-columns(@class);
-  .loop-grid-columns(@grid-columns, @class, width);
-  .loop-grid-columns(@grid-columns, @class, pull);
-  .loop-grid-columns(@grid-columns, @class, push);
-  .loop-grid-columns(@grid-columns, @class, offset);
-}
-
-// Form validation states
-//
-// Used in forms.less to generate the form validation CSS for warnings, errors,
-// and successes.
-
-.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {
-  // Color the label and help text
-  .help-block,
-  .control-label,
-  .radio,
-  .checkbox,
-  .radio-inline,
-  .checkbox-inline  {
-    color: @text-color;
-  }
-  // Set the border and box shadow on specific inputs to match
-  .form-control {
-    border-color: @border-color;
-    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
-    &:focus {
-      border-color: darken(@border-color, 10%);
-      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);
-      .box-shadow(@shadow);
-    }
-  }
-  // Set validation states also for addons
-  .input-group-addon {
-    color: @text-color;
-    border-color: @border-color;
-    background-color: @background-color;
-  }
-  // Optional feedback icon
-  .form-control-feedback {
-    color: @text-color;
-  }
-}
-
-// Form control focus state
-//
-// Generate a customized focus state and for any input with the specified color,
-// which defaults to the `@input-focus-border` variable.
-//
-// We highly encourage you to not customize the default value, but instead use
-// this to tweak colors on an as-needed basis. This aesthetic change is based on
-// WebKit's default styles, but applicable to a wider range of browsers. Its
-// usability and accessibility should be taken into account with any change.
-//
-// Example usage: change the default blue border and shadow to white for better
-// contrast against a dark gray background.
-
-.form-control-focus(@color: @input-border-focus) {
-  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);
-  &:focus {
-    border-color: @color;
-    outline: 0;
-    .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}");
-  }
-}
-
-// Form control sizing
-//
-// Relative text size, padding, and border-radii changes for form controls. For
-// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
-// element gets special love because it's special, and that's a fact!
-
-.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
-  height: @input-height;
-  padding: @padding-vertical @padding-horizontal;
-  font-size: @font-size;
-  line-height: @line-height;
-  border-radius: @border-radius;
-
-  select& {
-    height: @input-height;
-    line-height: @input-height;
-  }
-
-  textarea&,
-  select[multiple]& {
-    height: auto;
-  }
-}
diff --git a/src/main/less/modals.less b/src/main/less/modals.less
index 21cdee0..6ab15f0 100644
--- a/src/main/less/modals.less
+++ b/src/main/less/modals.less
@@ -2,138 +2,13 @@
 // Modals
 // --------------------------------------------------
 
-// .modal-open      - body class for killing the scroll
-// .modal           - container to scroll within
-// .modal-dialog    - positioning shell for the actual modal
-// .modal-content   - actual modal w/ bg and corners and shit
+// Background
 
-// Kill the scroll on the body
-.modal-open {
-  overflow: hidden;
-}
-
-// Container that the modal scrolls within
+// Base modal
 .modal {
-  display: none;
-  overflow: auto;
-  overflow-y: scroll;
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: @zindex-modal;
-  -webkit-overflow-scrolling: touch;
-
-  // Prevent Chrome on Windows from adding a focus outline. For details, see
-  // https://github.com/twbs/bootstrap/pull/10951.
-  outline: 0;
-
-  // When fading in the modal, animate it to slide down
-  &.fade .modal-dialog {
-    .translate(0, -25%);
-    .transition-transform(~"0.3s ease-out");
-  }
-  &.in .modal-dialog { .translate(0, 0)}
-}
-
-// Shell div to position the modal with bottom padding
-.modal-dialog {
-  position: relative;
-  width: auto;
-  margin: 10px;
-}
-
-// Actual modal
-.modal-content {
-  position: relative;
-  background-color: @modal-content-bg;
-  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
-  border: 1px solid @modal-content-border-color;
-  border-radius: @border-radius-large;
-  .box-shadow(0 3px 9px rgba(0,0,0,.5));
-  background-clip: padding-box;
-  // Remove focus outline from opened modal
-  outline: none;
-}
-
-// Modal background
-.modal-backdrop {
-  position: fixed;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 0;
-  z-index: @zindex-modal-background;
-  background-color: @modal-backdrop-bg;
-  // Fade for backdrop
-  &.fade { .opacity(0); }
-  &.in { .opacity(@modal-backdrop-opacity); }
-}
-
-// Modal header
-// Top section of the modal w/ title and dismiss
-.modal-header {
-  padding: @modal-title-padding;
-  border-bottom: 1px solid @modal-header-border-color;
-  min-height: (@modal-title-padding + @modal-title-line-height);
+	background-color: transparent;
 }
-// Close icon
-.modal-header .close {
-  margin-top: -2px;
-}
-
-// Title text within header
-.modal-title {
-  margin: 0;
-  line-height: @modal-title-line-height;
-}
-
-// Modal body
-// Where all modal content resides (sibling of .modal-header and .modal-footer)
-.modal-body {
-  position: relative;
-  padding: @modal-inner-padding;
-}
-
-// Footer (for actions)
-.modal-footer {
-  margin-top: 15px;
-  padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;
-  text-align: right; // right align buttons
-  border-top: 1px solid @modal-footer-border-color;
-  &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons
 
-  // Properly space out buttons
-  .btn + .btn {
-    margin-left: 5px;
-    margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
-  }
-  // but override that for button groups
-  .btn-group .btn + .btn {
-    margin-left: -1px;
-  }
-  // and override it for block buttons as well
-  .btn-block + .btn-block {
-    margin-left: 0;
-  }
-}
-
-// Scale up the modal
-@media (min-width: @screen-sm-min) {
-  // Automatically set modal's width for larger viewports
-  .modal-dialog {
-    width: @modal-md;
-    margin: 30px auto;
-  }
-  .modal-content {
-    .box-shadow(0 5px 15px rgba(0,0,0,.5));
-  }
-
-  // Modal sizes
-  .modal-sm { width: @modal-sm; }
-}
-
-@media (min-width: @screen-md-min) {
-  .modal-lg { width: @modal-lg; }
-}
+.modal-body, .modal-header {
+	text-shadow: none;
+}
\ No newline at end of file
diff --git a/src/main/less/navbar.less b/src/main/less/navbar.less
deleted file mode 100644
index 8c4c210..0000000
--- a/src/main/less/navbar.less
+++ /dev/null
@@ -1,616 +0,0 @@
-//
-// Navbars
-// --------------------------------------------------
-
-
-// Wrapper and base class
-//
-// Provide a static navbar from which we expand to create full-width, fixed, and
-// other navbar variations.
-
-.navbar {
-  position: relative;
-  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
-  margin-bottom: @navbar-margin-bottom;
-  border: 1px solid transparent;
-
-  // Prevent floats from breaking the navbar
-  &:extend(.clearfix all);
-
-  @media (min-width: @grid-float-breakpoint) {
-    border-radius: @navbar-border-radius;
-  }
-}
-
-
-// Navbar heading
-//
-// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
-// styling of responsive aspects.
-
-.navbar-header {
-  &:extend(.clearfix all);
-
-  @media (min-width: @grid-float-breakpoint) {
-    float: left;
-  }
-}
-
-
-// Navbar collapse (body)
-//
-// Group your navbar content into this for easy collapsing and expanding across
-// various device sizes. By default, this content is collapsed when <768px, but
-// will expand past that for a horizontal display.
-//
-// To start (on mobile devices) the navbar links, forms, and buttons are stacked
-// vertically and include a `max-height` to overflow in case you have too much
-// content for the user's viewport.
-
-.navbar-collapse {
-  max-height: @navbar-collapse-max-height;
-  overflow-x: visible;
-  padding-right: @navbar-padding-horizontal;
-  padding-left:  @navbar-padding-horizontal;
-  border-top: 1px solid transparent;
-  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
-  &:extend(.clearfix all);
-  -webkit-overflow-scrolling: touch;
-
-  &.in {
-    overflow-y: auto;
-  }
-
-  @media (min-width: @grid-float-breakpoint) {
-    width: auto;
-    border-top: 0;
-    box-shadow: none;
-
-    &.collapse {
-      display: block !important;
-      height: auto !important;
-      padding-bottom: 0; // Override default setting
-      overflow: visible !important;
-    }
-
-    &.in {
-      overflow-y: visible;
-    }
-
-    // Undo the collapse side padding for navbars with containers to ensure
-    // alignment of right-aligned contents.
-    .navbar-fixed-top &,
-    .navbar-static-top &,
-    .navbar-fixed-bottom & {
-      padding-left: 0;
-      padding-right: 0;
-    }
-  }
-}
-
-
-// Both navbar header and collapse
-//
-// When a container is present, change the behavior of the header and collapse.
-
-.container,
-.container-fluid {
-  > .navbar-header,
-  > .navbar-collapse {
-    margin-right: -@navbar-padding-horizontal;
-    margin-left:  -@navbar-padding-horizontal;
-
-    @media (min-width: @grid-float-breakpoint) {
-      margin-right: 0;
-      margin-left:  0;
-    }
-  }
-}
-
-
-//
-// Navbar alignment options
-//
-// Display the navbar across the entirety of the page or fixed it to the top or
-// bottom of the page.
-
-// Static top (unfixed, but 100% wide) navbar
-.navbar-static-top {
-  z-index: @zindex-navbar;
-  border-width: 0 0 1px;
-
-  @media (min-width: @grid-float-breakpoint) {
-    border-radius: 0;
-  }
-}
-
-// Fix the top/bottom navbars when screen real estate supports it
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  position: fixed;
-  right: 0;
-  left: 0;
-  z-index: @zindex-navbar-fixed;
-
-  // Undo the rounded corners
-  @media (min-width: @grid-float-breakpoint) {
-    border-radius: 0;
-  }
-}
-.navbar-fixed-top {
-  top: 0;
-  border-width: 0 0 1px;
-}
-.navbar-fixed-bottom {
-  bottom: 0;
-  margin-bottom: 0; // override .navbar defaults
-  border-width: 1px 0 0;
-}
-
-
-// Brand/project name
-
-.navbar-brand {
-  float: left;
-  padding: @navbar-padding-vertical @navbar-padding-horizontal;
-  font-size: @font-size-large;
-  line-height: @line-height-computed;
-  height: @navbar-height;
-
-  &:hover,
-  &:focus {
-    text-decoration: none;
-  }
-
-  @media (min-width: @grid-float-breakpoint) {
-    .navbar > .container &,
-    .navbar > .container-fluid & {
-      margin-left: -@navbar-padding-horizontal;
-    }
-  }
-}
-
-
-// Navbar toggle
-//
-// Custom button for toggling the `.navbar-collapse`, powered by the collapse
-// JavaScript plugin.
-
-.navbar-toggle {
-  position: relative;
-  float: right;
-  margin-right: @navbar-padding-horizontal;
-  padding: 9px 10px;
-  .navbar-vertical-align(34px);
-  background-color: transparent;
-  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
-  border: 1px solid transparent;
-  border-radius: @border-radius-base;
-
-  // We remove the `outline` here, but later compensate by attaching `:hover`
-  // styles to `:focus`.
-  &:focus {
-    outline: none;
-  }
-
-  // Bars
-  .icon-bar {
-    display: block;
-    width: 22px;
-    height: 2px;
-    border-radius: 1px;
-  }
-  .icon-bar + .icon-bar {
-    margin-top: 4px;
-  }
-
-  @media (min-width: @grid-float-breakpoint) {
-    display: none;
-  }
-}
-
-
-// Navbar nav links
-//
-// Builds on top of the `.nav` components with its own modifier class to make
-// the nav the full height of the horizontal nav (above 768px).
-
-.navbar-nav {
-  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;
-
-  > li > a {
-    padding-top:    10px;
-    padding-bottom: 10px;
-    line-height: @line-height-computed;
-  }
-
-  @media (max-width: @grid-float-breakpoint-max) {
-    // Dropdowns get custom display when collapsed
-    .open .dropdown-menu {
-      position: static;
-      float: none;
-      width: auto;
-      margin-top: 0;
-      background-color: transparent;
-      border: 0;
-      box-shadow: none;
-      > li > a,
-      .dropdown-header {
-        padding: 5px 15px 5px 25px;
-      }
-      > li > a {
-        line-height: @line-height-computed;
-        &:hover,
-        &:focus {
-          background-image: none;
-        }
-      }
-    }
-  }
-
-  // Uncollapse the nav
-  @media (min-width: @grid-float-breakpoint) {
-    float: left;
-    margin: 0;
-
-    > li {
-      float: left;
-      > a {
-        padding-top:    @navbar-padding-vertical;
-        padding-bottom: @navbar-padding-vertical;
-      }
-    }
-
-    &.navbar-right:last-child {
-      margin-right: -@navbar-padding-horizontal;
-    }
-  }
-}
-
-
-// Component alignment
-//
-// Repurpose the pull utilities as their own navbar utilities to avoid specificity
-// issues with parents and chaining. Only do this when the navbar is uncollapsed
-// though so that navbar contents properly stack and align in mobile.
-
-@media (min-width: @grid-float-breakpoint) {
-  .navbar-left  { .pull-left(); }
-  .navbar-right { .pull-right(); }
-}
-
-
-// Navbar form
-//
-// Extension of the `.form-inline` with some extra flavor for optimum display in
-// our navbars.
-
-.navbar-form {
-  margin-left: -@navbar-padding-horizontal;
-  margin-right: -@navbar-padding-horizontal;
-  padding: 10px @navbar-padding-horizontal;
-  border-top: 1px solid transparent;
-  border-bottom: 1px solid transparent;
-  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
-  .box-shadow(@shadow);
-
-  // Mixin behavior for optimum display
-  .form-inline();
-
-  .form-group {
-    @media (max-width: @grid-float-breakpoint-max) {
-      margin-bottom: 5px;
-    }
-  }
-
-  // Vertically center in expanded, horizontal navbar
-  .navbar-vertical-align(@input-height-base);
-
-  // Undo 100% width for pull classes
-  @media (min-width: @grid-float-breakpoint) {
-    width: auto;
-    border: 0;
-    margin-left: 0;
-    margin-right: 0;
-    padding-top: 0;
-    padding-bottom: 0;
-    .box-shadow(none);
-
-    // Outdent the form if last child to line up with content down the page
-    &.navbar-right:last-child {
-      margin-right: -@navbar-padding-horizontal;
-    }
-  }
-}
-
-
-// Dropdown menus
-
-// Menu position and menu carets
-.navbar-nav > li > .dropdown-menu {
-  margin-top: 0;
-  .border-top-radius(0);
-}
-// Menu position and menu caret support for dropups via extra dropup class
-.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
-  .border-bottom-radius(0);
-}
-
-
-// Buttons in navbars
-//
-// Vertically center a button within a navbar (when *not* in a form).
-
-.navbar-btn {
-  .navbar-vertical-align(@input-height-base);
-
-  &.btn-sm {
-    .navbar-vertical-align(@input-height-small);
-  }
-  &.btn-xs {
-    .navbar-vertical-align(22);
-  }
-}
-
-
-// Text in navbars
-//
-// Add a class to make any element properly align itself vertically within the navbars.
-
-.navbar-text {
-  .navbar-vertical-align(@line-height-computed);
-
-  @media (min-width: @grid-float-breakpoint) {
-    float: left;
-    margin-left: @navbar-padding-horizontal;
-    margin-right: @navbar-padding-horizontal;
-
-    // Outdent the form if last child to line up with content down the page
-    &.navbar-right:last-child {
-      margin-right: 0;
-    }
-  }
-}
-
-// Alternate navbars
-// --------------------------------------------------
-
-// Default navbar
-.navbar-default {
-  background-color: @navbar-default-bg;
-  border-color: @navbar-default-border;
-
-  .navbar-brand {
-    color: @navbar-default-brand-color;
-    &:hover,
-    &:focus {
-      color: @navbar-default-brand-hover-color;
-      background-color: @navbar-default-brand-hover-bg;
-    }
-  }
-
-  .navbar-text {
-    color: @navbar-default-color;
-  }
-
-  .navbar-nav {
-    > li > a {
-      color: @navbar-default-link-color;
-
-      &:hover,
-      &:focus {
-        color: @navbar-default-link-hover-color;
-        background-color: @navbar-default-link-hover-bg;
-      }
-    }
-    > .active > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @navbar-default-link-active-color;
-        background-color: @navbar-default-link-active-bg;
-      }
-    }
-    > .disabled > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @navbar-default-link-disabled-color;
-        background-color: @navbar-default-link-disabled-bg;
-      }
-    }
-  }
-
-  .navbar-toggle {
-    border-color: @navbar-default-toggle-border-color;
-    &:hover,
-    &:focus {
-      background-color: @navbar-default-toggle-hover-bg;
-    }
-    .icon-bar {
-      background-color: @navbar-default-toggle-icon-bar-bg;
-    }
-  }
-
-  .navbar-collapse,
-  .navbar-form {
-    border-color: @navbar-default-border;
-  }
-
-  // Dropdown menu items
-  .navbar-nav {
-    // Remove background color from open dropdown
-    > .open > a {
-      &,
-      &:hover,
-      &:focus {
-        background-color: @navbar-default-link-active-bg;
-        color: @navbar-default-link-active-color;
-      }
-    }
-
-    @media (max-width: @grid-float-breakpoint-max) {
-      // Dropdowns get custom display when collapsed
-      .open .dropdown-menu {
-        > li > a {
-          color: @navbar-default-link-color;
-          &:hover,
-          &:focus {
-            color: @navbar-default-link-hover-color;
-            background-color: @navbar-default-link-hover-bg;
-          }
-        }
-        > .active > a {
-          &,
-          &:hover,
-          &:focus {
-            color: @navbar-default-link-active-color;
-            background-color: @navbar-default-link-active-bg;
-          }
-        }
-        > .disabled > a {
-          &,
-          &:hover,
-          &:focus {
-            color: @navbar-default-link-disabled-color;
-            background-color: @navbar-default-link-disabled-bg;
-          }
-        }
-      }
-    }
-  }
-
-
-  // Links in navbars
-  //
-  // Add a class to ensure links outside the navbar nav are colored correctly.
-
-  .navbar-link {
-    color: @navbar-default-link-color;
-    &:hover {
-      color: @navbar-default-link-hover-color;
-    }
-  }
-
-}
-
-// Inverse navbar
-
-.navbar-inverse {
-  background-color: @navbar-inverse-bg;
-  border-color: @navbar-inverse-border;
-
-  .navbar-brand {
-    color: @navbar-inverse-brand-color;
-    &:hover,
-    &:focus {
-      color: @navbar-inverse-brand-hover-color;
-      background-color: @navbar-inverse-brand-hover-bg;
-    }
-  }
-
-  .navbar-text {
-    color: @navbar-inverse-color;
-  }
-
-  .navbar-nav {
-    > li > a {
-      color: @navbar-inverse-link-color;
-
-      &:hover,
-      &:focus {
-        color: @navbar-inverse-link-hover-color;
-        background-color: @navbar-inverse-link-hover-bg;
-      }
-    }
-    > .active > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @navbar-inverse-link-active-color;
-        background-color: @navbar-inverse-link-active-bg;
-      }
-    }
-    > .disabled > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @navbar-inverse-link-disabled-color;
-        background-color: @navbar-inverse-link-disabled-bg;
-      }
-    }
-  }
-
-  // Darken the responsive nav toggle
-  .navbar-toggle {
-    border-color: @navbar-inverse-toggle-border-color;
-    &:hover,
-    &:focus {
-      background-color: @navbar-inverse-toggle-hover-bg;
-    }
-    .icon-bar {
-      background-color: @navbar-inverse-toggle-icon-bar-bg;
-    }
-  }
-
-  .navbar-collapse,
-  .navbar-form {
-    border-color: darken(@navbar-inverse-bg, 7%);
-  }
-
-  // Dropdowns
-  .navbar-nav {
-    > .open > a {
-      &,
-      &:hover,
-      &:focus {
-        background-color: @navbar-inverse-link-active-bg;
-        color: @navbar-inverse-link-active-color;
-      }
-    }
-
-    @media (max-width: @grid-float-breakpoint-max) {
-      // Dropdowns get custom display
-      .open .dropdown-menu {
-        > .dropdown-header {
-          border-color: @navbar-inverse-border;
-        }
-        .divider {
-          background-color: @navbar-inverse-border;
-        }
-        > li > a {
-          color: @navbar-inverse-link-color;
-          &:hover,
-          &:focus {
-            color: @navbar-inverse-link-hover-color;
-            background-color: @navbar-inverse-link-hover-bg;
-          }
-        }
-        > .active > a {
-          &,
-          &:hover,
-          &:focus {
-            color: @navbar-inverse-link-active-color;
-            background-color: @navbar-inverse-link-active-bg;
-          }
-        }
-        > .disabled > a {
-          &,
-          &:hover,
-          &:focus {
-            color: @navbar-inverse-link-disabled-color;
-            background-color: @navbar-inverse-link-disabled-bg;
-          }
-        }
-      }
-    }
-  }
-
-  .navbar-link {
-    color: @navbar-inverse-link-color;
-    &:hover {
-      color: @navbar-inverse-link-hover-color;
-    }
-  }
-
-}
diff --git a/src/main/less/navs.less b/src/main/less/navs.less
index 9e729b3..2a3b6cd 100644
--- a/src/main/less/navs.less
+++ b/src/main/less/navs.less
@@ -1,242 +1,63 @@
-//
-// Navs
-// --------------------------------------------------
 
-
-// Base class
-// --------------------------------------------------
-
-.nav {
-  margin-bottom: 0;
-  padding-left: 0; // Override default ul/ol
-  list-style: none;
-  &:extend(.clearfix all);
-
-  > li {
-    position: relative;
-    display: block;
-
-    > a {
-      position: relative;
-      display: block;
-      padding: @nav-link-padding;
-      &:hover,
-      &:focus {
-        text-decoration: none;
-        background-color: @nav-link-hover-bg;
-      }
-    }
-
-    // Disabled state sets text to gray and nukes hover/tab effects
-    &.disabled > a {
-      color: @nav-disabled-link-color;
-
-      &:hover,
-      &:focus {
-        color: @nav-disabled-link-hover-color;
-        text-decoration: none;
-        background-color: transparent;
-        cursor: not-allowed;
-      }
-    }
-  }
-
-  // Open dropdowns
-  .open > a {
-    &,
-    &:hover,
-    &:focus {
-      background-color: @nav-link-hover-bg;
-      border-color: @link-color;
-    }
-  }
-
-  // Nav dividers (deprecated with v3.0.1)
-  //
-  // This should have been removed in v3 with the dropping of `.nav-list`, but
-  // we missed it. We don't currently support this anywhere, but in the interest
-  // of maintaining backward compatibility in case you use it, it's deprecated.
-  .nav-divider {
-    .nav-divider();
-  }
-
-  // Prevent IE8 from misplacing imgs
-  //
-  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
-  > li > a > img {
-    max-width: none;
-  }
+// TABS AND PILLS
+// -------------
+#login .nav {
+	margin-bottom: 10px;
 }
-
-
-// Tabs
-// -------------------------
-
-// Give the tabs something to sit on
-.nav-tabs {
-  border-bottom: 1px solid @nav-tabs-border-color;
-  > li {
-    float: left;
-    // Make the list-items overlay the bottom border
-    margin-bottom: -1px;
-
-    // Actual tabs (as links)
-    > a {
-      margin-right: 2px;
-      line-height: @line-height-base;
-      border: 1px solid transparent;
-      border-radius: @border-radius-base @border-radius-base 0 0;
-      &:hover {
-        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;
-      }
-    }
-
-    // Active state, and its :hover to override normal :hover
-    &.active > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @nav-tabs-active-link-hover-color;
-        background-color: @nav-tabs-active-link-hover-bg;
-        border: 1px solid @nav-tabs-active-link-hover-border-color;
-        border-bottom-color: transparent;
-        cursor: default;
-      }
-    }
-  }
-  // pulling this in mainly for less shorthand
-  &.nav-justified {
-    .nav-justified();
-    .nav-tabs-justified();
-  }
+#login .tabbable {
+  float: right;
 }
 
-
-// Pills
-// -------------------------
-.nav-pills {
-  > li {
-    float: left;
-
-    // Links rendered as pills
-    > a {
-      border-radius: @nav-pills-border-radius;
-    }
-    + li {
-      margin-left: 2px;
-    }
-
-    // Active state
-    &.active > a {
-      &,
-      &:hover,
-      &:focus {
-        color: @nav-pills-active-link-hover-color;
-        background-color: @nav-pills-active-link-hover-bg;
-      }
-    }
-  }
+#login .tab-content {
+  .border-radius(0, 7px, 7px, 0);
+  background-color: transparent;
 }
 
-
-// Stacked pills
-.nav-stacked {
-  > li {
-    float: none;
-    + li {
-      margin-top: 2px;
-      margin-left: 0; // no need for this gap between nav items
-    }
-  }
+#login .tab-pane.active {
+	margin-right: 20px;
 }
 
-
-// Nav variations
-// --------------------------------------------------
-
-// Justified nav links
-// -------------------------
-
-.nav-justified {
-  width: 100%;
-
-  > li {
-    float: none;
-     > a {
-      text-align: center;
-      margin-bottom: 5px;
-    }
-  }
-
-  > .dropdown .dropdown-menu {
-    top: auto;
-    left: auto;
-  }
-
-  @media (min-width: @screen-sm-min) {
-    > li {
-      display: table-cell;
-      width: 1%;
-      > a {
-        margin-bottom: 0;
-      }
-    }
-  }
+#login .nav-tabs > li {
+  float: right;
+  margin-right: 15px;
+  background: transparent url(../img/alu.gif) repeat left top;
+  margin-top: 0px;
 }
 
-// Move borders to anchors instead of bottom of list
-//
-// Mixin for adding on top the shared `.nav-justified` styles for our tabs
-.nav-tabs-justified {
-  border-bottom: 0;
-
-  > li > a {
-    // Override margin from .nav-tabs
-    margin-right: 0;
-    border-radius: @border-radius-base;
-  }
-
-  > .active > a,
-  > .active > a:hover,
-  > .active > a:focus {
-    border: 1px solid @nav-tabs-justified-link-border-color;
-  }
-
-  @media (min-width: @screen-sm-min) {
-    > li > a {
-      border-bottom: 1px solid @nav-tabs-justified-link-border-color;
-      border-radius: @border-radius-base @border-radius-base 0 0;
-    }
-    > .active > a,
-    > .active > a:hover,
-    > .active > a:focus {
-      border-bottom-color: @nav-tabs-justified-active-link-border-color;
-    }
-  }
+#login .nav-pills > li {
+  float: right;
+  margin: 5px 10px 0px 0px;
+  background: transparent url(../img/alu.gif) repeat left top;
 }
 
-
-// Tabbable tabs
-// -------------------------
-
-// Hide tabbable panes to start, show them when `.active`
-.tab-content {
-  > .tab-pane {
-    display: none;
-  }
-  > .active {
-    display: block;
-  }
+#login .tabs-below > .nav-tabs > .active > a, #login .tabs-below > .nav-pills > .active > a {
+  border-color: transparent;
+}
+#login .nav-tabs > .active > a, #login .nav-pills > .active > a {
+  border: none;
+  color: @textColor;
+}
+#login .tabs-below > .nav-tabs {
+   border-top: 0px;
+}
+.nav > li > a {
+  padding: 5px 10px 5px 10px;
 }
 
+#login .nav-tabs > li > a {
+  .border-radius(0, 7px, 7px, 0);
+  .plate-background;
+  .plate-box-shadow;
+  margin-right: 0px;
+  padding: 0px 10px 5px 10px;
+  
+}
 
-// Dropdowns
-// -------------------------
-
-// Specific dropdowns
-.nav-tabs .dropdown-menu {
-  // make dropdown border overlap tab border
-  margin-top: -1px;
-  // Remove the top rounded corners here since there is a hard edge above the menu
-  .border-top-radius(0);
+ #login .nav-pills > li > a  {
+  .border-radius(7px);
+  .plate-background;
+  .plate-box-shadow;
+  margin-right: 0px;
+  padding: 5px 10px 5px 10px;
+  
 }
diff --git a/src/main/less/normalize.less b/src/main/less/normalize.less
deleted file mode 100644
index 024e257..0000000
--- a/src/main/less/normalize.less
+++ /dev/null
@@ -1,423 +0,0 @@
-/*! normalize.css v3.0.0 | MIT License | git.io/normalize */
-
-//
-// 1. Set default font family to sans-serif.
-// 2. Prevent iOS text size adjust after orientation change, without disabling
-//    user zoom.
-//
-
-html {
-  font-family: sans-serif; // 1
-  -ms-text-size-adjust: 100%; // 2
-  -webkit-text-size-adjust: 100%; // 2
-}
-
-//
-// Remove default margin.
-//
-
-body {
-  margin: 0;
-}
-
-// HTML5 display definitions
-// ==========================================================================
-
-//
-// Correct `block` display not defined in IE 8/9.
-//
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section,
-summary {
-  display: block;
-}
-
-//
-// 1. Correct `inline-block` display not defined in IE 8/9.
-// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
-//
-
-audio,
-canvas,
-progress,
-video {
-  display: inline-block; // 1
-  vertical-align: baseline; // 2
-}
-
-//
-// Prevent modern browsers from displaying `audio` without controls.
-// Remove excess height in iOS 5 devices.
-//
-
-audio:not([controls]) {
-  display: none;
-  height: 0;
-}
-
-//
-// Address `[hidden]` styling not present in IE 8/9.
-// Hide the `template` element in IE, Safari, and Firefox < 22.
-//
-
-[hidden],
-template {
-  display: none;
-}
-
-// Links
-// ==========================================================================
-
-//
-// Remove the gray background color from active links in IE 10.
-//
-
-a {
-  background: transparent;
-}
-
-//
-// Improve readability when focused and also mouse hovered in all browsers.
-//
-
-a:active,
-a:hover {
-  outline: 0;
-}
-
-// Text-level semantics
-// ==========================================================================
-
-//
-// Address styling not present in IE 8/9, Safari 5, and Chrome.
-//
-
-abbr[title] {
-  border-bottom: 1px dotted;
-}
-
-//
-// Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
-//
-
-b,
-strong {
-  font-weight: bold;
-}
-
-//
-// Address styling not present in Safari 5 and Chrome.
-//
-
-dfn {
-  font-style: italic;
-}
-
-//
-// Address variable `h1` font-size and margin within `section` and `article`
-// contexts in Firefox 4+, Safari 5, and Chrome.
-//
-
-h1 {
-  font-size: 2em;
-  margin: 0.67em 0;
-}
-
-//
-// Address styling not present in IE 8/9.
-//
-
-mark {
-  background: #ff0;
-  color: #000;
-}
-
-//
-// Address inconsistent and variable font size in all browsers.
-//
-
-small {
-  font-size: 80%;
-}
-
-//
-// Prevent `sub` and `sup` affecting `line-height` in all browsers.
-//
-
-sub,
-sup {
-  font-size: 75%;
-  line-height: 0;
-  position: relative;
-  vertical-align: baseline;
-}
-
-sup {
-  top: -0.5em;
-}
-
-sub {
-  bottom: -0.25em;
-}
-
-// Embedded content
-// ==========================================================================
-
-//
-// Remove border when inside `a` element in IE 8/9.
-//
-
-img {
-  border: 0;
-}
-
-//
-// Correct overflow displayed oddly in IE 9.
-//
-
-svg:not(:root) {
-  overflow: hidden;
-}
-
-// Grouping content
-// ==========================================================================
-
-//
-// Address margin not present in IE 8/9 and Safari 5.
-//
-
-figure {
-  margin: 1em 40px;
-}
-
-//
-// Address differences between Firefox and other browsers.
-//
-
-hr {
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-  height: 0;
-}
-
-//
-// Contain overflow in all browsers.
-//
-
-pre {
-  overflow: auto;
-}
-
-//
-// Address odd `em`-unit font size rendering in all browsers.
-//
-
-code,
-kbd,
-pre,
-samp {
-  font-family: monospace, monospace;
-  font-size: 1em;
-}
-
-// Forms
-// ==========================================================================
-
-//
-// Known limitation: by default, Chrome and Safari on OS X allow very limited
-// styling of `select`, unless a `border` property is set.
-//
-
-//
-// 1. Correct color not being inherited.
-//    Known issue: affects color of disabled elements.
-// 2. Correct font properties not being inherited.
-// 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
-//
-
-button,
-input,
-optgroup,
-select,
-textarea {
-  color: inherit; // 1
-  font: inherit; // 2
-  margin: 0; // 3
-}
-
-//
-// Address `overflow` set to `hidden` in IE 8/9/10.
-//
-
-button {
-  overflow: visible;
-}
-
-//
-// Address inconsistent `text-transform` inheritance for `button` and `select`.
-// All other form control elements do not inherit `text-transform` values.
-// Correct `button` style inheritance in Firefox, IE 8+, and Opera
-// Correct `select` style inheritance in Firefox.
-//
-
-button,
-select {
-  text-transform: none;
-}
-
-//
-// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
-//    and `video` controls.
-// 2. Correct inability to style clickable `input` types in iOS.
-// 3. Improve usability and consistency of cursor style between image-type
-//    `input` and others.
-//
-
-button,
-html input[type="button"], // 1
-input[type="reset"],
-input[type="submit"] {
-  -webkit-appearance: button; // 2
-  cursor: pointer; // 3
-}
-
-//
-// Re-set default cursor for disabled elements.
-//
-
-button[disabled],
-html input[disabled] {
-  cursor: default;
-}
-
-//
-// Remove inner padding and border in Firefox 4+.
-//
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-  border: 0;
-  padding: 0;
-}
-
-//
-// Address Firefox 4+ setting `line-height` on `input` using `!important` in
-// the UA stylesheet.
-//
-
-input {
-  line-height: normal;
-}
-
-//
-// It's recommended that you don't attempt to style these elements.
-// Firefox's implementation doesn't respect box-sizing, padding, or width.
-//
-// 1. Address box sizing set to `content-box` in IE 8/9/10.
-// 2. Remove excess padding in IE 8/9/10.
-//
-
-input[type="checkbox"],
-input[type="radio"] {
-  box-sizing: border-box; // 1
-  padding: 0; // 2
-}
-
-//
-// Fix the cursor style for Chrome's increment/decrement buttons. For certain
-// `font-size` values of the `input`, it causes the cursor style of the
-// decrement button to change from `default` to `text`.
-//
-
-input[type="number"]::-webkit-inner-spin-button,
-input[type="number"]::-webkit-outer-spin-button {
-  height: auto;
-}
-
-//
-// 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
-// 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
-//    (include `-moz` to future-proof).
-//
-
-input[type="search"] {
-  -webkit-appearance: textfield; // 1
-  -moz-box-sizing: content-box;
-  -webkit-box-sizing: content-box; // 2
-  box-sizing: content-box;
-}
-
-//
-// Remove inner padding and search cancel button in Safari and Chrome on OS X.
-// Safari (but not Chrome) clips the cancel button when the search input has
-// padding (and `textfield` appearance).
-//
-
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-  -webkit-appearance: none;
-}
-
-//
-// Define consistent border, margin, and padding.
-//
-
-fieldset {
-  border: 1px solid #c0c0c0;
-  margin: 0 2px;
-  padding: 0.35em 0.625em 0.75em;
-}
-
-//
-// 1. Correct `color` not being inherited in IE 8/9.
-// 2. Remove padding so people aren't caught out if they zero out fieldsets.
-//
-
-legend {
-  border: 0; // 1
-  padding: 0; // 2
-}
-
-//
-// Remove default vertical scrollbar in IE 8/9.
-//
-
-textarea {
-  overflow: auto;
-}
-
-//
-// Don't inherit the `font-weight` (applied by a rule above).
-// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
-//
-
-optgroup {
-  font-weight: bold;
-}
-
-// Tables
-// ==========================================================================
-
-//
-// Remove most spacing between table cells.
-//
-
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-td,
-th {
-  padding: 0;
-}
\ No newline at end of file
diff --git a/src/main/less/pager.less b/src/main/less/pager.less
deleted file mode 100644
index 59103f4..0000000
--- a/src/main/less/pager.less
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-// Pager pagination
-// --------------------------------------------------
-
-
-.pager {
-  padding-left: 0;
-  margin: @line-height-computed 0;
-  list-style: none;
-  text-align: center;
-  &:extend(.clearfix all);
-  li {
-    display: inline;
-    > a,
-    > span {
-      display: inline-block;
-      padding: 5px 14px;
-      background-color: @pager-bg;
-      border: 1px solid @pager-border;
-      border-radius: @pager-border-radius;
-    }
-
-    > a:hover,
-    > a:focus {
-      text-decoration: none;
-      background-color: @pager-hover-bg;
-    }
-  }
-
-  .next {
-    > a,
-    > span {
-      float: right;
-    }
-  }
-
-  .previous {
-    > a,
-    > span {
-      float: left;
-    }
-  }
-
-  .disabled {
-    > a,
-    > a:hover,
-    > a:focus,
-    > span {
-      color: @pager-disabled-color;
-      background-color: @pager-bg;
-      cursor: not-allowed;
-    }
-  }
-
-}
diff --git a/src/main/less/pagination.less b/src/main/less/pagination.less
deleted file mode 100644
index b2856ae..0000000
--- a/src/main/less/pagination.less
+++ /dev/null
@@ -1,88 +0,0 @@
-//
-// Pagination (multiple pages)
-// --------------------------------------------------
-.pagination {
-  display: inline-block;
-  padding-left: 0;
-  margin: @line-height-computed 0;
-  border-radius: @border-radius-base;
-
-  > li {
-    display: inline; // Remove list-style and block-level defaults
-    > a,
-    > span {
-      position: relative;
-      float: left; // Collapse white-space
-      padding: @padding-base-vertical @padding-base-horizontal;
-      line-height: @line-height-base;
-      text-decoration: none;
-      color: @pagination-color;
-      background-color: @pagination-bg;
-      border: 1px solid @pagination-border;
-      margin-left: -1px;
-    }
-    &:first-child {
-      > a,
-      > span {
-        margin-left: 0;
-        .border-left-radius(@border-radius-base);
-      }
-    }
-    &:last-child {
-      > a,
-      > span {
-        .border-right-radius(@border-radius-base);
-      }
-    }
-  }
-
-  > li > a,
-  > li > span {
-    &:hover,
-    &:focus {
-      color: @pagination-hover-color;
-      background-color: @pagination-hover-bg;
-      border-color: @pagination-hover-border;
-    }
-  }
-
-  > .active > a,
-  > .active > span {
-    &,
-    &:hover,
-    &:focus {
-      z-index: 2;
-      color: @pagination-active-color;
-      background-color: @pagination-active-bg;
-      border-color: @pagination-active-border;
-      cursor: default;
-    }
-  }
-
-  > .disabled {
-    > span,
-    > span:hover,
-    > span:focus,
-    > a,
-    > a:hover,
-    > a:focus {
-      color: @pagination-disabled-color;
-      background-color: @pagination-disabled-bg;
-      border-color: @pagination-disabled-border;
-      cursor: not-allowed;
-    }
-  }
-}
-
-// Sizing
-// --------------------------------------------------
-
-// Large
-.pagination-lg {
-  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);
-}
-
-// Small
-.pagination-sm {
-  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);
-}
diff --git a/src/main/less/panels.less b/src/main/less/panels.less
deleted file mode 100644
index 20dd149..0000000
--- a/src/main/less/panels.less
+++ /dev/null
@@ -1,241 +0,0 @@
-//
-// Panels
-// --------------------------------------------------
-
-
-// Base class
-.panel {
-  margin-bottom: @line-height-computed;
-  background-color: @panel-bg;
-  border: 1px solid transparent;
-  border-radius: @panel-border-radius;
-  .box-shadow(0 1px 1px rgba(0,0,0,.05));
-}
-
-// Panel contents
-.panel-body {
-  padding: @panel-body-padding;
-  &:extend(.clearfix all);
-}
-
-// Optional heading
-.panel-heading {
-  padding: 10px 15px;
-  border-bottom: 1px solid transparent;
-  .border-top-radius((@panel-border-radius - 1));
-
-  > .dropdown .dropdown-toggle {
-    color: inherit;
-  }
-}
-
-// Within heading, strip any `h*` tag of its default margins for spacing.
-.panel-title {
-  margin-top: 0;
-  margin-bottom: 0;
-  font-size: ceil((@font-size-base * 1.125));
-  color: inherit;
-
-  > a {
-    color: inherit;
-  }
-}
-
-// Optional footer (stays gray in every modifier class)
-.panel-footer {
-  padding: 10px 15px;
-  background-color: @panel-footer-bg;
-  border-top: 1px solid @panel-inner-border;
-  .border-bottom-radius((@panel-border-radius - 1));
-}
-
-
-// List groups in panels
-//
-// By default, space out list group content from panel headings to account for
-// any kind of custom content between the two.
-
-.panel {
-  > .list-group {
-    margin-bottom: 0;
-
-    .list-group-item {
-      border-width: 1px 0;
-      border-radius: 0;
-    }
-
-    // Add border top radius for first one
-    &:first-child {
-      .list-group-item:first-child {
-        border-top: 0;
-        .border-top-radius((@panel-border-radius - 1));
-      }
-    }
-    // Add border bottom radius for last one
-    &:last-child {
-      .list-group-item:last-child {
-        border-bottom: 0;
-        .border-bottom-radius((@panel-border-radius - 1));
-      }
-    }
-  }
-}
-// Collapse space between when there's no additional content.
-.panel-heading + .list-group {
-  .list-group-item:first-child {
-    border-top-width: 0;
-  }
-}
-
-
-// Tables in panels
-//
-// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
-// watch it go full width.
-
-.panel {
-  > .table,
-  > .table-responsive > .table {
-    margin-bottom: 0;
-  }
-  // Add border top radius for first one
-  > .table:first-child,
-  > .table-responsive:first-child > .table:first-child {
-    .border-top-radius((@panel-border-radius - 1));
-
-    > thead:first-child,
-    > tbody:first-child {
-      > tr:first-child {
-        td:first-child,
-        th:first-child {
-          border-top-left-radius: (@panel-border-radius - 1);
-        }
-        td:last-child,
-        th:last-child {
-          border-top-right-radius: (@panel-border-radius - 1);
-        }
-      }
-    }
-  }
-  // Add border bottom radius for last one
-  > .table:last-child,
-  > .table-responsive:last-child > .table:last-child {
-    .border-bottom-radius((@panel-border-radius - 1));
-
-    > tbody:last-child,
-    > tfoot:last-child {
-      > tr:last-child {
-        td:first-child,
-        th:first-child {
-          border-bottom-left-radius: (@panel-border-radius - 1);
-        }
-        td:last-child,
-        th:last-child {
-          border-bottom-right-radius: (@panel-border-radius - 1);
-        }
-      }
-    }
-  }
-  > .panel-body + .table,
-  > .panel-body + .table-responsive {
-    border-top: 1px solid @table-border-color;
-  }
-  > .table > tbody:first-child > tr:first-child th,
-  > .table > tbody:first-child > tr:first-child td {
-    border-top: 0;
-  }
-  > .table-bordered,
-  > .table-responsive > .table-bordered {
-    border: 0;
-    > thead,
-    > tbody,
-    > tfoot {
-      > tr {
-        > th:first-child,
-        > td:first-child {
-          border-left: 0;
-        }
-        > th:last-child,
-        > td:last-child {
-          border-right: 0;
-        }
-      }
-    }
-    > thead,
-    > tbody {
-      > tr:first-child {
-        > td,
-        > th {
-          border-bottom: 0;
-        }
-      }
-    }
-    > tbody,
-    > tfoot {
-      > tr:last-child {
-        > td,
-        > th {
-          border-bottom: 0;
-        }
-      }
-    }
-  }
-  > .table-responsive {
-    border: 0;
-    margin-bottom: 0;
-  }
-}
-
-
-// Collapsable panels (aka, accordion)
-//
-// Wrap a series of panels in `.panel-group` to turn them into an accordion with
-// the help of our collapse JavaScript plugin.
-
-.panel-group {
-  margin-bottom: @line-height-computed;
-
-  // Tighten up margin so it's only between panels
-  .panel {
-    margin-bottom: 0;
-    border-radius: @panel-border-radius;
-    overflow: hidden; // crop contents when collapsed
-    + .panel {
-      margin-top: 5px;
-    }
-  }
-
-  .panel-heading {
-    border-bottom: 0;
-    + .panel-collapse .panel-body {
-      border-top: 1px solid @panel-inner-border;
-    }
-  }
-  .panel-footer {
-    border-top: 0;
-    + .panel-collapse .panel-body {
-      border-bottom: 1px solid @panel-inner-border;
-    }
-  }
-}
-
-
-// Contextual variations
-.panel-default {
-  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);
-}
-.panel-primary {
-  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);
-}
-.panel-success {
-  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);
-}
-.panel-info {
-  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);
-}
-.panel-warning {
-  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);
-}
-.panel-danger {
-  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);
-}
diff --git a/src/main/less/popovers.less b/src/main/less/popovers.less
deleted file mode 100644
index 696d74c..0000000
--- a/src/main/less/popovers.less
+++ /dev/null
@@ -1,133 +0,0 @@
-//
-// Popovers
-// --------------------------------------------------
-
-
-.popover {
-  position: absolute;
-  top: 0;
-  left: 0;
-  z-index: @zindex-popover;
-  display: none;
-  max-width: @popover-max-width;
-  padding: 1px;
-  text-align: left; // Reset given new insertion method
-  background-color: @popover-bg;
-  background-clip: padding-box;
-  border: 1px solid @popover-fallback-border-color;
-  border: 1px solid @popover-border-color;
-  border-radius: @border-radius-large;
-  .box-shadow(0 5px 10px rgba(0,0,0,.2));
-
-  // Overrides for proper insertion
-  white-space: normal;
-
-  // Offset the popover to account for the popover arrow
-  &.top     { margin-top: -@popover-arrow-width; }
-  &.right   { margin-left: @popover-arrow-width; }
-  &.bottom  { margin-top: @popover-arrow-width; }
-  &.left    { margin-left: -@popover-arrow-width; }
-}
-
-.popover-title {
-  margin: 0; // reset heading margin
-  padding: 8px 14px;
-  font-size: @font-size-base;
-  font-weight: normal;
-  line-height: 18px;
-  background-color: @popover-title-bg;
-  border-bottom: 1px solid darken(@popover-title-bg, 5%);
-  border-radius: 5px 5px 0 0;
-}
-
-.popover-content {
-  padding: 9px 14px;
-}
-
-// Arrows
-//
-// .arrow is outer, .arrow:after is inner
-
-.popover > .arrow {
-  &,
-  &:after {
-    position: absolute;
-    display: block;
-    width: 0;
-    height: 0;
-    border-color: transparent;
-    border-style: solid;
-  }
-}
-.popover > .arrow {
-  border-width: @popover-arrow-outer-width;
-}
-.popover > .arrow:after {
-  border-width: @popover-arrow-width;
-  content: "";
-}
-
-.popover {
-  &.top > .arrow {
-    left: 50%;
-    margin-left: -@popover-arrow-outer-width;
-    border-bottom-width: 0;
-    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback
-    border-top-color: @popover-arrow-outer-color;
-    bottom: -@popover-arrow-outer-width;
-    &:after {
-      content: " ";
-      bottom: 1px;
-      margin-left: -@popover-arrow-width;
-      border-bottom-width: 0;
-      border-top-color: @popover-arrow-color;
-    }
-  }
-  &.right > .arrow {
-    top: 50%;
-    left: -@popover-arrow-outer-width;
-    margin-top: -@popover-arrow-outer-width;
-    border-left-width: 0;
-    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback
-    border-right-color: @popover-arrow-outer-color;
-    &:after {
-      content: " ";
-      left: 1px;
-      bottom: -@popover-arrow-width;
-      border-left-width: 0;
-      border-right-color: @popover-arrow-color;
-    }
-  }
-  &.bottom > .arrow {
-    left: 50%;
-    margin-left: -@popover-arrow-outer-width;
-    border-top-width: 0;
-    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback
-    border-bottom-color: @popover-arrow-outer-color;
-    top: -@popover-arrow-outer-width;
-    &:after {
-      content: " ";
-      top: 1px;
-      margin-left: -@popover-arrow-width;
-      border-top-width: 0;
-      border-bottom-color: @popover-arrow-color;
-    }
-  }
-
-  &.left > .arrow {
-    top: 50%;
-    right: -@popover-arrow-outer-width;
-    margin-top: -@popover-arrow-outer-width;
-    border-right-width: 0;
-    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback
-    border-left-color: @popover-arrow-outer-color;
-    &:after {
-      content: " ";
-      right: 1px;
-      border-right-width: 0;
-      border-left-color: @popover-arrow-color;
-      bottom: -@popover-arrow-width;
-    }
-  }
-
-}
diff --git a/src/main/less/print.less b/src/main/less/print.less
deleted file mode 100644
index 3655d03..0000000
--- a/src/main/less/print.less
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// Basic print styles
-// --------------------------------------------------
-// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css
-
-@media print {
-
-  * {
-    text-shadow: none !important;
-    color: #000 !important; // Black prints faster: h5bp.com/s
-    background: transparent !important;
-    box-shadow: none !important;
-  }
-
-  a,
-  a:visited {
-    text-decoration: underline;
-  }
-
-  a[href]:after {
-    content: " (" attr(href) ")";
-  }
-
-  abbr[title]:after {
-    content: " (" attr(title) ")";
-  }
-
-  // Don't show links for images, or javascript/internal links
-  a[href^="javascript:"]:after,
-  a[href^="#"]:after {
-    content: "";
-  }
-
-  pre,
-  blockquote {
-    border: 1px solid #999;
-    page-break-inside: avoid;
-  }
-
-  thead {
-    display: table-header-group; // h5bp.com/t
-  }
-
-  tr,
-  img {
-    page-break-inside: avoid;
-  }
-
-  img {
-    max-width: 100% !important;
-  }
-
-  p,
-  h2,
-  h3 {
-    orphans: 3;
-    widows: 3;
-  }
-
-  h2,
-  h3 {
-    page-break-after: avoid;
-  }
-
-  // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245
-  // Once fixed, we can just straight up remove this.
-  select {
-    background: #fff !important;
-  }
-
-  // Bootstrap components
-  .navbar {
-    display: none;
-  }
-  .table {
-    td,
-    th {
-      background-color: #fff !important;
-    }
-  }
-  .btn,
-  .dropup > .btn {
-    > .caret {
-      border-top-color: #000 !important;
-    }
-  }
-  .label {
-    border: 1px solid #000;
-  }
-
-  .table {
-    border-collapse: collapse !important;
-  }
-  .table-bordered {
-    th,
-    td {
-      border: 1px solid #ddd !important;
-    }
-  }
-
-}
diff --git a/src/main/less/progress-bars.less b/src/main/less/progress-bars.less
deleted file mode 100644
index 76c87be..0000000
--- a/src/main/less/progress-bars.less
+++ /dev/null
@@ -1,80 +0,0 @@
-//
-// Progress bars
-// --------------------------------------------------
-
-
-// Bar animations
-// -------------------------
-
-// WebKit
-@-webkit-keyframes progress-bar-stripes {
-  from  { background-position: 40px 0; }
-  to    { background-position: 0 0; }
-}
-
-// Spec and IE10+
-@keyframes progress-bar-stripes {
-  from  { background-position: 40px 0; }
-  to    { background-position: 0 0; }
-}
-
-
-
-// Bar itself
-// -------------------------
-
-// Outer container
-.progress {
-  overflow: hidden;
-  height: @line-height-computed;
-  margin-bottom: @line-height-computed;
-  background-color: @progress-bg;
-  border-radius: @border-radius-base;
-  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
-}
-
-// Bar of progress
-.progress-bar {
-  float: left;
-  width: 0%;
-  height: 100%;
-  font-size: @font-size-small;
-  line-height: @line-height-computed;
-  color: @progress-bar-color;
-  text-align: center;
-  background-color: @progress-bar-bg;
-  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
-  .transition(width .6s ease);
-}
-
-// Striped bars
-.progress-striped .progress-bar {
-  #gradient > .striped();
-  background-size: 40px 40px;
-}
-
-// Call animation for the active one
-.progress.active .progress-bar {
-  .animation(progress-bar-stripes 2s linear infinite);
-}
-
-
-
-// Variations
-// -------------------------
-
-.progress-bar-success {
-  .progress-bar-variant(@progress-bar-success-bg);
-}
-
-.progress-bar-info {
-  .progress-bar-variant(@progress-bar-info-bg);
-}
-
-.progress-bar-warning {
-  .progress-bar-variant(@progress-bar-warning-bg);
-}
-
-.progress-bar-danger {
-  .progress-bar-variant(@progress-bar-danger-bg);
-}
diff --git a/src/main/less/reseditor/reseditor.less b/src/main/less/reseditor.less
similarity index 99%
rename from src/main/less/reseditor/reseditor.less
rename to src/main/less/reseditor.less
index 28c1e2a..acded44 100755
--- a/src/main/less/reseditor/reseditor.less
+++ b/src/main/less/reseditor.less
@@ -17,6 +17,8 @@
  * under the License.
  */
  
+ @import "../../../frontend/node_modules/bootstrap/less/bootstrap.less";
+ 
 /* ################################################################# */
 /* --- Overwriting Bootstrap styles ---  */
 /* ################################################################# */
diff --git a/src/main/less/reseditor/alerts.less b/src/main/less/reseditor/alerts.less
deleted file mode 100644
index cdaad6c..0000000
--- a/src/main/less/reseditor/alerts.less
+++ /dev/null
@@ -1,10 +0,0 @@
-.alert {
-  text-shadow: 1px 1px 0 rgba(255,255,255,.5);
-  .rounded(5px);
-  .plate-box-shadow;
-  .plate-margin;
-}
-
-.alert-warning {
-  .alert-variant(transparent; #AA6600; #AA6600);
-}
\ No newline at end of file
diff --git a/src/main/less/reseditor/buttons.less b/src/main/less/reseditor/buttons.less
deleted file mode 100644
index 59ad206..0000000
--- a/src/main/less/reseditor/buttons.less
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-// Buttons
-// --------------------------------------------------
-
-
-// Base styles
-// --------------------------------------------------
-
-#login_submit {
-	margin: 20px 0px;
-}
diff --git a/src/main/less/reseditor/forms.less b/src/main/less/reseditor/forms.less
deleted file mode 100644
index 86e5c90..0000000
--- a/src/main/less/reseditor/forms.less
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// Forms
-// --------------------------------------------------
-
-
-// FORM FIELD FEEDBACK STATES
-// --------------------------
-
-// Error
-#login .form-group.error {
-  display: none;
-}
-
-.control-label {
-	line-height: 24px;
-	color: #C0C0C0;
-	font-weight: normal;
-}
-
-.form-horizontal .form-group {
-	margin-left: 20px;
-	margin-right: 0px;
-}
-
-.form-control {
-	height: 27px;
-	padding: 0 10px;
-}
-
-.form-group {
-	margin-bottom: 0;
-}
-
-// vertical-form is a custom class
-.modal-body.vertical-form label {
-	display: block;
-}
\ No newline at end of file
diff --git a/src/main/less/reseditor/modals.less b/src/main/less/reseditor/modals.less
deleted file mode 100644
index 6ab15f0..0000000
--- a/src/main/less/reseditor/modals.less
+++ /dev/null
@@ -1,14 +0,0 @@
-//
-// Modals
-// --------------------------------------------------
-
-// Background
-
-// Base modal
-.modal {
-	background-color: transparent;
-}
-
-.modal-body, .modal-header {
-	text-shadow: none;
-}
\ No newline at end of file
diff --git a/src/main/less/reseditor/navs.less b/src/main/less/reseditor/navs.less
deleted file mode 100644
index 2a3b6cd..0000000
--- a/src/main/less/reseditor/navs.less
+++ /dev/null
@@ -1,63 +0,0 @@
-
-// TABS AND PILLS
-// -------------
-#login .nav {
-	margin-bottom: 10px;
-}
-#login .tabbable {
-  float: right;
-}
-
-#login .tab-content {
-  .border-radius(0, 7px, 7px, 0);
-  background-color: transparent;
-}
-
-#login .tab-pane.active {
-	margin-right: 20px;
-}
-
-#login .nav-tabs > li {
-  float: right;
-  margin-right: 15px;
-  background: transparent url(../img/alu.gif) repeat left top;
-  margin-top: 0px;
-}
-
-#login .nav-pills > li {
-  float: right;
-  margin: 5px 10px 0px 0px;
-  background: transparent url(../img/alu.gif) repeat left top;
-}
-
-#login .tabs-below > .nav-tabs > .active > a, #login .tabs-below > .nav-pills > .active > a {
-  border-color: transparent;
-}
-#login .nav-tabs > .active > a, #login .nav-pills > .active > a {
-  border: none;
-  color: @textColor;
-}
-#login .tabs-below > .nav-tabs {
-   border-top: 0px;
-}
-.nav > li > a {
-  padding: 5px 10px 5px 10px;
-}
-
-#login .nav-tabs > li > a {
-  .border-radius(0, 7px, 7px, 0);
-  .plate-background;
-  .plate-box-shadow;
-  margin-right: 0px;
-  padding: 0px 10px 5px 10px;
-  
-}
-
- #login .nav-pills > li > a  {
-  .border-radius(7px);
-  .plate-background;
-  .plate-box-shadow;
-  margin-right: 0px;
-  padding: 5px 10px 5px 10px;
-  
-}
diff --git a/src/main/less/reseditor/scaffolding.less b/src/main/less/reseditor/scaffolding.less
deleted file mode 100644
index 176b170..0000000
--- a/src/main/less/reseditor/scaffolding.less
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-// Scaffolding
-// --------------------------------------------------
-
-
-// Body reset
-// -------------------------
-
-body {
-  .plate-text-shadow;
-}
\ No newline at end of file
diff --git a/src/main/less/reseditor/variables.less b/src/main/less/reseditor/variables.less
deleted file mode 100644
index bd0a5a7..0000000
--- a/src/main/less/reseditor/variables.less
+++ /dev/null
@@ -1,17 +0,0 @@
-//== Colors
-//
-//## Gray and brand colors for use across Bootstrap.
-@brand-primary:         #2D373D;
-
-// Scaffolding
-// -------------------------
-@bodyBackground:	transparent;
-@textColor: #c0c0c0;
-
-// Links
-// -------------------------
-@linkColor:	#c0c0c0;
-
-// Forms
-// -------------------------
-@inputBorderRadius:             3px;
diff --git a/src/main/less/responsive-utilities.less b/src/main/less/responsive-utilities.less
deleted file mode 100644
index 027a264..0000000
--- a/src/main/less/responsive-utilities.less
+++ /dev/null
@@ -1,92 +0,0 @@
-//
-// Responsive: Utility classes
-// --------------------------------------------------
-
-
-// IE10 in Windows (Phone) 8
-//
-// Support for responsive views via media queries is kind of borked in IE10, for
-// Surface/desktop in split view and for Windows Phone 8. This particular fix
-// must be accompanied by a snippet of JavaScript to sniff the user agent and
-// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
-// our Getting Started page for more information on this bug.
-//
-// For more information, see the following:
-//
-// Issue: https://github.com/twbs/bootstrap/issues/10497
-// Docs: http://getbootstrap.com/getting-started/#browsers
-// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
-
-@-ms-viewport {
-  width: device-width;
-}
-
-
-// Visibility utilities
-.visible-xs,
-.visible-sm,
-.visible-md,
-.visible-lg {
-  .responsive-invisibility();
-}
-
-.visible-xs {
-  @media (max-width: @screen-xs-max) {
-    .responsive-visibility();
-  }
-}
-.visible-sm {
-  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
-    .responsive-visibility();
-  }
-}
-.visible-md {
-  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
-    .responsive-visibility();
-  }
-}
-.visible-lg {
-  @media (min-width: @screen-lg-min) {
-    .responsive-visibility();
-  }
-}
-
-.hidden-xs {
-  @media (max-width: @screen-xs-max) {
-    .responsive-invisibility();
-  }
-}
-.hidden-sm {
-  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
-    .responsive-invisibility();
-  }
-}
-.hidden-md {
-  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
-    .responsive-invisibility();
-  }
-}
-.hidden-lg {
-  @media (min-width: @screen-lg-min) {
-    .responsive-invisibility();
-  }
-}
-
-
-// Print utilities
-//
-// Media queries are placed on the inside to be mixin-friendly.
-
-.visible-print {
-  .responsive-invisibility();
-
-  @media print {
-    .responsive-visibility();
-  }
-}
-
-.hidden-print {
-  @media print {
-    .responsive-invisibility();
-  }
-}
diff --git a/src/main/less/scaffolding.less b/src/main/less/scaffolding.less
index fe29f2d..176b170 100644
--- a/src/main/less/scaffolding.less
+++ b/src/main/less/scaffolding.less
@@ -3,132 +3,9 @@
 // --------------------------------------------------
 
 
-// Reset the box-sizing
-//
-// Heads up! This reset may cause conflicts with some third-party widgets.
-// For recommendations on resolving such conflicts, see
-// http://getbootstrap.com/getting-started/#third-box-sizing
-* {
-  .box-sizing(border-box);
-}
-*:before,
-*:after {
-  .box-sizing(border-box);
-}
-
-
 // Body reset
-
-html {
-  font-size: 62.5%;
-  -webkit-tap-highlight-color: rgba(0,0,0,0);
-}
+// -------------------------
 
 body {
-  font-family: @font-family-base;
-  font-size: @font-size-base;
-  line-height: @line-height-base;
-  color: @text-color;
-  background-color: @body-bg;
-}
-
-// Reset fonts for relevant elements
-input,
-button,
-select,
-textarea {
-  font-family: inherit;
-  font-size: inherit;
-  line-height: inherit;
-}
-
-
-// Links
-
-a {
-  color: @link-color;
-  text-decoration: none;
-
-  &:hover,
-  &:focus {
-    color: @link-hover-color;
-    text-decoration: underline;
-  }
-
-  &:focus {
-    .tab-focus();
-  }
-}
-
-
-// Figures
-//
-// We reset this here because previously Normalize had no `figure` margins. This
-// ensures we don't break anyone's use of the element.
-
-figure {
-  margin: 0;
-}
-
-
-// Images
-
-img {
-  vertical-align: middle;
-}
-
-// Responsive images (ensure images don't scale beyond their parents)
-.img-responsive {
-  .img-responsive();
-}
-
-// Rounded corners
-.img-rounded {
-  border-radius: @border-radius-large;
-}
-
-// Image thumbnails
-//
-// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
-.img-thumbnail {
-  padding: @thumbnail-padding;
-  line-height: @line-height-base;
-  background-color: @thumbnail-bg;
-  border: 1px solid @thumbnail-border;
-  border-radius: @thumbnail-border-radius;
-  .transition(all .2s ease-in-out);
-
-  // Keep them at most 100% wide
-  .img-responsive(inline-block);
-}
-
-// Perfect circle
-.img-circle {
-  border-radius: 50%; // set radius in percents
-}
-
-
-// Horizontal rules
-
-hr {
-  margin-top:    @line-height-computed;
-  margin-bottom: @line-height-computed;
-  border: 0;
-  border-top: 1px solid @hr-border;
-}
-
-
-// Only display content to screen readers
-//
-// See: http://a11yproject.com/posts/how-to-hide-content/
-
-.sr-only {
-  position: absolute;
-  width: 1px;
-  height: 1px;
-  margin: -1px;
-  padding: 0;
-  overflow: hidden;
-  clip: rect(0,0,0,0);
-  border: 0;
-}
+  .plate-text-shadow;
+}
\ No newline at end of file
diff --git a/src/main/less/tables.less b/src/main/less/tables.less
deleted file mode 100644
index c41989c..0000000
--- a/src/main/less/tables.less
+++ /dev/null
@@ -1,233 +0,0 @@
-//
-// Tables
-// --------------------------------------------------
-
-
-table {
-  max-width: 100%;
-  background-color: @table-bg;
-}
-th {
-  text-align: left;
-}
-
-
-// Baseline styles
-
-.table {
-  width: 100%;
-  margin-bottom: @line-height-computed;
-  // Cells
-  > thead,
-  > tbody,
-  > tfoot {
-    > tr {
-      > th,
-      > td {
-        padding: @table-cell-padding;
-        line-height: @line-height-base;
-        vertical-align: top;
-        border-top: 1px solid @table-border-color;
-      }
-    }
-  }
-  // Bottom align for column headings
-  > thead > tr > th {
-    vertical-align: bottom;
-    border-bottom: 2px solid @table-border-color;
-  }
-  // Remove top border from thead by default
-  > caption + thead,
-  > colgroup + thead,
-  > thead:first-child {
-    > tr:first-child {
-      > th,
-      > td {
-        border-top: 0;
-      }
-    }
-  }
-  // Account for multiple tbody instances
-  > tbody + tbody {
-    border-top: 2px solid @table-border-color;
-  }
-
-  // Nesting
-  .table {
-    background-color: @body-bg;
-  }
-}
-
-
-// Condensed table w/ half padding
-
-.table-condensed {
-  > thead,
-  > tbody,
-  > tfoot {
-    > tr {
-      > th,
-      > td {
-        padding: @table-condensed-cell-padding;
-      }
-    }
-  }
-}
-
-
-// Bordered version
-//
-// Add borders all around the table and between all the columns.
-
-.table-bordered {
-  border: 1px solid @table-border-color;
-  > thead,
-  > tbody,
-  > tfoot {
-    > tr {
-      > th,
-      > td {
-        border: 1px solid @table-border-color;
-      }
-    }
-  }
-  > thead > tr {
-    > th,
-    > td {
-      border-bottom-width: 2px;
-    }
-  }
-}
-
-
-// Zebra-striping
-//
-// Default zebra-stripe styles (alternating gray and transparent backgrounds)
-
-.table-striped {
-  > tbody > tr:nth-child(odd) {
-    > td,
-    > th {
-      background-color: @table-bg-accent;
-    }
-  }
-}
-
-
-// Hover effect
-//
-// Placed here since it has to come after the potential zebra striping
-
-.table-hover {
-  > tbody > tr:hover {
-    > td,
-    > th {
-      background-color: @table-bg-hover;
-    }
-  }
-}
-
-
-// Table cell sizing
-//
-// Reset default table behavior
-
-table col[class*="col-"] {
-  position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)
-  float: none;
-  display: table-column;
-}
-table {
-  td,
-  th {
-    &[class*="col-"] {
-      position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)
-      float: none;
-      display: table-cell;
-    }
-  }
-}
-
-
-// Table backgrounds
-//
-// Exact selectors below required to override `.table-striped` and prevent
-// inheritance to nested tables.
-
-// Generate the contextual variants
-.table-row-variant(active; @table-bg-active);
-.table-row-variant(success; @state-success-bg);
-.table-row-variant(info; @state-info-bg);
-.table-row-variant(warning; @state-warning-bg);
-.table-row-variant(danger; @state-danger-bg);
-
-
-// Responsive tables
-//
-// Wrap your tables in `.table-responsive` and we'll make them mobile friendly
-// by enabling horizontal scrolling. Only applies <768px. Everything above that
-// will display normally.
-
-@media (max-width: @screen-xs-max) {
-  .table-responsive {
-    width: 100%;
-    margin-bottom: (@line-height-computed * 0.75);
-    overflow-y: hidden;
-    overflow-x: scroll;
-    -ms-overflow-style: -ms-autohiding-scrollbar;
-    border: 1px solid @table-border-color;
-    -webkit-overflow-scrolling: touch;
-
-    // Tighten up spacing
-    > .table {
-      margin-bottom: 0;
-
-      // Ensure the content doesn't wrap
-      > thead,
-      > tbody,
-      > tfoot {
-        > tr {
-          > th,
-          > td {
-            white-space: nowrap;
-          }
-        }
-      }
-    }
-
-    // Special overrides for the bordered tables
-    > .table-bordered {
-      border: 0;
-
-      // Nuke the appropriate borders so that the parent can handle them
-      > thead,
-      > tbody,
-      > tfoot {
-        > tr {
-          > th:first-child,
-          > td:first-child {
-            border-left: 0;
-          }
-          > th:last-child,
-          > td:last-child {
-            border-right: 0;
-          }
-        }
-      }
-
-      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since
-      // chances are there will be only one `tr` in a `thead` and that would
-      // remove the border altogether.
-      > tbody,
-      > tfoot {
-        > tr:last-child {
-          > th,
-          > td {
-            border-bottom: 0;
-          }
-        }
-      }
-
-    }
-  }
-}
diff --git a/src/main/less/theme.less b/src/main/less/theme.less
deleted file mode 100644
index 6f957fb..0000000
--- a/src/main/less/theme.less
+++ /dev/null
@@ -1,247 +0,0 @@
-
-//
-// Load core variables and mixins
-// --------------------------------------------------
-
-@import "variables.less";
-@import "mixins.less";
-
-
-
-//
-// Buttons
-// --------------------------------------------------
-
-// Common styles
-.btn-default,
-.btn-primary,
-.btn-success,
-.btn-info,
-.btn-warning,
-.btn-danger {
-  text-shadow: 0 -1px 0 rgba(0,0,0,.2);
-  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);
-  .box-shadow(@shadow);
-
-  // Reset the shadow
-  &:active,
-  &.active {
-    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
-  }
-}
-
-// Mixin for generating new styles
-.btn-styles(@btn-color: #555) {
-  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));
-  .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners
-  background-repeat: repeat-x;
-  border-color: darken(@btn-color, 14%);
-
-  &:hover,
-  &:focus  {
-    background-color: darken(@btn-color, 12%);
-    background-position: 0 -15px;
-  }
-
-  &:active,
-  &.active {
-    background-color: darken(@btn-color, 12%);
-    border-color: darken(@btn-color, 14%);
-  }
-}
-
-// Common styles
-.btn {
-  // Remove the gradient for the pressed/active state
-  &:active,
-  &.active {
-    background-image: none;
-  }
-}
-
-// Apply the mixin to the buttons
-.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
-.btn-primary { .btn-styles(@btn-primary-bg); }
-.btn-success { .btn-styles(@btn-success-bg); }
-.btn-info    { .btn-styles(@btn-info-bg); }
-.btn-warning { .btn-styles(@btn-warning-bg); }
-.btn-danger  { .btn-styles(@btn-danger-bg); }
-
-
-
-//
-// Images
-// --------------------------------------------------
-
-.thumbnail,
-.img-thumbnail {
-  .box-shadow(0 1px 2px rgba(0,0,0,.075));
-}
-
-
-
-//
-// Dropdowns
-// --------------------------------------------------
-
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
-  #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));
-  background-color: darken(@dropdown-link-hover-bg, 5%);
-}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
-  #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));
-  background-color: darken(@dropdown-link-active-bg, 5%);
-}
-
-
-
-//
-// Navbar
-// --------------------------------------------------
-
-// Default navbar
-.navbar-default {
-  #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);
-  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
-  border-radius: @navbar-border-radius;
-  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
-  .box-shadow(@shadow);
-
-  .navbar-nav > .active > a {
-    #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));
-    .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));
-  }
-}
-.navbar-brand,
-.navbar-nav > li > a {
-  text-shadow: 0 1px 0 rgba(255,255,255,.25);
-}
-
-// Inverted navbar
-.navbar-inverse {
-  #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);
-  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
-
-  .navbar-nav > .active > a {
-    #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));
-    .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));
-  }
-
-  .navbar-brand,
-  .navbar-nav > li > a {
-    text-shadow: 0 -1px 0 rgba(0,0,0,.25);
-  }
-}
-
-// Undo rounded corners in static and fixed navbars
-.navbar-static-top,
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  border-radius: 0;
-}
-
-
-
-//
-// Alerts
-// --------------------------------------------------
-
-// Common styles
-.alert {
-  text-shadow: 0 1px 0 rgba(255,255,255,.2);
-  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);
-  .box-shadow(@shadow);
-}
-
-// Mixin for generating new styles
-.alert-styles(@color) {
-  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));
-  border-color: darken(@color, 15%);
-}
-
-// Apply the mixin to the alerts
-.alert-success    { .alert-styles(@alert-success-bg); }
-.alert-info       { .alert-styles(@alert-info-bg); }
-.alert-warning    { .alert-styles(@alert-warning-bg); }
-.alert-danger     { .alert-styles(@alert-danger-bg); }
-
-
-
-//
-// Progress bars
-// --------------------------------------------------
-
-// Give the progress background some depth
-.progress {
-  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)
-}
-
-// Mixin for generating new styles
-.progress-bar-styles(@color) {
-  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));
-}
-
-// Apply the mixin to the progress bars
-.progress-bar            { .progress-bar-styles(@progress-bar-bg); }
-.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }
-.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }
-.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }
-.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }
-
-
-
-//
-// List groups
-// --------------------------------------------------
-
-.list-group {
-  border-radius: @border-radius-base;
-  .box-shadow(0 1px 2px rgba(0,0,0,.075));
-}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
-  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);
-  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));
-  border-color: darken(@list-group-active-border, 7.5%);
-}
-
-
-
-//
-// Panels
-// --------------------------------------------------
-
-// Common styles
-.panel {
-  .box-shadow(0 1px 2px rgba(0,0,0,.05));
-}
-
-// Mixin for generating new styles
-.panel-heading-styles(@color) {
-  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));
-}
-
-// Apply the mixin to the panel headings only
-.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }
-.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }
-.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }
-.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }
-.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }
-.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }
-
-
-
-//
-// Wells
-// --------------------------------------------------
-
-.well {
-  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);
-  border-color: darken(@well-bg, 10%);
-  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);
-  .box-shadow(@shadow);
-}
diff --git a/src/main/less/thumbnails.less b/src/main/less/thumbnails.less
deleted file mode 100644
index c428920..0000000
--- a/src/main/less/thumbnails.less
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// Thumbnails
-// --------------------------------------------------
-
-
-// Mixin and adjust the regular image class
-.thumbnail {
-  display: block;
-  padding: @thumbnail-padding;
-  margin-bottom: @line-height-computed;
-  line-height: @line-height-base;
-  background-color: @thumbnail-bg;
-  border: 1px solid @thumbnail-border;
-  border-radius: @thumbnail-border-radius;
-  .transition(all .2s ease-in-out);
-
-  > img,
-  a > img {
-    &:extend(.img-responsive);
-    margin-left: auto;
-    margin-right: auto;
-  }
-
-  // Add a hover state for linked versions only
-  a&:hover,
-  a&:focus,
-  a&.active {
-    border-color: @link-color;
-  }
-
-  // Image captions
-  .caption {
-    padding: @thumbnail-caption-padding;
-    color: @thumbnail-caption-color;
-  }
-}
diff --git a/src/main/less/tooltip.less b/src/main/less/tooltip.less
deleted file mode 100644
index bd62699..0000000
--- a/src/main/less/tooltip.less
+++ /dev/null
@@ -1,95 +0,0 @@
-//
-// Tooltips
-// --------------------------------------------------
-
-
-// Base class
-.tooltip {
-  position: absolute;
-  z-index: @zindex-tooltip;
-  display: block;
-  visibility: visible;
-  font-size: @font-size-small;
-  line-height: 1.4;
-  .opacity(0);
-
-  &.in     { .opacity(@tooltip-opacity); }
-  &.top    { margin-top:  -3px; padding: @tooltip-arrow-width 0; }
-  &.right  { margin-left:  3px; padding: 0 @tooltip-arrow-width; }
-  &.bottom { margin-top:   3px; padding: @tooltip-arrow-width 0; }
-  &.left   { margin-left: -3px; padding: 0 @tooltip-arrow-width; }
-}
-
-// Wrapper for the tooltip content
-.tooltip-inner {
-  max-width: @tooltip-max-width;
-  padding: 3px 8px;
-  color: @tooltip-color;
-  text-align: center;
-  text-decoration: none;
-  background-color: @tooltip-bg;
-  border-radius: @border-radius-base;
-}
-
-// Arrows
-.tooltip-arrow {
-  position: absolute;
-  width: 0;
-  height: 0;
-  border-color: transparent;
-  border-style: solid;
-}
-.tooltip {
-  &.top .tooltip-arrow {
-    bottom: 0;
-    left: 50%;
-    margin-left: -@tooltip-arrow-width;
-    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
-    border-top-color: @tooltip-arrow-color;
-  }
-  &.top-left .tooltip-arrow {
-    bottom: 0;
-    left: @tooltip-arrow-width;
-    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
-    border-top-color: @tooltip-arrow-color;
-  }
-  &.top-right .tooltip-arrow {
-    bottom: 0;
-    right: @tooltip-arrow-width;
-    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
-    border-top-color: @tooltip-arrow-color;
-  }
-  &.right .tooltip-arrow {
-    top: 50%;
-    left: 0;
-    margin-top: -@tooltip-arrow-width;
-    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;
-    border-right-color: @tooltip-arrow-color;
-  }
-  &.left .tooltip-arrow {
-    top: 50%;
-    right: 0;
-    margin-top: -@tooltip-arrow-width;
-    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;
-    border-left-color: @tooltip-arrow-color;
-  }
-  &.bottom .tooltip-arrow {
-    top: 0;
-    left: 50%;
-    margin-left: -@tooltip-arrow-width;
-    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
-    border-bottom-color: @tooltip-arrow-color;
-  }
-  &.bottom-left .tooltip-arrow {
-    top: 0;
-    left: @tooltip-arrow-width;
-    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
-    border-bottom-color: @tooltip-arrow-color;
-  }
-  &.bottom-right .tooltip-arrow {
-    top: 0;
-    right: @tooltip-arrow-width;
-    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
-    border-bottom-color: @tooltip-arrow-color;
-  }
-}
diff --git a/src/main/less/type.less b/src/main/less/type.less
deleted file mode 100644
index 5e2a219..0000000
--- a/src/main/less/type.less
+++ /dev/null
@@ -1,293 +0,0 @@
-//
-// Typography
-// --------------------------------------------------
-
-
-// Headings
-// -------------------------
-
-h1, h2, h3, h4, h5, h6,
-.h1, .h2, .h3, .h4, .h5, .h6 {
-  font-family: @headings-font-family;
-  font-weight: @headings-font-weight;
-  line-height: @headings-line-height;
-  color: @headings-color;
-
-  small,
-  .small {
-    font-weight: normal;
-    line-height: 1;
-    color: @headings-small-color;
-  }
-}
-
-h1, .h1,
-h2, .h2,
-h3, .h3 {
-  margin-top: @line-height-computed;
-  margin-bottom: (@line-height-computed / 2);
-
-  small,
-  .small {
-    font-size: 65%;
-  }
-}
-h4, .h4,
-h5, .h5,
-h6, .h6 {
-  margin-top: (@line-height-computed / 2);
-  margin-bottom: (@line-height-computed / 2);
-
-  small,
-  .small {
-    font-size: 75%;
-  }
-}
-
-h1, .h1 { font-size: @font-size-h1; }
-h2, .h2 { font-size: @font-size-h2; }
-h3, .h3 { font-size: @font-size-h3; }
-h4, .h4 { font-size: @font-size-h4; }
-h5, .h5 { font-size: @font-size-h5; }
-h6, .h6 { font-size: @font-size-h6; }
-
-
-// Body text
-// -------------------------
-
-p {
-  margin: 0 0 (@line-height-computed / 2);
-}
-
-.lead {
-  margin-bottom: @line-height-computed;
-  font-size: floor((@font-size-base * 1.15));
-  font-weight: 200;
-  line-height: 1.4;
-
-  @media (min-width: @screen-sm-min) {
-    font-size: (@font-size-base * 1.5);
-  }
-}
-
-
-// Emphasis & misc
-// -------------------------
-
-// Ex: 14px base font * 85% = about 12px
-small,
-.small  { font-size: 85%; }
-
-// Undo browser default styling
-cite    { font-style: normal; }
-
-// Alignment
-.text-left           { text-align: left; }
-.text-right          { text-align: right; }
-.text-center         { text-align: center; }
-.text-justify        { text-align: justify; }
-
-// Contextual colors
-.text-muted {
-  color: @text-muted;
-}
-.text-primary {
-  .text-emphasis-variant(@brand-primary);
-}
-.text-success {
-  .text-emphasis-variant(@state-success-text);
-}
-.text-info {
-  .text-emphasis-variant(@state-info-text);
-}
-.text-warning {
-  .text-emphasis-variant(@state-warning-text);
-}
-.text-danger {
-  .text-emphasis-variant(@state-danger-text);
-}
-
-// Contextual backgrounds
-// For now we'll leave these alongside the text classes until v4 when we can
-// safely shift things around (per SemVer rules).
-.bg-primary {
-  // Given the contrast here, this is the only class to have its color inverted
-  // automatically.
-  color: #fff;
-  .bg-variant(@brand-primary);
-}
-.bg-success {
-  .bg-variant(@state-success-bg);
-}
-.bg-info {
-  .bg-variant(@state-info-bg);
-}
-.bg-warning {
-  .bg-variant(@state-warning-bg);
-}
-.bg-danger {
-  .bg-variant(@state-danger-bg);
-}
-
-
-// Page header
-// -------------------------
-
-.page-header {
-  padding-bottom: ((@line-height-computed / 2) - 1);
-  margin: (@line-height-computed * 2) 0 @line-height-computed;
-  border-bottom: 1px solid @page-header-border-color;
-}
-
-
-// Lists
-// --------------------------------------------------
-
-// Unordered and Ordered lists
-ul,
-ol {
-  margin-top: 0;
-  margin-bottom: (@line-height-computed / 2);
-  ul,
-  ol {
-    margin-bottom: 0;
-  }
-}
-
-// List options
-
-// Unstyled keeps list items block level, just removes default browser padding and list-style
-.list-unstyled {
-  padding-left: 0;
-  list-style: none;
-}
-
-// Inline turns list items into inline-block
-.list-inline {
-  .list-unstyled();
-  margin-left: -5px;
-
-  > li {
-    display: inline-block;
-    padding-left: 5px;
-    padding-right: 5px;
-  }
-}
-
-// Description Lists
-dl {
-  margin-top: 0; // Remove browser default
-  margin-bottom: @line-height-computed;
-}
-dt,
-dd {
-  line-height: @line-height-base;
-}
-dt {
-  font-weight: bold;
-}
-dd {
-  margin-left: 0; // Undo browser default
-}
-
-// Horizontal description lists
-//
-// Defaults to being stacked without any of the below styles applied, until the
-// grid breakpoint is reached (default of ~768px).
-
-@media (min-width: @grid-float-breakpoint) {
-  .dl-horizontal {
-    dt {
-      float: left;
-      width: (@component-offset-horizontal - 20);
-      clear: left;
-      text-align: right;
-      .text-overflow();
-    }
-    dd {
-      margin-left: @component-offset-horizontal;
-      &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present
-    }
-  }
-}
-
-// MISC
-// ----
-
-// Abbreviations and acronyms
-abbr[title],
-// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
-abbr[data-original-title] {
-  cursor: help;
-  border-bottom: 1px dotted @abbr-border-color;
-}
-.initialism {
-  font-size: 90%;
-  text-transform: uppercase;
-}
-
-// Blockquotes
-blockquote {
-  padding: (@line-height-computed / 2) @line-height-computed;
-  margin: 0 0 @line-height-computed;
-  font-size: @blockquote-font-size;
-  border-left: 5px solid @blockquote-border-color;
-
-  p,
-  ul,
-  ol {
-    &:last-child {
-      margin-bottom: 0;
-    }
-  }
-
-  // Note: Deprecated small and .small as of v3.1.0
-  // Context: https://github.com/twbs/bootstrap/issues/11660
-  footer,
-  small,
-  .small {
-    display: block;
-    font-size: 80%; // back to default font-size
-    line-height: @line-height-base;
-    color: @blockquote-small-color;
-
-    &:before {
-      content: '\2014 \00A0'; // em dash, nbsp
-    }
-  }
-}
-
-// Opposite alignment of blockquote
-//
-// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.
-.blockquote-reverse,
-blockquote.pull-right {
-  padding-right: 15px;
-  padding-left: 0;
-  border-right: 5px solid @blockquote-border-color;
-  border-left: 0;
-  text-align: right;
-
-  // Account for citation
-  footer,
-  small,
-  .small {
-    &:before { content: ''; }
-    &:after {
-      content: '\00A0 \2014'; // nbsp, em dash
-    }
-  }
-}
-
-// Quotes
-blockquote:before,
-blockquote:after {
-  content: "";
-}
-
-// Addresses
-address {
-  margin-bottom: @line-height-computed;
-  font-style: normal;
-  line-height: @line-height-base;
-}
diff --git a/src/main/less/utilities.less b/src/main/less/utilities.less
deleted file mode 100644
index a260312..0000000
--- a/src/main/less/utilities.less
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-// Utility classes
-// --------------------------------------------------
-
-
-// Floats
-// -------------------------
-
-.clearfix {
-  .clearfix();
-}
-.center-block {
-  .center-block();
-}
-.pull-right {
-  float: right !important;
-}
-.pull-left {
-  float: left !important;
-}
-
-
-// Toggling content
-// -------------------------
-
-// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
-.hide {
-  display: none !important;
-}
-.show {
-  display: block !important;
-}
-.invisible {
-  visibility: hidden;
-}
-.text-hide {
-  .text-hide();
-}
-
-
-// Hide from screenreaders and browsers
-//
-// Credit: HTML5 Boilerplate
-
-.hidden {
-  display: none !important;
-  visibility: hidden !important;
-}
-
-
-// For Affix plugin
-// -------------------------
-
-.affix {
-  position: fixed;
-}
diff --git a/src/main/less/variables.less b/src/main/less/variables.less
index 3846adc..bd0a5a7 100644
--- a/src/main/less/variables.less
+++ b/src/main/less/variables.less
@@ -1,829 +1,17 @@
-//
-// Variables
-// --------------------------------------------------
-
-
 //== Colors
 //
 //## Gray and brand colors for use across Bootstrap.
+@brand-primary:         #2D373D;
 
-@gray-darker:            lighten(#000, 13.5%); // #222
-@gray-dark:              lighten(#000, 20%);   // #333
-@gray:                   lighten(#000, 33.5%); // #555
-@gray-light:             lighten(#000, 60%);   // #999
-@gray-lighter:           lighten(#000, 93.5%); // #eee
-
-@brand-primary:         #428bca;
-@brand-success:         #5cb85c;
-@brand-info:            #5bc0de;
-@brand-warning:         #f0ad4e;
-@brand-danger:          #d9534f;
-
-
-//== Scaffolding
-//
-// ## Settings for some of the most global styles.
-
-//** Background color for `<body>`.
-@body-bg:               #fff;
-//** Global text color on `<body>`.
-@text-color:            @gray-dark;
-
-//** Global textual link color.
-@link-color:            @brand-primary;
-//** Link hover color set via `darken()` function.
-@link-hover-color:      darken(@link-color, 15%);
-
-
-//== Typography
-//
-//## Font, line-height, and color for body text, headings, and more.
-
-@font-family-sans-serif:  "Helvetica Neue", Helvetica, Arial, sans-serif;
-@font-family-serif:       Georgia, "Times New Roman", Times, serif;
-//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
-@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
-@font-family-base:        @font-family-sans-serif;
-
-@font-size-base:          14px;
-@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
-@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
-
-@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px
-@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px
-@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px
-@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px
-@font-size-h5:            @font-size-base;
-@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px
-
-//** Unit-less `line-height` for use in components like buttons.
-@line-height-base:        1.428571429; // 20/14
-//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
-@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
-
-//** By default, this inherits from the `<body>`.
-@headings-font-family:    inherit;
-@headings-font-weight:    500;
-@headings-line-height:    1.1;
-@headings-color:          inherit;
-
-
-//-- Iconography
-//
-//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.
-
-@icon-font-path:          "../fonts/";
-@icon-font-name:          "glyphicons-halflings-regular";
-@icon-font-svg-id:        "glyphicons_halflingsregular";
-
-//== Components
-//
-//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
-
-@padding-base-vertical:     6px;
-@padding-base-horizontal:   12px;
-
-@padding-large-vertical:    10px;
-@padding-large-horizontal:  16px;
-
-@padding-small-vertical:    5px;
-@padding-small-horizontal:  10px;
-
-@padding-xs-vertical:       1px;
-@padding-xs-horizontal:     5px;
-
-@line-height-large:         1.33;
-@line-height-small:         1.5;
-
-@border-radius-base:        4px;
-@border-radius-large:       6px;
-@border-radius-small:       3px;
-
-//** Global color for active items (e.g., navs or dropdowns).
-@component-active-color:    #fff;
-//** Global background color for active items (e.g., navs or dropdowns).
-@component-active-bg:       @brand-primary;
-
-//** Width of the `border` for generating carets that indicator dropdowns.
-@caret-width-base:          4px;
-//** Carets increase slightly in size for larger components.
-@caret-width-large:         5px;
-
-
-//== Tables
-//
-//## Customizes the `.table` component with basic values, each used across all table variations.
-
-//** Padding for `<th>`s and `<td>`s.
-@table-cell-padding:            8px;
-//** Padding for cells in `.table-condensed`.
-@table-condensed-cell-padding:  5px;
-
-//** Default background color used for all tables.
-@table-bg:                      transparent;
-//** Background color used for `.table-striped`.
-@table-bg-accent:               #f9f9f9;
-//** Background color used for `.table-hover`.
-@table-bg-hover:                #f5f5f5;
-@table-bg-active:               @table-bg-hover;
-
-//** Border color for table and cell borders.
-@table-border-color:            #ddd;
-
-
-//== Buttons
-//
-//## For each of Bootstrap's buttons, define text, background and border color.
-
-@btn-font-weight:                normal;
-
-@btn-default-color:              #333;
-@btn-default-bg:                 #fff;
-@btn-default-border:             #ccc;
-
-@btn-primary-color:              #fff;
-@btn-primary-bg:                 @brand-primary;
-@btn-primary-border:             darken(@btn-primary-bg, 5%);
-
-@btn-success-color:              #fff;
-@btn-success-bg:                 @brand-success;
-@btn-success-border:             darken(@btn-success-bg, 5%);
-
-@btn-info-color:                 #fff;
-@btn-info-bg:                    @brand-info;
-@btn-info-border:                darken(@btn-info-bg, 5%);
-
-@btn-warning-color:              #fff;
-@btn-warning-bg:                 @brand-warning;
-@btn-warning-border:             darken(@btn-warning-bg, 5%);
-
-@btn-danger-color:               #fff;
-@btn-danger-bg:                  @brand-danger;
-@btn-danger-border:              darken(@btn-danger-bg, 5%);
-
-@btn-link-disabled-color:        @gray-light;
-
-
-//== Forms
-//
-//##
-
-//** `<input>` background color
-@input-bg:                       #fff;
-//** `<input disabled>` background color
-@input-bg-disabled:              @gray-lighter;
-
-//** Text color for `<input>`s
-@input-color:                    @gray;
-//** `<input>` border color
-@input-border:                   #ccc;
-//** `<input>` border radius
-@input-border-radius:            @border-radius-base;
-//** Border color for inputs on focus
-@input-border-focus:             #66afe9;
-
-//** Placeholder text color
-@input-color-placeholder:        @gray-light;
-
-//** Default `.form-control` height
-@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
-//** Large `.form-control` height
-@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
-//** Small `.form-control` height
-@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
-
-@legend-color:                   @gray-dark;
-@legend-border-color:            #e5e5e5;
-
-//** Background color for textual input addons
-@input-group-addon-bg:           @gray-lighter;
-//** Border color for textual input addons
-@input-group-addon-border-color: @input-border;
-
-
-//== Dropdowns
-//
-//## Dropdown menu container and contents.
-
-//** Background for the dropdown menu.
-@dropdown-bg:                    #fff;
-//** Dropdown menu `border-color`.
-@dropdown-border:                rgba(0,0,0,.15);
-//** Dropdown menu `border-color` **for IE8**.
-@dropdown-fallback-border:       #ccc;
-//** Divider color for between dropdown items.
-@dropdown-divider-bg:            #e5e5e5;
-
-//** Dropdown link text color.
-@dropdown-link-color:            @gray-dark;
-//** Hover color for dropdown links.
-@dropdown-link-hover-color:      darken(@gray-dark, 5%);
-//** Hover background for dropdown links.
-@dropdown-link-hover-bg:         #f5f5f5;
-
-//** Active dropdown menu item text color.
-@dropdown-link-active-color:     @component-active-color;
-//** Active dropdown menu item background color.
-@dropdown-link-active-bg:        @component-active-bg;
-
-//** Disabled dropdown menu item background color.
-@dropdown-link-disabled-color:   @gray-light;
-
-//** Text color for headers within dropdown menus.
-@dropdown-header-color:          @gray-light;
-
-// Note: Deprecated @dropdown-caret-color as of v3.1.0
-@dropdown-caret-color:           #000;
-
-
-//-- Z-index master list
-//
-// Warning: Avoid customizing these values. They're used for a bird's eye view
-// of components dependent on the z-axis and are designed to all work together.
-//
-// Note: These variables are not generated into the Customizer.
-
-@zindex-navbar:            1000;
-@zindex-dropdown:          1000;
-@zindex-popover:           1010;
-@zindex-tooltip:           1030;
-@zindex-navbar-fixed:      1030;
-@zindex-modal-background:  1040;
-@zindex-modal:             1050;
-
-
-//== Media queries breakpoints
-//
-//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
-
-// Extra small screen / phone
-// Note: Deprecated @screen-xs and @screen-phone as of v3.0.1
-@screen-xs:                  480px;
-@screen-xs-min:              @screen-xs;
-@screen-phone:               @screen-xs-min;
-
-// Small screen / tablet
-// Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1
-@screen-sm:                  768px;
-@screen-sm-min:              @screen-sm;
-@screen-tablet:              @screen-sm-min;
-
-// Medium screen / desktop
-// Note: Deprecated @screen-md and @screen-desktop as of v3.0.1
-@screen-md:                  992px;
-@screen-md-min:              @screen-md;
-@screen-desktop:             @screen-md-min;
-
-// Large screen / wide desktop
-// Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1
-@screen-lg:                  1200px;
-@screen-lg-min:              @screen-lg;
-@screen-lg-desktop:          @screen-lg-min;
-
-// So media queries don't overlap when required, provide a maximum
-@screen-xs-max:              (@screen-sm-min - 1);
-@screen-sm-max:              (@screen-md-min - 1);
-@screen-md-max:              (@screen-lg-min - 1);
-
-
-//== Grid system
-//
-//## Define your custom responsive grid.
-
-//** Number of columns in the grid.
-@grid-columns:              12;
-//** Padding between columns. Gets divided in half for the left and right.
-@grid-gutter-width:         30px;
-// Navbar collapse
-//** Point at which the navbar becomes uncollapsed.
-@grid-float-breakpoint:     @screen-sm-min;
-//** Point at which the navbar begins collapsing.
-@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
-
-
-//== Container sizes
-//
-//## Define the maximum width of `.container` for different screen sizes.
-
-// Small screen / tablet
-@container-tablet:             ((720px + @grid-gutter-width));
-//** For `@screen-sm-min` and up.
-@container-sm:                 @container-tablet;
-
-// Medium screen / desktop
-@container-desktop:            ((940px + @grid-gutter-width));
-//** For `@screen-md-min` and up.
-@container-md:                 @container-desktop;
-
-// Large screen / wide desktop
-@container-large-desktop:      ((1140px + @grid-gutter-width));
-//** For `@screen-lg-min` and up.
-@container-lg:                 @container-large-desktop;
-
-
-//== Navbar
-//
-//##
-
-// Basics of a navbar
-@navbar-height:                    50px;
-@navbar-margin-bottom:             @line-height-computed;
-@navbar-border-radius:             @border-radius-base;
-@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
-@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
-@navbar-collapse-max-height:       340px;
-
-@navbar-default-color:             #777;
-@navbar-default-bg:                #f8f8f8;
-@navbar-default-border:            darken(@navbar-default-bg, 6.5%);
-
-// Navbar links
-@navbar-default-link-color:                #777;
-@navbar-default-link-hover-color:          #333;
-@navbar-default-link-hover-bg:             transparent;
-@navbar-default-link-active-color:         #555;
-@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);
-@navbar-default-link-disabled-color:       #ccc;
-@navbar-default-link-disabled-bg:          transparent;
-
-// Navbar brand label
-@navbar-default-brand-color:               @navbar-default-link-color;
-@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);
-@navbar-default-brand-hover-bg:            transparent;
-
-// Navbar toggle
-@navbar-default-toggle-hover-bg:           #ddd;
-@navbar-default-toggle-icon-bar-bg:        #888;
-@navbar-default-toggle-border-color:       #ddd;
-
-
-// Inverted navbar
-// Reset inverted navbar basics
-@navbar-inverse-color:                      @gray-light;
-@navbar-inverse-bg:                         #222;
-@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);
-
-// Inverted navbar links
-@navbar-inverse-link-color:                 @gray-light;
-@navbar-inverse-link-hover-color:           #fff;
-@navbar-inverse-link-hover-bg:              transparent;
-@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
-@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);
-@navbar-inverse-link-disabled-color:        #444;
-@navbar-inverse-link-disabled-bg:           transparent;
-
-// Inverted navbar brand label
-@navbar-inverse-brand-color:                @navbar-inverse-link-color;
-@navbar-inverse-brand-hover-color:          #fff;
-@navbar-inverse-brand-hover-bg:             transparent;
-
-// Inverted navbar toggle
-@navbar-inverse-toggle-hover-bg:            #333;
-@navbar-inverse-toggle-icon-bar-bg:         #fff;
-@navbar-inverse-toggle-border-color:        #333;
-
-
-//== Navs
-//
-//##
-
-//=== Shared nav styles
-@nav-link-padding:                          10px 15px;
-@nav-link-hover-bg:                         @gray-lighter;
-
-@nav-disabled-link-color:                   @gray-light;
-@nav-disabled-link-hover-color:             @gray-light;
-
-@nav-open-link-hover-color:                 #fff;
-
-//== Tabs
-@nav-tabs-border-color:                     #ddd;
-
-@nav-tabs-link-hover-border-color:          @gray-lighter;
-
-@nav-tabs-active-link-hover-bg:             @body-bg;
-@nav-tabs-active-link-hover-color:          @gray;
-@nav-tabs-active-link-hover-border-color:   #ddd;
-
-@nav-tabs-justified-link-border-color:            #ddd;
-@nav-tabs-justified-active-link-border-color:     @body-bg;
-
-//== Pills
-@nav-pills-border-radius:                   @border-radius-base;
-@nav-pills-active-link-hover-bg:            @component-active-bg;
-@nav-pills-active-link-hover-color:         @component-active-color;
-
-
-//== Pagination
-//
-//##
-
-@pagination-color:                     @link-color;
-@pagination-bg:                        #fff;
-@pagination-border:                    #ddd;
-
-@pagination-hover-color:               @link-hover-color;
-@pagination-hover-bg:                  @gray-lighter;
-@pagination-hover-border:              #ddd;
-
-@pagination-active-color:              #fff;
-@pagination-active-bg:                 @brand-primary;
-@pagination-active-border:             @brand-primary;
-
-@pagination-disabled-color:            @gray-light;
-@pagination-disabled-bg:               #fff;
-@pagination-disabled-border:           #ddd;
-
-
-//== Pager
-//
-//##
-
-@pager-bg:                             @pagination-bg;
-@pager-border:                         @pagination-border;
-@pager-border-radius:                  15px;
-
-@pager-hover-bg:                       @pagination-hover-bg;
-
-@pager-active-bg:                      @pagination-active-bg;
-@pager-active-color:                   @pagination-active-color;
-
-@pager-disabled-color:                 @pagination-disabled-color;
-
-
-//== Jumbotron
-//
-//##
-
-@jumbotron-padding:              30px;
-@jumbotron-color:                inherit;
-@jumbotron-bg:                   @gray-lighter;
-@jumbotron-heading-color:        inherit;
-@jumbotron-font-size:            ceil((@font-size-base * 1.5));
-
-
-//== Form states and alerts
-//
-//## Define colors for form feedback states and, by default, alerts.
-
-@state-success-text:             #3c763d;
-@state-success-bg:               #dff0d8;
-@state-success-border:           darken(spin(@state-success-bg, -10), 5%);
-
-@state-info-text:                #31708f;
-@state-info-bg:                  #d9edf7;
-@state-info-border:              darken(spin(@state-info-bg, -10), 7%);
-
-@state-warning-text:             #8a6d3b;
-@state-warning-bg:               #fcf8e3;
-@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);
-
-@state-danger-text:              #a94442;
-@state-danger-bg:                #f2dede;
-@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);
-
-
-//== Tooltips
-//
-//##
-
-//** Tooltip max width
-@tooltip-max-width:           200px;
-//** Tooltip text color
-@tooltip-color:               #fff;
-//** Tooltip background color
-@tooltip-bg:                  #000;
-@tooltip-opacity:             .9;
-
-//** Tooltip arrow width
-@tooltip-arrow-width:         5px;
-//** Tooltip arrow color
-@tooltip-arrow-color:         @tooltip-bg;
-
-
-//== Popovers
-//
-//##
-
-//** Popover body background color
-@popover-bg:                          #fff;
-//** Popover maximum width
-@popover-max-width:                   276px;
-//** Popover border color
-@popover-border-color:                rgba(0,0,0,.2);
-//** Popover fallback border color
-@popover-fallback-border-color:       #ccc;
-
-//** Popover title background color
-@popover-title-bg:                    darken(@popover-bg, 3%);
-
-//** Popover arrow width
-@popover-arrow-width:                 10px;
-//** Popover arrow color
-@popover-arrow-color:                 #fff;
-
-//** Popover outer arrow width
-@popover-arrow-outer-width:           (@popover-arrow-width + 1);
-//** Popover outer arrow color
-@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
-//** Popover outer arrow fallback color
-@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
-
-
-//== Labels
-//
-//##
-
-//** Default label background color
-@label-default-bg:            @gray-light;
-//** Primary label background color
-@label-primary-bg:            @brand-primary;
-//** Success label background color
-@label-success-bg:            @brand-success;
-//** Info label background color
-@label-info-bg:               @brand-info;
-//** Warning label background color
-@label-warning-bg:            @brand-warning;
-//** Danger label background color
-@label-danger-bg:             @brand-danger;
-
-//** Default label text color
-@label-color:                 #fff;
-//** Default text color of a linked label
-@label-link-hover-color:      #fff;
-
-
-//== Modals
-//
-//##
-
-//** Padding applied to the modal body
-@modal-inner-padding:         20px;
-
-//** Padding applied to the modal title
-@modal-title-padding:         15px;
-//** Modal title line-height
-@modal-title-line-height:     @line-height-base;
-
-//** Background color of modal content area
-@modal-content-bg:                             #fff;
-//** Modal content border color
-@modal-content-border-color:                   rgba(0,0,0,.2);
-//** Modal content border color **for IE8**
-@modal-content-fallback-border-color:          #999;
-
-//** Modal backdrop background color
-@modal-backdrop-bg:           #000;
-//** Modal backdrop opacity
-@modal-backdrop-opacity:      .5;
-//** Modal header border color
-@modal-header-border-color:   #e5e5e5;
-//** Modal footer border color
-@modal-footer-border-color:   @modal-header-border-color;
-
-@modal-lg:                    900px;
-@modal-md:                    600px;
-@modal-sm:                    300px;
-
-
-//== Alerts
-//
-//## Define alert colors, border radius, and padding.
-
-@alert-padding:               15px;
-@alert-border-radius:         @border-radius-base;
-@alert-link-font-weight:      bold;
-
-@alert-success-bg:            @state-success-bg;
-@alert-success-text:          @state-success-text;
-@alert-success-border:        @state-success-border;
-
-@alert-info-bg:               @state-info-bg;
-@alert-info-text:             @state-info-text;
-@alert-info-border:           @state-info-border;
-
-@alert-warning-bg:            @state-warning-bg;
-@alert-warning-text:          @state-warning-text;
-@alert-warning-border:        @state-warning-border;
-
-@alert-danger-bg:             @state-danger-bg;
-@alert-danger-text:           @state-danger-text;
-@alert-danger-border:         @state-danger-border;
-
-
-//== Progress bars
-//
-//##
-
-//** Background color of the whole progress component
-@progress-bg:                 #f5f5f5;
-//** Progress bar text color
-@progress-bar-color:          #fff;
-
-//** Default progress bar color
-@progress-bar-bg:             @brand-primary;
-//** Success progress bar color
-@progress-bar-success-bg:     @brand-success;
-//** Warning progress bar color
-@progress-bar-warning-bg:     @brand-warning;
-//** Danger progress bar color
-@progress-bar-danger-bg:      @brand-danger;
-//** Info progress bar color
-@progress-bar-info-bg:        @brand-info;
-
-
-//== List group
-//
-//##
-
-//** Background color on `.list-group-item`
-@list-group-bg:                 #fff;
-//** `.list-group-item` border color
-@list-group-border:             #ddd;
-//** List group border radius
-@list-group-border-radius:      @border-radius-base;
-
-//** Background color of single list elements on hover
-@list-group-hover-bg:           #f5f5f5;
-//** Text color of active list elements
-@list-group-active-color:       @component-active-color;
-//** Background color of active list elements
-@list-group-active-bg:          @component-active-bg;
-//** Border color of active list elements
-@list-group-active-border:      @list-group-active-bg;
-@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
-
-@list-group-link-color:         #555;
-@list-group-link-heading-color: #333;
-
-
-//== Panels
-//
-//##
-
-@panel-bg:                    #fff;
-@panel-body-padding:          15px;
-@panel-border-radius:         @border-radius-base;
-
-//** Border color for elements within panels
-@panel-inner-border:          #ddd;
-@panel-footer-bg:             #f5f5f5;
-
-@panel-default-text:          @gray-dark;
-@panel-default-border:        #ddd;
-@panel-default-heading-bg:    #f5f5f5;
-
-@panel-primary-text:          #fff;
-@panel-primary-border:        @brand-primary;
-@panel-primary-heading-bg:    @brand-primary;
-
-@panel-success-text:          @state-success-text;
-@panel-success-border:        @state-success-border;
-@panel-success-heading-bg:    @state-success-bg;
-
-@panel-info-text:             @state-info-text;
-@panel-info-border:           @state-info-border;
-@panel-info-heading-bg:       @state-info-bg;
-
-@panel-warning-text:          @state-warning-text;
-@panel-warning-border:        @state-warning-border;
-@panel-warning-heading-bg:    @state-warning-bg;
-
-@panel-danger-text:           @state-danger-text;
-@panel-danger-border:         @state-danger-border;
-@panel-danger-heading-bg:     @state-danger-bg;
-
-
-//== Thumbnails
-//
-//##
-
-//** Padding around the thumbnail image
-@thumbnail-padding:           4px;
-//** Thumbnail background color
-@thumbnail-bg:                @body-bg;
-//** Thumbnail border color
-@thumbnail-border:            #ddd;
-//** Thumbnail border radius
-@thumbnail-border-radius:     @border-radius-base;
-
-//** Custom text color for thumbnail captions
-@thumbnail-caption-color:     @text-color;
-//** Padding around the thumbnail caption
-@thumbnail-caption-padding:   9px;
-
-
-//== Wells
-//
-//##
-
-@well-bg:                     #f5f5f5;
-@well-border:                 darken(@well-bg, 7%);
-
-
-//== Badges
-//
-//##
-
-@badge-color:                 #fff;
-//** Linked badge text color on hover
-@badge-link-hover-color:      #fff;
-@badge-bg:                    @gray-light;
-
-//** Badge text color in active nav link
-@badge-active-color:          @link-color;
-//** Badge background color in active nav link
-@badge-active-bg:             #fff;
-
-@badge-font-weight:           bold;
-@badge-line-height:           1;
-@badge-border-radius:         10px;
-
-
-//== Breadcrumbs
-//
-//##
-
-@breadcrumb-padding-vertical:   8px;
-@breadcrumb-padding-horizontal: 15px;
-//** Breadcrumb background color
-@breadcrumb-bg:                 #f5f5f5;
-//** Breadcrumb text color
-@breadcrumb-color:              #ccc;
-//** Text color of current page in the breadcrumb
-@breadcrumb-active-color:       @gray-light;
-//** Textual separator for between breadcrumb elements
-@breadcrumb-separator:          "/";
-
-
-//== Carousel
-//
-//##
-
-@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
-
-@carousel-control-color:                      #fff;
-@carousel-control-width:                      15%;
-@carousel-control-opacity:                    .5;
-@carousel-control-font-size:                  20px;
-
-@carousel-indicator-active-bg:                #fff;
-@carousel-indicator-border-color:             #fff;
-
-@carousel-caption-color:                      #fff;
-
-
-//== Close
-//
-//##
-
-@close-font-weight:           bold;
-@close-color:                 #000;
-@close-text-shadow:           0 1px 0 #fff;
-
-
-//== Code
-//
-//##
-
-@code-color:                  #c7254e;
-@code-bg:                     #f9f2f4;
-
-@kbd-color:                   #fff;
-@kbd-bg:                      #333;
-
-@pre-bg:                      #f5f5f5;
-@pre-color:                   @gray-dark;
-@pre-border-color:            #ccc;
-@pre-scrollable-max-height:   340px;
-
-
-//== Type
-//
-//##
-
-//** Text muted color
-@text-muted:                  @gray-light;
-//** Abbreviations and acronyms border color
-@abbr-border-color:           @gray-light;
-//** Headings small color
-@headings-small-color:        @gray-light;
-//** Blockquote small color
-@blockquote-small-color:      @gray-light;
-//** Blockquote font size
-@blockquote-font-size:        (@font-size-base * 1.25);
-//** Blockquote border color
-@blockquote-border-color:     @gray-lighter;
-//** Page header border color
-@page-header-border-color:    @gray-lighter;
-
-
-//== Miscellaneous
-//
-//##
+// Scaffolding
+// -------------------------
+@bodyBackground:	transparent;
+@textColor: #c0c0c0;
 
-//** Horizontal line color.
-@hr-border:                   @gray-lighter;
+// Links
+// -------------------------
+@linkColor:	#c0c0c0;
 
-//** Horizontal offset for forms and lists.
-@component-offset-horizontal: 180px;
+// Forms
+// -------------------------
+@inputBorderRadius:             3px;
diff --git a/src/main/less/wells.less b/src/main/less/wells.less
deleted file mode 100644
index 15d072b..0000000
--- a/src/main/less/wells.less
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Wells
-// --------------------------------------------------
-
-
-// Base class
-.well {
-  min-height: 20px;
-  padding: 19px;
-  margin-bottom: 20px;
-  background-color: @well-bg;
-  border: 1px solid @well-border;
-  border-radius: @border-radius-base;
-  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
-  blockquote {
-    border-color: #ddd;
-    border-color: rgba(0,0,0,.15);
-  }
-}
-
-// Sizes
-.well-lg {
-  padding: 24px;
-  border-radius: @border-radius-large;
-}
-.well-sm {
-  padding: 9px;
-  border-radius: @border-radius-small;
-}
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/animate.min.css b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/animate.min.css
deleted file mode 100644
index 68534d8..0000000
--- a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/animate.min.css
+++ /dev/null
@@ -1 +0,0 @@
-@charset "UTF-8";body{-webkit-backface-visibility:hidden}.animated{-webkit-animation-duration:1s;-moz-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.animated.hinge{-webkit-animation-duration:2s;-moz-animation-duration:2s;-o-animation-duration:2s;animation-duration:2s}@-webkit-keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}@-moz-keyframes fla [...]
\ No newline at end of file
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/font.css b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/font.css
index 2a7e3b8..fc535d3 100644
--- a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/font.css
+++ b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/font.css
@@ -2,5 +2,5 @@
   font-family: 'Michroma';
   font-style: normal;
   font-weight: 400;
-  src: local('Michroma'), url(../font/Michroma.woff) format('woff');
+  src: local('Michroma'), url(../font/3rd_party/Michroma.woff) format('woff');
 }
\ No newline at end of file
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/font_ie.css b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/font_ie.css
index b48a6e2..1d3fb8a 100644
--- a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/font_ie.css
+++ b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/font_ie.css
@@ -2,6 +2,6 @@
   font-family: 'Michroma';
   font-style: normal;
   font-weight: 400;
-  src: url(../font/Michroma.eot);
-  src: local('Michroma'), url(../font/Michroma.eot) format('embedded-opentype'), url(../font/Michroma.woff) format('woff');
+  src: url(../font/3rd_party/Michroma.eot);
+  src: local('Michroma'), url(../font/3rd_party/Michroma.eot) format('embedded-opentype'), url(../font/3rd_party/Michroma.woff) format('woff');
 }
\ No newline at end of file
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/select2.css b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/select2.css
deleted file mode 100644
index 5b9e67f..0000000
--- a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/select2.css
+++ /dev/null
@@ -1,704 +0,0 @@
-/*
-Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014
-*/
-.select2-container {
-    margin: 0;
-    position: relative;
-    display: inline-block;
-    /* inline-block for ie7 */
-    zoom: 1;
-    *display: inline;
-    vertical-align: middle;
-}
-
-.select2-container,
-.select2-drop,
-.select2-search,
-.select2-search input {
-  /*
-    Force border-box so that % widths fit the parent
-    container without overlap because of margin/padding.
-    More Info : http://www.quirksmode.org/css/box.html
-  */
-  -webkit-box-sizing: border-box; /* webkit */
-     -moz-box-sizing: border-box; /* firefox */
-          box-sizing: border-box; /* css3 */
-}
-
-.select2-container .select2-choice {
-    display: block;
-    height: 26px;
-    padding: 0 0 0 8px;
-    overflow: hidden;
-    position: relative;
-
-    border: 1px solid #aaa;
-    white-space: nowrap;
-    line-height: 26px;
-    color: #444;
-    text-decoration: none;
-
-    border-radius: 4px;
-
-    background-clip: padding-box;
-
-    -webkit-touch-callout: none;
-      -webkit-user-select: none;
-         -moz-user-select: none;
-          -ms-user-select: none;
-              user-select: none;
-
-    background-color: #fff;
-    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
-    background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
-    background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
-    background-image: linear-gradient(to top, #eee 0%, #fff 50%);
-}
-
-html[dir="rtl"] .select2-container .select2-choice {
-    padding: 0 8px 0 0;
-}
-
-.select2-container.select2-drop-above .select2-choice {
-    border-bottom-color: #aaa;
-
-    border-radius: 0 0 4px 4px;
-
-    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
-    background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
-    background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
-    background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
-}
-
-.select2-container.select2-allowclear .select2-choice .select2-chosen {
-    margin-right: 42px;
-}
-
-.select2-container .select2-choice > .select2-chosen {
-    margin-right: 26px;
-    display: block;
-    overflow: hidden;
-
-    white-space: nowrap;
-
-    text-overflow: ellipsis;
-    float: none;
-    width: auto;
-}
-
-html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
-    margin-left: 26px;
-    margin-right: 0;
-}
-
-.select2-container .select2-choice abbr {
-    display: none;
-    width: 12px;
-    height: 12px;
-    position: absolute;
-    right: 24px;
-    top: 8px;
-
-    font-size: 1px;
-    text-decoration: none;
-
-    border: 0;
-    background: url('select2.png') right top no-repeat;
-    cursor: pointer;
-    outline: 0;
-}
-
-.select2-container.select2-allowclear .select2-choice abbr {
-    display: inline-block;
-}
-
-.select2-container .select2-choice abbr:hover {
-    background-position: right -11px;
-    cursor: pointer;
-}
-
-.select2-drop-mask {
-    border: 0;
-    margin: 0;
-    padding: 0;
-    position: fixed;
-    left: 0;
-    top: 0;
-    min-height: 100%;
-    min-width: 100%;
-    height: auto;
-    width: auto;
-    opacity: 0;
-    z-index: 9998;
-    /* styles required for IE to work */
-    background-color: #fff;
-    filter: alpha(opacity=0);
-}
-
-.select2-drop {
-    width: 100%;
-    margin-top: -1px;
-    position: absolute;
-    z-index: 9999;
-    top: 100%;
-
-    background: #fff;
-    color: #000;
-    border: 1px solid #aaa;
-    border-top: 0;
-
-    border-radius: 0 0 4px 4px;
-
-    -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-            box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-}
-
-.select2-drop.select2-drop-above {
-    margin-top: 1px;
-    border-top: 1px solid #aaa;
-    border-bottom: 0;
-
-    border-radius: 4px 4px 0 0;
-
-    -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-            box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-}
-
-.select2-drop-active {
-    border: 1px solid #5897fb;
-    border-top: none;
-}
-
-.select2-drop.select2-drop-above.select2-drop-active {
-    border-top: 1px solid #5897fb;
-}
-
-.select2-drop-auto-width {
-    border-top: 1px solid #aaa;
-    width: auto;
-}
-
-.select2-drop-auto-width .select2-search {
-    padding-top: 4px;
-}
-
-.select2-container .select2-choice .select2-arrow {
-    display: inline-block;
-    width: 18px;
-    height: 100%;
-    position: absolute;
-    right: 0;
-    top: 0;
-
-    border-left: 1px solid #aaa;
-    border-radius: 0 4px 4px 0;
-
-    background-clip: padding-box;
-
-    background: #ccc;
-    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
-    background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
-    background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
-    background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
-}
-
-html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
-    left: 0;
-    right: auto;
-
-    border-left: none;
-    border-right: 1px solid #aaa;
-    border-radius: 4px 0 0 4px;
-}
-
-.select2-container .select2-choice .select2-arrow b {
-    display: block;
-    width: 100%;
-    height: 100%;
-    background: url('select2.png') no-repeat 0 1px;
-}
-
-html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
-    background-position: 2px 1px;
-}
-
-.select2-search {
-    display: inline-block;
-    width: 100%;
-    min-height: 26px;
-    margin: 0;
-    padding-left: 4px;
-    padding-right: 4px;
-
-    position: relative;
-    z-index: 10000;
-
-    white-space: nowrap;
-}
-
-.select2-search input {
-    width: 100%;
-    height: auto !important;
-    min-height: 26px;
-    padding: 4px 20px 4px 5px;
-    margin: 0;
-
-    outline: 0;
-    font-family: sans-serif;
-    font-size: 1em;
-
-    border: 1px solid #aaa;
-    border-radius: 0;
-
-    -webkit-box-shadow: none;
-            box-shadow: none;
-
-    background: #fff url('select2.png') no-repeat 100% -22px;
-    background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
-    background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
-    background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
-    background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
-}
-
-html[dir="rtl"] .select2-search input {
-    padding: 4px 5px 4px 20px;
-
-    background: #fff url('select2.png') no-repeat -37px -22px;
-    background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
-    background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
-    background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
-    background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
-}
-
-.select2-drop.select2-drop-above .select2-search input {
-    margin-top: 4px;
-}
-
-.select2-search input.select2-active {
-    background: #fff url('select2-spinner.gif') no-repeat 100%;
-    background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
-    background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
-    background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
-    background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
-}
-
-.select2-container-active .select2-choice,
-.select2-container-active .select2-choices {
-    border: 1px solid #5897fb;
-    outline: none;
-
-    -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-            box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-}
-
-.select2-dropdown-open .select2-choice {
-    border-bottom-color: transparent;
-    -webkit-box-shadow: 0 1px 0 #fff inset;
-            box-shadow: 0 1px 0 #fff inset;
-
-    border-bottom-left-radius: 0;
-    border-bottom-right-radius: 0;
-
-    background-color: #eee;
-    background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
-    background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
-    background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
-    background-image: linear-gradient(to top, #fff 0%, #eee 50%);
-}
-
-.select2-dropdown-open.select2-drop-above .select2-choice,
-.select2-dropdown-open.select2-drop-above .select2-choices {
-    border: 1px solid #5897fb;
-    border-top-color: transparent;
-
-    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
-    background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
-    background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
-    background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
-}
-
-.select2-dropdown-open .select2-choice .select2-arrow {
-    background: transparent;
-    border-left: none;
-    filter: none;
-}
-html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
-    border-right: none;
-}
-
-.select2-dropdown-open .select2-choice .select2-arrow b {
-    background-position: -18px 1px;
-}
-
-html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
-    background-position: -16px 1px;
-}
-
-.select2-hidden-accessible {
-    border: 0;
-    clip: rect(0 0 0 0);
-    height: 1px;
-    margin: -1px;
-    overflow: hidden;
-    padding: 0;
-    position: absolute;
-    width: 1px;
-}
-
-/* results */
-.select2-results {
-    max-height: 200px;
-    padding: 0 0 0 4px;
-    margin: 4px 4px 4px 0;
-    position: relative;
-    overflow-x: hidden;
-    overflow-y: auto;
-    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-
-html[dir="rtl"] .select2-results {
-    padding: 0 4px 0 0;
-    margin: 4px 0 4px 4px;
-}
-
-.select2-results ul.select2-result-sub {
-    margin: 0;
-    padding-left: 0;
-}
-
-.select2-results li {
-    list-style: none;
-    display: list-item;
-    background-image: none;
-}
-
-.select2-results li.select2-result-with-children > .select2-result-label {
-    font-weight: bold;
-}
-
-.select2-results .select2-result-label {
-    padding: 3px 7px 4px;
-    margin: 0;
-    cursor: pointer;
-
-    min-height: 1em;
-
-    -webkit-touch-callout: none;
-      -webkit-user-select: none;
-         -moz-user-select: none;
-          -ms-user-select: none;
-              user-select: none;
-}
-
-.select2-results-dept-1 .select2-result-label { padding-left: 20px }
-.select2-results-dept-2 .select2-result-label { padding-left: 40px }
-.select2-results-dept-3 .select2-result-label { padding-left: 60px }
-.select2-results-dept-4 .select2-result-label { padding-left: 80px }
-.select2-results-dept-5 .select2-result-label { padding-left: 100px }
-.select2-results-dept-6 .select2-result-label { padding-left: 110px }
-.select2-results-dept-7 .select2-result-label { padding-left: 120px }
-
-.select2-results .select2-highlighted {
-    background: #3875d7;
-    color: #fff;
-}
-
-.select2-results li em {
-    background: #feffde;
-    font-style: normal;
-}
-
-.select2-results .select2-highlighted em {
-    background: transparent;
-}
-
-.select2-results .select2-highlighted ul {
-    background: #fff;
-    color: #000;
-}
-
-.select2-results .select2-no-results,
-.select2-results .select2-searching,
-.select2-results .select2-ajax-error,
-.select2-results .select2-selection-limit {
-    background: #f4f4f4;
-    display: list-item;
-    padding-left: 5px;
-}
-
-/*
-disabled look for disabled choices in the results dropdown
-*/
-.select2-results .select2-disabled.select2-highlighted {
-    color: #666;
-    background: #f4f4f4;
-    display: list-item;
-    cursor: default;
-}
-.select2-results .select2-disabled {
-  background: #f4f4f4;
-  display: list-item;
-  cursor: default;
-}
-
-.select2-results .select2-selected {
-    display: none;
-}
-
-.select2-more-results.select2-active {
-    background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
-}
-
-.select2-results .select2-ajax-error {
-    background: rgba(255, 50, 50, .2);
-}
-
-.select2-more-results {
-    background: #f4f4f4;
-    display: list-item;
-}
-
-/* disabled styles */
-
-.select2-container.select2-container-disabled .select2-choice {
-    background-color: #f4f4f4;
-    background-image: none;
-    border: 1px solid #ddd;
-    cursor: default;
-}
-
-.select2-container.select2-container-disabled .select2-choice .select2-arrow {
-    background-color: #f4f4f4;
-    background-image: none;
-    border-left: 0;
-}
-
-.select2-container.select2-container-disabled .select2-choice abbr {
-    display: none;
-}
-
-
-/* multiselect */
-
-.select2-container-multi .select2-choices {
-    height: auto !important;
-    height: 1%;
-    margin: 0;
-    padding: 0 5px 0 0;
-    position: relative;
-
-    border: 1px solid #aaa;
-    cursor: text;
-    overflow: hidden;
-
-    background-color: #fff;
-    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
-    background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
-    background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
-    background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
-}
-
-html[dir="rtl"] .select2-container-multi .select2-choices {
-    padding: 0 0 0 5px;
-}
-
-.select2-locked {
-  padding: 3px 5px 3px 5px !important;
-}
-
-.select2-container-multi .select2-choices {
-    min-height: 26px;
-}
-
-.select2-container-multi.select2-container-active .select2-choices {
-    border: 1px solid #5897fb;
-    outline: none;
-
-    -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-            box-shadow: 0 0 5px rgba(0, 0, 0, .3);
-}
-.select2-container-multi .select2-choices li {
-    float: left;
-    list-style: none;
-}
-html[dir="rtl"] .select2-container-multi .select2-choices li
-{
-    float: right;
-}
-.select2-container-multi .select2-choices .select2-search-field {
-    margin: 0;
-    padding: 0;
-    white-space: nowrap;
-}
-
-.select2-container-multi .select2-choices .select2-search-field input {
-    padding: 5px;
-    margin: 1px 0;
-
-    font-family: sans-serif;
-    font-size: 100%;
-    color: #666;
-    outline: 0;
-    border: 0;
-    -webkit-box-shadow: none;
-            box-shadow: none;
-    background: transparent !important;
-}
-
-.select2-container-multi .select2-choices .select2-search-field input.select2-active {
-    background: #fff url('select2-spinner.gif') no-repeat 100% !important;
-}
-
-.select2-default {
-    color: #999 !important;
-}
-
-.select2-container-multi .select2-choices .select2-search-choice {
-    padding: 3px 5px 3px 18px;
-    margin: 3px 0 3px 5px;
-    position: relative;
-
-    line-height: 13px;
-    color: #333;
-    cursor: default;
-    border: 1px solid #aaaaaa;
-
-    border-radius: 3px;
-
-    -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
-            box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
-
-    background-clip: padding-box;
-
-    -webkit-touch-callout: none;
-      -webkit-user-select: none;
-         -moz-user-select: none;
-          -ms-user-select: none;
-              user-select: none;
-
-    background-color: #e4e4e4;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
-    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
-    background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
-    background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
-    background-image: linear-gradient(to top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
-}
-html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
-{
-    margin: 3px 5px 3px 0;
-    padding: 3px 18px 3px 5px;
-}
-.select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
-    cursor: default;
-}
-.select2-container-multi .select2-choices .select2-search-choice-focus {
-    background: #d4d4d4;
-}
-
-.select2-search-choice-close {
-    display: block;
-    width: 12px;
-    height: 13px;
-    position: absolute;
-    right: 3px;
-    top: 4px;
-
-    font-size: 1px;
-    outline: none;
-    background: url('select2.png') right top no-repeat;
-}
-html[dir="rtl"] .select2-search-choice-close {
-    right: auto;
-    left: 3px;
-}
-
-.select2-container-multi .select2-search-choice-close {
-    left: 3px;
-}
-
-html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
-    left: auto;
-    right: 2px;
-}
-
-.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
-  background-position: right -11px;
-}
-.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
-    background-position: right -11px;
-}
-
-/* disabled styles */
-.select2-container-multi.select2-container-disabled .select2-choices {
-    background-color: #f4f4f4;
-    background-image: none;
-    border: 1px solid #ddd;
-    cursor: default;
-}
-
-.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
-    padding: 3px 5px 3px 5px;
-    border: 1px solid #ddd;
-    background-image: none;
-    background-color: #f4f4f4;
-}
-
-.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close {    display: none;
-    background: none;
-}
-/* end multiselect */
-
-
-.select2-result-selectable .select2-match,
-.select2-result-unselectable .select2-match {
-    text-decoration: underline;
-}
-
-.select2-offscreen, .select2-offscreen:focus {
-    clip: rect(0 0 0 0) !important;
-    width: 1px !important;
-    height: 1px !important;
-    border: 0 !important;
-    margin: 0 !important;
-    padding: 0 !important;
-    overflow: hidden !important;
-    position: absolute !important;
-    outline: 0 !important;
-    left: 0px !important;
-    top: 0px !important;
-}
-
-.select2-display-none {
-    display: none;
-}
-
-.select2-measure-scrollbar {
-    position: absolute;
-    top: -10000px;
-    left: -10000px;
-    width: 100px;
-    height: 100px;
-    overflow: scroll;
-}
-
-/* Retina-ize icons */
-
-@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx)  {
-    .select2-search input,
-    .select2-search-choice-close,
-    .select2-container .select2-choice abbr,
-    .select2-container .select2-choice .select2-arrow b {
-        background-image: url('select2x2.png') !important;
-        background-repeat: no-repeat !important;
-        background-size: 60px 40px !important;
-    }
-
-    .select2-search input {
-        background-position: 100% -21px !important;
-    }
-}
\ No newline at end of file
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/select2.png b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/select2.png
deleted file mode 100644
index 1d804ff..0000000
Binary files a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/select2.png and /dev/null differ
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/shake.css b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/shake.css
deleted file mode 100644
index 228fa4a..0000000
--- a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/css/shake.css
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-Animate.css - http://daneden.me/animate
-LICENSED UNDER THE  MIT LICENSE (MIT)
-
-Copyright (c) 2012 Dan Eden
-
-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.
-*/
-
-.animated {
-	-webkit-animation-fill-mode: both;
-	-moz-animation-fill-mode: both;
-	-ms-animation-fill-mode: both;
-	-o-animation-fill-mode: both;
-	animation-fill-mode: both;
-	-webkit-animation-duration: 1s;
-	-moz-animation-duration: 1s;
-	-ms-animation-duration: 1s;
-	-o-animation-duration: 1s;
-	animation-duration: 1s;
-}
-
-.animated.hinge {
-	-webkit-animation-duration: 2s;
-	-moz-animation-duration: 2s;
-	-ms-animation-duration: 2s;
-	-o-animation-duration: 2s;
-	animation-duration: 2s;
-}
-
-@-webkit-keyframes shake {
-	0%, 100% {-webkit-transform: translateX(0);}
-	10%, 30%, 50%, 70%, 90% {-webkit-transform: translateX(-10px);}
-	20%, 40%, 60%, 80% {-webkit-transform: translateX(10px);}
-}
-
-@-moz-keyframes shake {
-	0%, 100% {-moz-transform: translateX(0);}
-	10%, 30%, 50%, 70%, 90% {-moz-transform: translateX(-10px);}
-	20%, 40%, 60%, 80% {-moz-transform: translateX(10px);}
-}
-
-@-o-keyframes shake {
-	0%, 100% {-o-transform: translateX(0);}
-	10%, 30%, 50%, 70%, 90% {-o-transform: translateX(-10px);}
-	20%, 40%, 60%, 80% {-o-transform: translateX(10px);}
-}
-
-@keyframes shake {
-	0%, 100% {transform: translateX(0);}
-	10%, 30%, 50%, 70%, 90% {transform: translateX(-10px);}
-	20%, 40%, 60%, 80% {transform: translateX(10px);}
-}
-
-.shake {
-	-webkit-animation-name: shake;
-	-moz-animation-name: shake;
-	-o-animation-name: shake;
-	animation-name: shake;
-}
\ No newline at end of file
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/font/Michroma.eot b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/font/3rd_party/Michroma.eot
similarity index 100%
rename from src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/font/Michroma.eot
rename to src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/font/3rd_party/Michroma.eot
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/font/Michroma.woff b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/font/3rd_party/Michroma.woff
similarity index 100%
rename from src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/font/Michroma.woff
rename to src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/font/3rd_party/Michroma.woff
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/bootbox.min.js b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/bootbox.min.js
deleted file mode 100644
index a7ea24f..0000000
--- a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/bootbox.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * bootbox.js v4.3.0
- *
- * http://bootboxjs.com/license.txt
- */
-!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["jquery"],b):"object"==typeof exports?module.exports=b(require("jquery")):a.bootbox=b(a.jQuery)}(this,function a(b,c){"use strict";function d(a){var b=q[o.locale];return b?b[a]:q.en[a]}function e(a,c,d){a.stopPropagation(),a.preventDefault();var e=b.isFunction(d)&&d(a)===!1;e||c.modal("hide")}function f(a){var b,c=0;for(b in a)c++;return c}function g(a,c){var d=0;b.each(a,function(a,b){c(a,b,d++)})}function h(a){va [...]
\ No newline at end of file
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/bootstrap.min.js b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/bootstrap.min.js
deleted file mode 100644
index b04a0e8..0000000
--- a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/bootstrap.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Bootstrap v3.1.1 (http://getbootstrap.com)
- * Copyright 2011-2014 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e= [...]
\ No newline at end of file
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/jquery.min.js b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/jquery.min.js
deleted file mode 100644
index 76d21a4..0000000
--- a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/jquery.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery-1.10.2.min.map
-*/
-(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/ [...]
-}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null [...]
-u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.first [...]
\ No newline at end of file
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/jquery.scrollTo-min.js b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/jquery.scrollTo-min.js
deleted file mode 100644
index 5e78778..0000000
--- a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/jquery.scrollTo-min.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * jQuery.ScrollTo - Easy element scrolling using jQuery.
- * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
- * Dual licensed under MIT and GPL.
- * Date: 5/25/2009
- * @author Ariel Flesler
- * @version 1.4.2
- *
- * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
- */
-;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentEl [...]
\ No newline at end of file
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/jstree.js b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/jstree.js
deleted file mode 100644
index b01a257..0000000
--- a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/jstree.js
+++ /dev/null
@@ -1,6743 +0,0 @@
-/*globals jQuery, define, exports, require, window, document */
-(function (factory) {
-	"use strict";
-	if (typeof define === 'function' && define.amd) {
-		define(['jquery'], factory);
-	}
-	else if(typeof exports === 'object') {
-		factory(require('jquery'));
-	}
-	else {
-		factory(jQuery);
-	}
-}(function ($, undefined) {
-	"use strict";
-/*!
- * jsTree 3.0.3
- * http://jstree.com/
- *
- * Copyright (c) 2014 Ivan Bozhanov (http://vakata.com)
- *
- * Licensed same as jquery - under the terms of the MIT License
- *   http://www.opensource.org/licenses/mit-license.php
- */
-/*!
- * if using jslint please allow for the jQuery global and use following options: 
- * jslint: browser: true, ass: true, bitwise: true, continue: true, nomen: true, plusplus: true, regexp: true, unparam: true, todo: true, white: true
- */
-
-	// prevent another load? maybe there is a better way?
-	if($.jstree) {
-		return;
-	}
-
-	/**
-	 * ### jsTree core functionality
-	 */
-
-	// internal variables
-	var instance_counter = 0,
-		ccp_node = false,
-		ccp_mode = false,
-		ccp_inst = false,
-		themes_loaded = [],
-		src = $('script:last').attr('src'),
-		_d = document, _node = _d.createElement('LI'), _temp1, _temp2;
-
-	_node.setAttribute('role', 'treeitem');
-	_temp1 = _d.createElement('I');
-	_temp1.className = 'jstree-icon jstree-ocl';
-	_node.appendChild(_temp1);
-	_temp1 = _d.createElement('A');
-	_temp1.className = 'jstree-anchor';
-	_temp1.setAttribute('href','#');
-	_temp2 = _d.createElement('I');
-	_temp2.className = 'jstree-icon jstree-themeicon';
-	_temp1.appendChild(_temp2);
-	_node.appendChild(_temp1);
-	_temp1 = _temp2 = null;
-
-
-	/**
-	 * holds all jstree related functions and variables, including the actual class and methods to create, access and manipulate instances.
-	 * @name $.jstree
-	 */
-	$.jstree = {
-		/** 
-		 * specifies the jstree version in use
-		 * @name $.jstree.version
-		 */
-		version : '3.0.3',
-		/**
-		 * holds all the default options used when creating new instances
-		 * @name $.jstree.defaults
-		 */
-		defaults : {
-			/**
-			 * configure which plugins will be active on an instance. Should be an array of strings, where each element is a plugin name. The default is `[]`
-			 * @name $.jstree.defaults.plugins
-			 */
-			plugins : []
-		},
-		/**
-		 * stores all loaded jstree plugins (used internally)
-		 * @name $.jstree.plugins
-		 */
-		plugins : {},
-		path : src && src.indexOf('/') !== -1 ? src.replace(/\/[^\/]+$/,'') : '',
-		idregex : /[\\:&!^|()\[\]<>@*'+~#";.,=\- \/${}%]/g
-	};
-	/**
-	 * creates a jstree instance
-	 * @name $.jstree.create(el [, options])
-	 * @param {DOMElement|jQuery|String} el the element to create the instance on, can be jQuery extended or a selector
-	 * @param {Object} options options for this instance (extends `$.jstree.defaults`)
-	 * @return {jsTree} the new instance
-	 */
-	$.jstree.create = function (el, options) {
-		var tmp = new $.jstree.core(++instance_counter),
-			opt = options;
-		options = $.extend(true, {}, $.jstree.defaults, options);
-		if(opt && opt.plugins) {
-			options.plugins = opt.plugins;
-		}
-		$.each(options.plugins, function (i, k) {
-			if(i !== 'core') {
-				tmp = tmp.plugin(k, options[k]);
-			}
-		});
-		tmp.init(el, options);
-		return tmp;
-	};
-	/**
-	 * the jstree class constructor, used only internally
-	 * @private
-	 * @name $.jstree.core(id)
-	 * @param {Number} id this instance's index
-	 */
-	$.jstree.core = function (id) {
-		this._id = id;
-		this._cnt = 0;
-		this._wrk = null;
-		this._data = {
-			core : {
-				themes : {
-					name : false,
-					dots : false,
-					icons : false
-				},
-				selected : [],
-				last_error : {},
-				working : false,
-				worker_queue : []
-			}
-		};
-	};
-	/**
-	 * get a reference to an existing instance
-	 *
-	 * __Examples__
-	 *
-	 *	// provided a container with an ID of "tree", and a nested node with an ID of "branch"
-	 *	// all of there will return the same instance
-	 *	$.jstree.reference('tree');
-	 *	$.jstree.reference('#tree');
-	 *	$.jstree.reference($('#tree'));
-	 *	$.jstree.reference(document.getElementByID('tree'));
-	 *	$.jstree.reference('branch');
-	 *	$.jstree.reference('#branch');
-	 *	$.jstree.reference($('#branch'));
-	 *	$.jstree.reference(document.getElementByID('branch'));
-	 *
-	 * @name $.jstree.reference(needle)
-	 * @param {DOMElement|jQuery|String} needle
-	 * @return {jsTree|null} the instance or `null` if not found
-	 */
-	$.jstree.reference = function (needle) {
-		var tmp = null,
-			obj = null;
-		if(needle && needle.id) { needle = needle.id; }
-
-		if(!obj || !obj.length) {
-			try { obj = $(needle); } catch (ignore) { }
-		}
-		if(!obj || !obj.length) {
-			try { obj = $('#' + needle.replace($.jstree.idregex,'\\$&')); } catch (ignore) { }
-		}
-		if(obj && obj.length && (obj = obj.closest('.jstree')).length && (obj = obj.data('jstree'))) {
-			tmp = obj;
-		}
-		else {
-			$('.jstree').each(function () {
-				var inst = $(this).data('jstree');
-				if(inst && inst._model.data[needle]) {
-					tmp = inst;
-					return false;
-				}
-			});
-		}
-		return tmp;
-	};
-	/**
-	 * Create an instance, get an instance or invoke a command on a instance. 
-	 * 
-	 * If there is no instance associated with the current node a new one is created and `arg` is used to extend `$.jstree.defaults` for this new instance. There would be no return value (chaining is not broken).
-	 * 
-	 * If there is an existing instance and `arg` is a string the command specified by `arg` is executed on the instance, with any additional arguments passed to the function. If the function returns a value it will be returned (chaining could break depending on function).
-	 * 
-	 * If there is an existing instance and `arg` is not a string the instance itself is returned (similar to `$.jstree.reference`).
-	 * 
-	 * In any other case - nothing is returned and chaining is not broken.
-	 *
-	 * __Examples__
-	 *
-	 *	$('#tree1').jstree(); // creates an instance
-	 *	$('#tree2').jstree({ plugins : [] }); // create an instance with some options
-	 *	$('#tree1').jstree('open_node', '#branch_1'); // call a method on an existing instance, passing additional arguments
-	 *	$('#tree2').jstree(); // get an existing instance (or create an instance)
-	 *	$('#tree2').jstree(true); // get an existing instance (will not create new instance)
-	 *	$('#branch_1').jstree().select_node('#branch_1'); // get an instance (using a nested element and call a method)
-	 *
-	 * @name $().jstree([arg])
-	 * @param {String|Object} arg
-	 * @return {Mixed}
-	 */
-	$.fn.jstree = function (arg) {
-		// check for string argument
-		var is_method	= (typeof arg === 'string'),
-			args		= Array.prototype.slice.call(arguments, 1),
-			result		= null;
-		this.each(function () {
-			// get the instance (if there is one) and method (if it exists)
-			var instance = $.jstree.reference(this),
-				method = is_method && instance ? instance[arg] : null;
-			// if calling a method, and method is available - execute on the instance
-			result = is_method && method ?
-				method.apply(instance, args) :
-				null;
-			// if there is no instance and no method is being called - create one
-			if(!instance && !is_method && (arg === undefined || $.isPlainObject(arg))) {
-				$(this).data('jstree', new $.jstree.create(this, arg));
-			}
-			// if there is an instance and no method is called - return the instance
-			if( (instance && !is_method) || arg === true ) {
-				result = instance || false;
-			}
-			// if there was a method call which returned a result - break and return the value
-			if(result !== null && result !== undefined) {
-				return false;
-			}
-		});
-		// if there was a method call with a valid return value - return that, otherwise continue the chain
-		return result !== null && result !== undefined ?
-			result : this;
-	};
-	/**
-	 * used to find elements containing an instance
-	 *
-	 * __Examples__
-	 *
-	 *	$('div:jstree').each(function () {
-	 *		$(this).jstree('destroy');
-	 *	});
-	 *
-	 * @name $(':jstree')
-	 * @return {jQuery}
-	 */
-	$.expr[':'].jstree = $.expr.createPseudo(function(search) {
-		return function(a) {
-			return $(a).hasClass('jstree') &&
-				$(a).data('jstree') !== undefined;
-		};
-	});
-
-	/**
-	 * stores all defaults for the core
-	 * @name $.jstree.defaults.core
-	 */
-	$.jstree.defaults.core = {
-		/**
-		 * data configuration
-		 * 
-		 * If left as `false` the HTML inside the jstree container element is used to populate the tree (that should be an unordered list with list items).
-		 *
-		 * You can also pass in a HTML string or a JSON array here.
-		 * 
-		 * It is possible to pass in a standard jQuery-like AJAX config and jstree will automatically determine if the response is JSON or HTML and use that to populate the tree. 
-		 * In addition to the standard jQuery ajax options here you can suppy functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node is being loaded, the return value of those functions will be used.
-		 * 
-		 * The last option is to specify a function, that function will receive the node being loaded as argument and a second param which is a function which should be called with the result.
-		 *
-		 * __Examples__
-		 *
-		 *	// AJAX
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'data' : {
-		 *				'url' : '/get/children/',
-		 *				'data' : function (node) {
-		 *					return { 'id' : node.id };
-		 *				}
-		 *			}
-		 *		});
-		 *
-		 *	// direct data
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'data' : [
-		 *				'Simple root node',
-		 *				{
-		 *					'id' : 'node_2',
-		 *					'text' : 'Root node with options',
-		 *					'state' : { 'opened' : true, 'selected' : true },
-		 *					'children' : [ { 'text' : 'Child 1' }, 'Child 2']
-		 *				}
-		 *			]
-		 *		});
-		 *	
-		 *	// function
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'data' : function (obj, callback) {
-		 *				callback.call(this, ['Root 1', 'Root 2']);
-		 *			}
-		 *		});
-		 * 
-		 * @name $.jstree.defaults.core.data
-		 */
-		data			: false,
-		/**
-		 * configure the various strings used throughout the tree
-		 *
-		 * You can use an object where the key is the string you need to replace and the value is your replacement.
-		 * Another option is to specify a function which will be called with an argument of the needed string and should return the replacement.
-		 * If left as `false` no replacement is made.
-		 *
-		 * __Examples__
-		 *
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'strings' : {
-		 *				'Loading ...' : 'Please wait ...'
-		 *			}
-		 *		}
-		 *	});
-		 *
-		 * @name $.jstree.defaults.core.strings
-		 */
-		strings			: false,
-		/**
-		 * determines what happens when a user tries to modify the structure of the tree
-		 * If left as `false` all operations like create, rename, delete, move or copy are prevented.
-		 * You can set this to `true` to allow all interactions or use a function to have better control.
-		 *
-		 * __Examples__
-		 *
-		 *	$('#tree').jstree({
-		 *		'core' : {
-		 *			'check_callback' : function (operation, node, node_parent, node_position, more) {
-		 *				// operation can be 'create_node', 'rename_node', 'delete_node', 'move_node' or 'copy_node'
-		 *				// in case of 'rename_node' node_position is filled with the new node name
-		 *				return operation === 'rename_node' ? true : false;
-		 *			}
-		 *		}
-		 *	});
-		 * 
-		 * @name $.jstree.defaults.core.check_callback
-		 */
-		check_callback	: false,
-		/**
-		 * a callback called with a single object parameter in the instance's scope when something goes wrong (operation prevented, ajax failed, etc)
-		 * @name $.jstree.defaults.core.error
-		 */
-		error			: $.noop,
-		/**
-		 * the open / close animation duration in milliseconds - set this to `false` to disable the animation (default is `200`)
-		 * @name $.jstree.defaults.core.animation
-		 */
-		animation		: 200,
-		/**
-		 * a boolean indicating if multiple nodes can be selected
-		 * @name $.jstree.defaults.core.multiple
-		 */
-		multiple		: true,
-		/**
-		 * theme configuration object
-		 * @name $.jstree.defaults.core.themes
-		 */
-		themes			: {
-			/**
-			 * the name of the theme to use (if left as `false` the default theme is used)
-			 * @name $.jstree.defaults.core.themes.name
-			 */
-			name			: false,
-			/**
-			 * the URL of the theme's CSS file, leave this as `false` if you have manually included the theme CSS (recommended). You can set this to `true` too which will try to autoload the theme.
-			 * @name $.jstree.defaults.core.themes.url
-			 */
-			url				: false,
-			/**
-			 * the location of all jstree themes - only used if `url` is set to `true`
-			 * @name $.jstree.defaults.core.themes.dir
-			 */
-			dir				: false,
-			/**
-			 * a boolean indicating if connecting dots are shown
-			 * @name $.jstree.defaults.core.themes.dots
-			 */
-			dots			: true,
-			/**
-			 * a boolean indicating if node icons are shown
-			 * @name $.jstree.defaults.core.themes.icons
-			 */
-			icons			: true,
-			/**
-			 * a boolean indicating if the tree background is striped
-			 * @name $.jstree.defaults.core.themes.stripes
-			 */
-			stripes			: false,
-			/**
-			 * a string (or boolean `false`) specifying the theme variant to use (if the theme supports variants)
-			 * @name $.jstree.defaults.core.themes.variant
-			 */
-			variant			: false,
-			/**
-			 * a boolean specifying if a reponsive version of the theme should kick in on smaller screens (if the theme supports it). Defaults to `false`.
-			 * @name $.jstree.defaults.core.themes.responsive
-			 */
-			responsive		: false
-		},
-		/**
-		 * if left as `true` all parents of all selected nodes will be opened once the tree loads (so that all selected nodes are visible to the user)
-		 * @name $.jstree.defaults.core.expand_selected_onload
-		 */
-		expand_selected_onload : true,
-		/**
-		 * if left as `true` web workers will be used to parse incoming JSON data where possible, so that the UI will not be blocked by large requests. Workers are however about 30% slower. Defaults to `true`
-		 * @name $.jstree.defaults.core.worker
-		 */
-		worker : true,
-		/**
-		 * Force node text to plain text (and escape HTML). Defaults to `false`
-		 * @name $.jstree.defaults.core.force_text
-		 */
-		force_text : false
-	};
-	$.jstree.core.prototype = {
-		/**
-		 * used to decorate an instance with a plugin. Used internally.
-		 * @private
-		 * @name plugin(deco [, opts])
-		 * @param  {String} deco the plugin to decorate with
-		 * @param  {Object} opts options for the plugin
-		 * @return {jsTree}
-		 */
-		plugin : function (deco, opts) {
-			var Child = $.jstree.plugins[deco];
-			if(Child) {
-				this._data[deco] = {};
-				Child.prototype = this;
-				return new Child(opts, this);
-			}
-			return this;
-		},
-		/**
-		 * used to decorate an instance with a plugin. Used internally.
-		 * @private
-		 * @name init(el, optons)
-		 * @param {DOMElement|jQuery|String} el the element we are transforming
-		 * @param {Object} options options for this instance
-		 * @trigger init.jstree, loading.jstree, loaded.jstree, ready.jstree, changed.jstree
-		 */
-		init : function (el, options) {
-			this._model = {
-				data : {
-					'#' : {
-						id : '#',
-						parent : null,
-						parents : [],
-						children : [],
-						children_d : [],
-						state : { loaded : false }
-					}
-				},
-				changed : [],
-				force_full_redraw : false,
-				redraw_timeout : false,
-				default_state : {
-					loaded : true,
-					opened : false,
-					selected : false,
-					disabled : false
-				}
-			};
-
-			this.element = $(el).addClass('jstree jstree-' + this._id);
-			this.settings = options;
-			this.element.bind("destroyed", $.proxy(this.teardown, this));
-
-			this._data.core.ready = false;
-			this._data.core.loaded = false;
-			this._data.core.rtl = (this.element.css("direction") === "rtl");
-			this.element[this._data.core.rtl ? 'addClass' : 'removeClass']("jstree-rtl");
-			this.element.attr('role','tree');
-
-			this.bind();
-			/**
-			 * triggered after all events are bound
-			 * @event
-			 * @name init.jstree
-			 */
-			this.trigger("init");
-
-			this._data.core.original_container_html = this.element.find(" > ul > li").clone(true);
-			this._data.core.original_container_html
-				.find("li").addBack()
-				.contents().filter(function() {
-					return this.nodeType === 3 && (!this.nodeValue || /^\s+$/.test(this.nodeValue));
-				})
-				.remove();
-			this.element.html("<"+"ul class='jstree-container-ul jstree-children'><"+"li class='jstree-initial-node jstree-loading jstree-leaf jstree-last'><i class='jstree-icon jstree-ocl'></i><"+"a class='jstree-anchor' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>" + this.get_string("Loading ...") + "</a></li></ul>");
-			this._data.core.li_height = this.get_container_ul().children("li:eq(0)").height() || 24;
-			/**
-			 * triggered after the loading text is shown and before loading starts
-			 * @event
-			 * @name loading.jstree
-			 */
-			this.trigger("loading");
-			this.load_node('#');
-		},
-		/**
-		 * destroy an instance
-		 * @name destroy()
-		 * @param  {Boolean} keep_html if not set to `true` the container will be emptied, otherwise the current DOM elements will be kept intact
-		 */
-		destroy : function (keep_html) {
-			if(!keep_html) { this.element.empty(); }
-			this.element.unbind("destroyed", this.teardown);
-			this.teardown();
-		},
-		/**
-		 * part of the destroying of an instance. Used internally.
-		 * @private
-		 * @name teardown()
-		 */
-		teardown : function () {
-			this.unbind();
-			this.element
-				.removeClass('jstree')
-				.removeData('jstree')
-				.find("[class^='jstree']")
-					.addBack()
-					.attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); });
-			this.element = null;
-		},
-		/**
-		 * bind all events. Used internally.
-		 * @private
-		 * @name bind()
-		 */
-		bind : function () {
-			this.element
-				.on("dblclick.jstree", function () {
-						if(document.selection && document.selection.empty) {
-							document.selection.empty();
-						}
-						else {
-							if(window.getSelection) {
-								var sel = window.getSelection();
-								try {
-									sel.removeAllRanges();
-									sel.collapse();
-								} catch (ignore) { }
-							}
-						}
-					})
-				.on("click.jstree", ".jstree-ocl", $.proxy(function (e) {
-						this.toggle_node(e.target);
-					}, this))
-				.on("click.jstree", ".jstree-anchor", $.proxy(function (e) {
-						e.preventDefault();
-						$(e.currentTarget).focus();
-						this.activate_node(e.currentTarget, e);
-					}, this))
-				.on('keydown.jstree', '.jstree-anchor', $.proxy(function (e) {
-						if(e.target.tagName === "INPUT") { return true; }
-						var o = null;
-						switch(e.which) {
-							case 13:
-							case 32:
-								e.type = "click";
-								$(e.currentTarget).trigger(e);
-								break;
-							case 37:
-								e.preventDefault();
-								if(this.is_open(e.currentTarget)) {
-									this.close_node(e.currentTarget);
-								}
-								else {
-									o = this.get_prev_dom(e.currentTarget);
-									if(o && o.length) { o.children('.jstree-anchor').focus(); }
-								}
-								break;
-							case 38:
-								e.preventDefault();
-								o = this.get_prev_dom(e.currentTarget);
-								if(o && o.length) { o.children('.jstree-anchor').focus(); }
-								break;
-							case 39:
-								e.preventDefault();
-								if(this.is_closed(e.currentTarget)) {
-									this.open_node(e.currentTarget, function (o) { this.get_node(o, true).children('.jstree-anchor').focus(); });
-								}
-								else {
-									o = this.get_next_dom(e.currentTarget);
-									if(o && o.length) { o.children('.jstree-anchor').focus(); }
-								}
-								break;
-							case 40:
-								e.preventDefault();
-								o = this.get_next_dom(e.currentTarget);
-								if(o && o.length) { o.children('.jstree-anchor').focus(); }
-								break;
-							// delete
-							case 46:
-								e.preventDefault();
-								o = this.get_node(e.currentTarget);
-								if(o && o.id && o.id !== '#') {
-									o = this.is_selected(o) ? this.get_selected() : o;
-									// this.delete_node(o);
-								}
-								break;
-							// f2
-							case 113:
-								e.preventDefault();
-								o = this.get_node(e.currentTarget);
-								/*!
-								if(o && o.id && o.id !== '#') {
-									// this.edit(o);
-								}
-								*/
-								break;
-							default:
-								// console.log(e.which);
-								break;
-						}
-					}, this))
-				.on("load_node.jstree", $.proxy(function (e, data) {
-						if(data.status) {
-							if(data.node.id === '#' && !this._data.core.loaded) {
-								this._data.core.loaded = true;
-								/**
-								 * triggered after the root node is loaded for the first time
-								 * @event
-								 * @name loaded.jstree
-								 */
-								this.trigger("loaded");
-							}
-							if(!this._data.core.ready && !this.get_container_ul().find('.jstree-loading:eq(0)').length) {
-								this._data.core.ready = true;
-								if(this._data.core.selected.length) {
-									if(this.settings.core.expand_selected_onload) {
-										var tmp = [], i, j;
-										for(i = 0, j = this._data.core.selected.length; i < j; i++) {
-											tmp = tmp.concat(this._model.data[this._data.core.selected[i]].parents);
-										}
-										tmp = $.vakata.array_unique(tmp);
-										for(i = 0, j = tmp.length; i < j; i++) {
-											this.open_node(tmp[i], false, 0);
-										}
-									}
-									this.trigger('changed', { 'action' : 'ready', 'selected' : this._data.core.selected });
-								}
-								/**
-								 * triggered after all nodes are finished loading
-								 * @event
-								 * @name ready.jstree
-								 */
-								setTimeout($.proxy(function () { this.trigger("ready"); }, this), 0);
-							}
-						}
-					}, this))
-				// THEME RELATED
-				.on("init.jstree", $.proxy(function () {
-						var s = this.settings.core.themes;
-						this._data.core.themes.dots			= s.dots;
-						this._data.core.themes.stripes		= s.stripes;
-						this._data.core.themes.icons		= s.icons;
-						this.set_theme(s.name || "default", s.url);
-						this.set_theme_variant(s.variant);
-					}, this))
-				.on("loading.jstree", $.proxy(function () {
-						this[ this._data.core.themes.dots ? "show_dots" : "hide_dots" ]();
-						this[ this._data.core.themes.icons ? "show_icons" : "hide_icons" ]();
-						this[ this._data.core.themes.stripes ? "show_stripes" : "hide_stripes" ]();
-					}, this))
-				.on('blur.jstree', '.jstree-anchor', $.proxy(function (e) {
-						$(e.currentTarget).filter('.jstree-hovered').mouseleave();
-					}, this))
-				.on('focus.jstree', '.jstree-anchor', $.proxy(function (e) {
-						this.element.find('.jstree-hovered').not(e.currentTarget).mouseleave();
-						$(e.currentTarget).mouseenter();
-					}, this))
-				.on('mouseenter.jstree', '.jstree-anchor', $.proxy(function (e) {
-						this.hover_node(e.currentTarget);
-					}, this))
-				.on('mouseleave.jstree', '.jstree-anchor', $.proxy(function (e) {
-						this.dehover_node(e.currentTarget);
-					}, this));
-		},
-		/**
-		 * part of the destroying of an instance. Used internally.
-		 * @private
-		 * @name unbind()
-		 */
-		unbind : function () {
-			this.element.off('.jstree');
-			$(document).off('.jstree-' + this._id);
-		},
-		/**
-		 * trigger an event. Used internally.
-		 * @private
-		 * @name trigger(ev [, data])
-		 * @param  {String} ev the name of the event to trigger
-		 * @param  {Object} data additional data to pass with the event
-		 */
-		trigger : function (ev, data) {
-			if(!data) {
-				data = {};
-			}
-			data.instance = this;
-			this.element.triggerHandler(ev.replace('.jstree','') + '.jstree', data);
-		},
-		/**
-		 * returns the jQuery extended instance container
-		 * @name get_container()
-		 * @return {jQuery}
-		 */
-		get_container : function () {
-			return this.element;
-		},
-		/**
-		 * returns the jQuery extended main UL node inside the instance container. Used internally.
-		 * @private
-		 * @name get_container_ul()
-		 * @return {jQuery}
-		 */
-		get_container_ul : function () {
-			return this.element.children(".jstree-children:eq(0)");
-		},
-		/**
-		 * gets string replacements (localization). Used internally.
-		 * @private
-		 * @name get_string(key)
-		 * @param  {String} key
-		 * @return {String}
-		 */
-		get_string : function (key) {
-			var a = this.settings.core.strings;
-			if($.isFunction(a)) { return a.call(this, key); }
-			if(a && a[key]) { return a[key]; }
-			return key;
-		},
-		/**
-		 * gets the first child of a DOM node. Used internally.
-		 * @private
-		 * @name _firstChild(dom)
-		 * @param  {DOMElement} dom
-		 * @return {DOMElement}
-		 */
-		_firstChild : function (dom) {
-			dom = dom ? dom.firstChild : null;
-			while(dom !== null && dom.nodeType !== 1) {
-				dom = dom.nextSibling;
-			}
-			return dom;
-		},
-		/**
-		 * gets the next sibling of a DOM node. Used internally.
-		 * @private
-		 * @name _nextSibling(dom)
-		 * @param  {DOMElement} dom
-		 * @return {DOMElement}
-		 */
-		_nextSibling : function (dom) {
-			dom = dom ? dom.nextSibling : null;
-			while(dom !== null && dom.nodeType !== 1) {
-				dom = dom.nextSibling;
-			}
-			return dom;
-		},
-		/**
-		 * gets the previous sibling of a DOM node. Used internally.
-		 * @private
-		 * @name _previousSibling(dom)
-		 * @param  {DOMElement} dom
-		 * @return {DOMElement}
-		 */
-		_previousSibling : function (dom) {
-			dom = dom ? dom.previousSibling : null;
-			while(dom !== null && dom.nodeType !== 1) {
-				dom = dom.previousSibling;
-			}
-			return dom;
-		},
-		/**
-		 * get the JSON representation of a node (or the actual jQuery extended DOM node) by using any input (child DOM element, ID string, selector, etc)
-		 * @name get_node(obj [, as_dom])
-		 * @param  {mixed} obj
-		 * @param  {Boolean} as_dom
-		 * @return {Object|jQuery}
-		 */
-		get_node : function (obj, as_dom) {
-			if(obj && obj.id) {
-				obj = obj.id;
-			}
-			var dom;
-			try {
-				if(this._model.data[obj]) {
-					obj = this._model.data[obj];
-				}
-				else if(((dom = $(obj, this.element)).length || (dom = $('#' + obj.replace($.jstree.idregex,'\\$&'), this.element)).length) && this._model.data[dom.closest('.jstree-node').attr('id')]) {
-					obj = this._model.data[dom.closest('.jstree-node').attr('id')];
-				}
-				else if((dom = $(obj, this.element)).length && dom.hasClass('jstree')) {
-					obj = this._model.data['#'];
-				}
-				else {
-					return false;
-				}
-
-				if(as_dom) {
-					obj = obj.id === '#' ? this.element : $('#' + obj.id.replace($.jstree.idregex,'\\$&'), this.element);
-				}
-				return obj;
-			} catch (ex) { return false; }
-		},
-		/**
-		 * get the path to a node, either consisting of node texts, or of node IDs, optionally glued together (otherwise an array)
-		 * @name get_path(obj [, glue, ids])
-		 * @param  {mixed} obj the node
-		 * @param  {String} glue if you want the path as a string - pass the glue here (for example '/'), if a falsy value is supplied here, an array is returned
-		 * @param  {Boolean} ids if set to true build the path using ID, otherwise node text is used
-		 * @return {mixed}
-		 */
-		get_path : function (obj, glue, ids) {
-			obj = obj.parents ? obj : this.get_node(obj);
-			if(!obj || obj.id === '#' || !obj.parents) {
-				return false;
-			}
-			var i, j, p = [];
-			p.push(ids ? obj.id : obj.text);
-			for(i = 0, j = obj.parents.length; i < j; i++) {
-				p.push(ids ? obj.parents[i] : this.get_text(obj.parents[i]));
-			}
-			p = p.reverse().slice(1);
-			return glue ? p.join(glue) : p;
-		},
-		/**
-		 * get the next visible node that is below the `obj` node. If `strict` is set to `true` only sibling nodes are returned.
-		 * @name get_next_dom(obj [, strict])
-		 * @param  {mixed} obj
-		 * @param  {Boolean} strict
-		 * @return {jQuery}
-		 */
-		get_next_dom : function (obj, strict) {
-			var tmp;
-			obj = this.get_node(obj, true);
-			if(obj[0] === this.element[0]) {
-				tmp = this._firstChild(this.get_container_ul()[0]);
-				return tmp ? $(tmp) : false;
-			}
-			if(!obj || !obj.length) {
-				return false;
-			}
-			if(strict) {
-				tmp = this._nextSibling(obj[0]);
-				return tmp ? $(tmp) : false;
-			}
-			if(obj.hasClass("jstree-open")) {
-				tmp = this._firstChild(obj.children('.jstree-children')[0]);
-				return tmp ? $(tmp) : false;
-			}
-			if((tmp = this._nextSibling(obj[0])) !== null) {
-				return $(tmp);
-			}
-			return obj.parentsUntil(".jstree",".jstree-node").next(".jstree-node").eq(0);
-		},
-		/**
-		 * get the previous visible node that is above the `obj` node. If `strict` is set to `true` only sibling nodes are returned.
-		 * @name get_prev_dom(obj [, strict])
-		 * @param  {mixed} obj
-		 * @param  {Boolean} strict
-		 * @return {jQuery}
-		 */
-		get_prev_dom : function (obj, strict) {
-			var tmp;
-			obj = this.get_node(obj, true);
-			if(obj[0] === this.element[0]) {
-				tmp = this.get_container_ul()[0].lastChild;
-				return tmp ? $(tmp) : false;
-			}
-			if(!obj || !obj.length) {
-				return false;
-			}
-			if(strict) {
-				tmp = this._previousSibling(obj[0]);
-				return tmp ? $(tmp) : false;
-			}
-			if((tmp = this._previousSibling(obj[0])) !== null) {
-				obj = $(tmp);
-				while(obj.hasClass("jstree-open")) {
-					obj = obj.children(".jstree-children:eq(0)").children(".jstree-node:last");
-				}
-				return obj;
-			}
-			tmp = obj[0].parentNode.parentNode;
-			return tmp && tmp.className && tmp.className.indexOf('jstree-node') !== -1 ? $(tmp) : false;
-		},
-		/**
-		 * get the parent ID of a node
-		 * @name get_parent(obj)
-		 * @param  {mixed} obj
-		 * @return {String}
-		 */
-		get_parent : function (obj) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') {
-				return false;
-			}
-			return obj.parent;
-		},
-		/**
-		 * get a jQuery collection of all the children of a node (node must be rendered)
-		 * @name get_children_dom(obj)
-		 * @param  {mixed} obj
-		 * @return {jQuery}
-		 */
-		get_children_dom : function (obj) {
-			obj = this.get_node(obj, true);
-			if(obj[0] === this.element[0]) {
-				return this.get_container_ul().children(".jstree-node");
-			}
-			if(!obj || !obj.length) {
-				return false;
-			}
-			return obj.children(".jstree-children").children(".jstree-node");
-		},
-		/**
-		 * checks if a node has children
-		 * @name is_parent(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_parent : function (obj) {
-			obj = this.get_node(obj);
-			return obj && (obj.state.loaded === false || obj.children.length > 0);
-		},
-		/**
-		 * checks if a node is loaded (its children are available)
-		 * @name is_loaded(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_loaded : function (obj) {
-			obj = this.get_node(obj);
-			return obj && obj.state.loaded;
-		},
-		/**
-		 * check if a node is currently loading (fetching children)
-		 * @name is_loading(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_loading : function (obj) {
-			obj = this.get_node(obj);
-			return obj && obj.state && obj.state.loading;
-		},
-		/**
-		 * check if a node is opened
-		 * @name is_open(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_open : function (obj) {
-			obj = this.get_node(obj);
-			return obj && obj.state.opened;
-		},
-		/**
-		 * check if a node is in a closed state
-		 * @name is_closed(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_closed : function (obj) {
-			obj = this.get_node(obj);
-			return obj && this.is_parent(obj) && !obj.state.opened;
-		},
-		/**
-		 * check if a node has no children
-		 * @name is_leaf(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_leaf : function (obj) {
-			return !this.is_parent(obj);
-		},
-		/**
-		 * loads a node (fetches its children using the `core.data` setting). Multiple nodes can be passed to by using an array.
-		 * @name load_node(obj [, callback])
-		 * @param  {mixed} obj
-		 * @param  {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives two arguments - the node and a boolean status
-		 * @return {Boolean}
-		 * @trigger load_node.jstree
-		 */
-		load_node : function (obj, callback) {
-			var k, l, i, j, c;
-			if($.isArray(obj)) {
-				this._load_nodes(obj.slice(), callback);
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj) {
-				if(callback) { callback.call(this, obj, false); }
-				return false;
-			}
-			// if(obj.state.loading) { } // the node is already loading - just wait for it to load and invoke callback? but if called implicitly it should be loaded again?
-			if(obj.state.loaded) {
-				obj.state.loaded = false;
-				for(k = 0, l = obj.children_d.length; k < l; k++) {
-					for(i = 0, j = obj.parents.length; i < j; i++) {
-						this._model.data[obj.parents[i]].children_d = $.vakata.array_remove_item(this._model.data[obj.parents[i]].children_d, obj.children_d[k]);
-					}
-					if(this._model.data[obj.children_d[k]].state.selected) {
-						c = true;
-						this._data.core.selected = $.vakata.array_remove_item(this._data.core.selected, obj.children_d[k]);
-					}
-					delete this._model.data[obj.children_d[k]];
-				}
-				obj.children = [];
-				obj.children_d = [];
-				if(c) {
-					this.trigger('changed', { 'action' : 'load_node', 'node' : obj, 'selected' : this._data.core.selected });
-				}
-			}
-			obj.state.loading = true;
-			this.get_node(obj, true).addClass("jstree-loading");
-			this._load_node(obj, $.proxy(function (status) {
-				obj = this._model.data[obj.id];
-				obj.state.loading = false;
-				obj.state.loaded = status;
-				var dom = this.get_node(obj, true);
-				if(obj.state.loaded && !obj.children.length && dom && dom.length && !dom.hasClass('jstree-leaf')) {
-					dom.removeClass('jstree-closed jstree-open').addClass('jstree-leaf');
-				}
-				dom.removeClass("jstree-loading");
-				/**
-				 * triggered after a node is loaded
-				 * @event
-				 * @name load_node.jstree
-				 * @param {Object} node the node that was loading
-				 * @param {Boolean} status was the node loaded successfully
-				 */
-				this.trigger('load_node', { "node" : obj, "status" : status });
-				if(callback) {
-					callback.call(this, obj, status);
-				}
-			}, this));
-			return true;
-		},
-		/**
-		 * load an array of nodes (will also load unavailable nodes as soon as the appear in the structure). Used internally.
-		 * @private
-		 * @name _load_nodes(nodes [, callback])
-		 * @param  {array} nodes
-		 * @param  {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - the array passed to _load_nodes
-		 */
-		_load_nodes : function (nodes, callback, is_callback) {
-			var r = true,
-				c = function () { this._load_nodes(nodes, callback, true); },
-				m = this._model.data, i, j;
-			for(i = 0, j = nodes.length; i < j; i++) {
-				if(m[nodes[i]] && (!m[nodes[i]].state.loaded || !is_callback)) {
-					if(!this.is_loading(nodes[i])) {
-						this.load_node(nodes[i], c);
-					}
-					r = false;
-				}
-			}
-			if(r) {
-				if(callback && !callback.done) {
-					callback.call(this, nodes);
-					callback.done = true;
-				}
-			}
-		},
-		/**
-		 * handles the actual loading of a node. Used only internally.
-		 * @private
-		 * @name _load_node(obj [, callback])
-		 * @param  {mixed} obj
-		 * @param  {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - a boolean status
-		 * @return {Boolean}
-		 */
-		_load_node : function (obj, callback) {
-			var s = this.settings.core.data, t;
-			// use original HTML
-			if(!s) {
-				if(obj.id === '#') {
-					return this._append_html_data(obj, this._data.core.original_container_html.clone(true), function (status) {
-						callback.call(this, status);
-					});
-				}
-				else {
-					return callback.call(this, false);
-				}
-				// return callback.call(this, obj.id === '#' ? this._append_html_data(obj, this._data.core.original_container_html.clone(true)) : false);
-			}
-			if($.isFunction(s)) {
-				return s.call(this, obj, $.proxy(function (d) {
-					if(d === false) {
-						callback.call(this, false);
-					}
-					this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $(d) : d, function (status) {
-						callback.call(this, status);
-					});
-					// return d === false ? callback.call(this, false) : callback.call(this, this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $(d) : d));
-				}, this));
-			}
-			if(typeof s === 'object') {
-				if(s.url) {
-					s = $.extend(true, {}, s);
-					if($.isFunction(s.url)) {
-						s.url = s.url.call(this, obj);
-					}
-					if($.isFunction(s.data)) {
-						s.data = s.data.call(this, obj);
-					}
-					return $.ajax(s)
-						.done($.proxy(function (d,t,x) {
-								var type = x.getResponseHeader('Content-Type');
-								if(type.indexOf('json') !== -1 || typeof d === "object") {
-									return this._append_json_data(obj, d, function (status) { callback.call(this, status); });
-									//return callback.call(this, this._append_json_data(obj, d));
-								}
-								if(type.indexOf('html') !== -1 || typeof d === "string") {
-									return this._append_html_data(obj, $(d), function (status) { callback.call(this, status); });
-									// return callback.call(this, this._append_html_data(obj, $(d)));
-								}
-								this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'core', 'id' : 'core_04', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id, 'xhr' : x }) };
-								this.settings.core.error.call(this, this._data.core.last_error);
-								return callback.call(this, false);
-							}, this))
-						.fail($.proxy(function (f) {
-								callback.call(this, false);
-								this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'core', 'id' : 'core_04', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id, 'xhr' : f }) };
-								this.settings.core.error.call(this, this._data.core.last_error);
-							}, this));
-				}
-				t = ($.isArray(s) || $.isPlainObject(s)) ? JSON.parse(JSON.stringify(s)) : s;
-				if(obj.id === '#') {
-					return this._append_json_data(obj, t, function (status) {
-						callback.call(this, status);
-					});
-				}
-				else {
-					this._data.core.last_error = { 'error' : 'nodata', 'plugin' : 'core', 'id' : 'core_05', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id }) };
-					this.settings.core.error.call(this, this._data.core.last_error);
-					return callback.call(this, false);
-				}
-				//return callback.call(this, (obj.id === "#" ? this._append_json_data(obj, t) : false) );
-			}
-			if(typeof s === 'string') {
-				if(obj.id === '#') {
-					return this._append_html_data(obj, $(s), function (status) {
-						callback.call(this, status);
-					});
-				}
-				else {
-					this._data.core.last_error = { 'error' : 'nodata', 'plugin' : 'core', 'id' : 'core_06', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id }) };
-					this.settings.core.error.call(this, this._data.core.last_error);
-					return callback.call(this, false);
-				}
-				//return callback.call(this, (obj.id === "#" ? this._append_html_data(obj, $(s)) : false) );
-			}
-			return callback.call(this, false);
-		},
-		/**
-		 * adds a node to the list of nodes to redraw. Used only internally.
-		 * @private
-		 * @name _node_changed(obj [, callback])
-		 * @param  {mixed} obj
-		 */
-		_node_changed : function (obj) {
-			obj = this.get_node(obj);
-			if(obj) {
-				this._model.changed.push(obj.id);
-			}
-		},
-		/**
-		 * appends HTML content to the tree. Used internally.
-		 * @private
-		 * @name _append_html_data(obj, data)
-		 * @param  {mixed} obj the node to append to
-		 * @param  {String} data the HTML string to parse and append
-		 * @trigger model.jstree, changed.jstree
-		 */
-		_append_html_data : function (dom, data, cb) {
-			dom = this.get_node(dom);
-			dom.children = [];
-			dom.children_d = [];
-			var dat = data.is('ul') ? data.children() : data,
-				par = dom.id,
-				chd = [],
-				dpc = [],
-				m = this._model.data,
-				p = m[par],
-				s = this._data.core.selected.length,
-				tmp, i, j;
-			dat.each($.proxy(function (i, v) {
-				tmp = this._parse_model_from_html($(v), par, p.parents.concat());
-				if(tmp) {
-					chd.push(tmp);
-					dpc.push(tmp);
-					if(m[tmp].children_d.length) {
-						dpc = dpc.concat(m[tmp].children_d);
-					}
-				}
-			}, this));
-			p.children = chd;
-			p.children_d = dpc;
-			for(i = 0, j = p.parents.length; i < j; i++) {
-				m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);
-			}
-			/**
-			 * triggered when new data is inserted to the tree model
-			 * @event
-			 * @name model.jstree
-			 * @param {Array} nodes an array of node IDs
-			 * @param {String} parent the parent ID of the nodes
-			 */
-			this.trigger('model', { "nodes" : dpc, 'parent' : par });
-			if(par !== '#') {
-				this._node_changed(par);
-				this.redraw();
-			}
-			else {
-				this.get_container_ul().children('.jstree-initial-node').remove();
-				this.redraw(true);
-			}
-			if(this._data.core.selected.length !== s) {
-				this.trigger('changed', { 'action' : 'model', 'selected' : this._data.core.selected });
-			}
-			cb.call(this, true);
-		},
-		/**
-		 * appends JSON content to the tree. Used internally.
-		 * @private
-		 * @name _append_json_data(obj, data)
-		 * @param  {mixed} obj the node to append to
-		 * @param  {String} data the JSON object to parse and append
-		 * @trigger model.jstree, changed.jstree
-		 */
-		_append_json_data : function (dom, data, cb) {
-			dom = this.get_node(dom);
-			dom.children = [];
-			dom.children_d = [];
-			// *%$@!!!
-			if(data.d) {
-				data = data.d;
-				if(typeof data === "string") {
-					data = JSON.parse(data);
-				}
-			}
-			if(!$.isArray(data)) { data = [data]; }
-			var w = null,
-				args = {
-					'df'	: this._model.default_state,
-					'dat'	: data,
-					'par'	: dom.id,
-					'm'		: this._model.data,
-					't_id'	: this._id,
-					't_cnt'	: this._cnt,
-					'sel'	: this._data.core.selected
-				},
-				func = function (data, undefined) {
-					if(data.data) { data = data.data; }
-					var dat = data.dat,
-						par = data.par,
-						chd = [],
-						dpc = [],
-						add = [],
-						df = data.df,
-						t_id = data.t_id,
-						t_cnt = data.t_cnt,
-						m = data.m,
-						p = m[par],
-						sel = data.sel,
-						tmp, i, j, rslt,
-						parse_flat = function (d, p, ps) {
-							if(!ps) { ps = []; }
-							else { ps = ps.concat(); }
-							if(p) { ps.unshift(p); }
-							var tid = d.id.toString(),
-								i, j, c, e,
-								tmp = {
-									id			: tid,
-									text		: d.text || '',
-									icon		: d.icon !== undefined ? d.icon : true,
-									parent		: p,
-									parents		: ps,
-									children	: d.children || [],
-									children_d	: d.children_d || [],
-									data		: d.data,
-									state		: { },
-									li_attr		: { id : false },
-									a_attr		: { href : '#' },
-									original	: false
-								};
-							for(i in df) {
-								if(df.hasOwnProperty(i)) {
-									tmp.state[i] = df[i];
-								}
-							}
-							if(d && d.data && d.data.jstree && d.data.jstree.icon) {
-								tmp.icon = d.data.jstree.icon;
-							}
-							if(d && d.data) {
-								tmp.data = d.data;
-								if(d.data.jstree) {
-									for(i in d.data.jstree) {
-										if(d.data.jstree.hasOwnProperty(i)) {
-											tmp.state[i] = d.data.jstree[i];
-										}
-									}
-								}
-							}
-							if(d && typeof d.state === 'object') {
-								for (i in d.state) {
-									if(d.state.hasOwnProperty(i)) {
-										tmp.state[i] = d.state[i];
-									}
-								}
-							}
-							if(d && typeof d.li_attr === 'object') {
-								for (i in d.li_attr) {
-									if(d.li_attr.hasOwnProperty(i)) {
-										tmp.li_attr[i] = d.li_attr[i];
-									}
-								}
-							}
-							if(!tmp.li_attr.id) {
-								tmp.li_attr.id = tid;
-							}
-							if(d && typeof d.a_attr === 'object') {
-								for (i in d.a_attr) {
-									if(d.a_attr.hasOwnProperty(i)) {
-										tmp.a_attr[i] = d.a_attr[i];
-									}
-								}
-							}
-							if(d && d.children && d.children === true) {
-								tmp.state.loaded = false;
-								tmp.children = [];
-								tmp.children_d = [];
-							}
-							m[tmp.id] = tmp;
-							for(i = 0, j = tmp.children.length; i < j; i++) {
-								c = parse_flat(m[tmp.children[i]], tmp.id, ps);
-								e = m[c];
-								tmp.children_d.push(c);
-								if(e.children_d.length) {
-									tmp.children_d = tmp.children_d.concat(e.children_d);
-								}
-							}
-							delete d.data;
-							delete d.children;
-							m[tmp.id].original = d;
-							if(tmp.state.selected) {
-								add.push(tmp.id);
-							}
-							return tmp.id;
-						},
-						parse_nest = function (d, p, ps) {
-							if(!ps) { ps = []; }
-							else { ps = ps.concat(); }
-							if(p) { ps.unshift(p); }
-							var tid = false, i, j, c, e, tmp;
-							do {
-								tid = 'j' + t_id + '_' + (++t_cnt);
-							} while(m[tid]);
-
-							tmp = {
-								id			: false,
-								text		: typeof d === 'string' ? d : '',
-								icon		: typeof d === 'object' && d.icon !== undefined ? d.icon : true,
-								parent		: p,
-								parents		: ps,
-								children	: [],
-								children_d	: [],
-								data		: null,
-								state		: { },
-								li_attr		: { id : false },
-								a_attr		: { href : '#' },
-								original	: false
-							};
-							for(i in df) {
-								if(df.hasOwnProperty(i)) {
-									tmp.state[i] = df[i];
-								}
-							}
-							if(d && d.id) { tmp.id = d.id.toString(); }
-							if(d && d.text) { tmp.text = d.text; }
-							if(d && d.data && d.data.jstree && d.data.jstree.icon) {
-								tmp.icon = d.data.jstree.icon;
-							}
-							if(d && d.data) {
-								tmp.data = d.data;
-								if(d.data.jstree) {
-									for(i in d.data.jstree) {
-										if(d.data.jstree.hasOwnProperty(i)) {
-											tmp.state[i] = d.data.jstree[i];
-										}
-									}
-								}
-							}
-							if(d && typeof d.state === 'object') {
-								for (i in d.state) {
-									if(d.state.hasOwnProperty(i)) {
-										tmp.state[i] = d.state[i];
-									}
-								}
-							}
-							if(d && typeof d.li_attr === 'object') {
-								for (i in d.li_attr) {
-									if(d.li_attr.hasOwnProperty(i)) {
-										tmp.li_attr[i] = d.li_attr[i];
-									}
-								}
-							}
-							if(tmp.li_attr.id && !tmp.id) {
-								tmp.id = tmp.li_attr.id.toString();
-							}
-							if(!tmp.id) {
-								tmp.id = tid;
-							}
-							if(!tmp.li_attr.id) {
-								tmp.li_attr.id = tmp.id;
-							}
-							if(d && typeof d.a_attr === 'object') {
-								for (i in d.a_attr) {
-									if(d.a_attr.hasOwnProperty(i)) {
-										tmp.a_attr[i] = d.a_attr[i];
-									}
-								}
-							}
-							if(d && d.children && d.children.length) {
-								for(i = 0, j = d.children.length; i < j; i++) {
-									c = parse_nest(d.children[i], tmp.id, ps);
-									e = m[c];
-									tmp.children.push(c);
-									if(e.children_d.length) {
-										tmp.children_d = tmp.children_d.concat(e.children_d);
-									}
-								}
-								tmp.children_d = tmp.children_d.concat(tmp.children);
-							}
-							if(d && d.children && d.children === true) {
-								tmp.state.loaded = false;
-								tmp.children = [];
-								tmp.children_d = [];
-							}
-							delete d.data;
-							delete d.children;
-							tmp.original = d;
-							m[tmp.id] = tmp;
-							if(tmp.state.selected) {
-								add.push(tmp.id);
-							}
-							return tmp.id;
-						};
-
-					if(dat.length && dat[0].id !== undefined && dat[0].parent !== undefined) {
-						// Flat JSON support (for easy import from DB):
-						// 1) convert to object (foreach)
-						for(i = 0, j = dat.length; i < j; i++) {
-							if(!dat[i].children) {
-								dat[i].children = [];
-							}
-							m[dat[i].id.toString()] = dat[i];
-						}
-						// 2) populate children (foreach)
-						for(i = 0, j = dat.length; i < j; i++) {
-							m[dat[i].parent.toString()].children.push(dat[i].id.toString());
-							// populate parent.children_d
-							p.children_d.push(dat[i].id.toString());
-						}
-						// 3) normalize && populate parents and children_d with recursion
-						for(i = 0, j = p.children.length; i < j; i++) {
-							tmp = parse_flat(m[p.children[i]], par, p.parents.concat());
-							dpc.push(tmp);
-							if(m[tmp].children_d.length) {
-								dpc = dpc.concat(m[tmp].children_d);
-							}
-						}
-						for(i = 0, j = p.parents.length; i < j; i++) {
-							m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);
-						}
-						// ?) three_state selection - p.state.selected && t - (if three_state foreach(dat => ch) -> foreach(parents) if(parent.selected) child.selected = true;
-						rslt = {
-							'cnt' : t_cnt,
-							'mod' : m,
-							'sel' : sel,
-							'par' : par,
-							'dpc' : dpc,
-							'add' : add
-						};
-					}
-					else {
-						for(i = 0, j = dat.length; i < j; i++) {
-							tmp = parse_nest(dat[i], par, p.parents.concat());
-							if(tmp) {
-								chd.push(tmp);
-								dpc.push(tmp);
-								if(m[tmp].children_d.length) {
-									dpc = dpc.concat(m[tmp].children_d);
-								}
-							}
-						}
-						p.children = chd;
-						p.children_d = dpc;
-						for(i = 0, j = p.parents.length; i < j; i++) {
-							m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc);
-						}
-						rslt = {
-							'cnt' : t_cnt,
-							'mod' : m,
-							'sel' : sel,
-							'par' : par,
-							'dpc' : dpc,
-							'add' : add
-						};
-					}
-					return rslt;
-				},
-				rslt = function (rslt, worker) {
-					this._cnt = rslt.cnt;
-					this._model.data = rslt.mod; // breaks the reference in load_node - careful
-
-					if(worker) {
-						var i, j, a = rslt.add, r = rslt.sel, s = this._data.core.selected.slice(), m = this._model.data;
-						// if selection was changed while calculating in worker
-						if(r.length !== s.length || $.vakata.array_unique(r.concat(s)).length !== r.length) {
-							// deselect nodes that are no longer selected
-							for(i = 0, j = r.length; i < j; i++) {
-								if($.inArray(r[i], a) === -1 && $.inArray(r[i], s) === -1) {
-									m[r[i]].state.selected = false;
-								}
-							}
-							// select nodes that were selected in the mean time
-							for(i = 0, j = s.length; i < j; i++) {
-								if($.inArray(s[i], r) === -1) {
-									m[s[i]].state.selected = true;
-								}
-							}
-						}
-					}
-					if(rslt.add.length) {
-						this._data.core.selected = this._data.core.selected.concat(rslt.add);
-					}
-
-					this.trigger('model', { "nodes" : rslt.dpc, 'parent' : rslt.par });
-
-					if(rslt.par !== '#') {
-						this._node_changed(rslt.par);
-						this.redraw();
-					}
-					else {
-						// this.get_container_ul().children('.jstree-initial-node').remove();
-						this.redraw(true);
-					}
-					if(rslt.add.length) {
-						this.trigger('changed', { 'action' : 'model', 'selected' : this._data.core.selected });
-					}
-					cb.call(this, true);
-				};
-			if(this.settings.core.worker && window.Blob && window.URL && window.Worker) {
-				try {
-					if(this._wrk === null) {
-						this._wrk = window.URL.createObjectURL(
-							new window.Blob(
-								['self.onmessage = ' + func.toString().replace(/return ([^;}]+)[\s;}]+$/, 'postMessage($1);}')],
-								{type:"text/javascript"}
-							)
-						);
-					}
-					w = new window.Worker(this._wrk);
-					w.onmessage = $.proxy(function (e) {
-						rslt.call(this, e.data, true);
-						this._data.core.working = false;
-						if(this._data.core.worker_queue.length) {
-							this._append_json_data.apply(this, this._data.core.worker_queue.shift());
-						}
-					}, this);
-					if(!this._data.core.working) {
-						this._data.core.working = true;
-						w.postMessage(args);
-					}
-					else {
-						this._data.core.worker_queue.push([dom, data, cb]);
-					}
-				}
-				catch(e) {
-					rslt.call(this, func(args), false);
-				}
-			}
-			else {
-				rslt.call(this, func(args), false);
-			}
-		},
-		/**
-		 * parses a node from a jQuery object and appends them to the in memory tree model. Used internally.
-		 * @private
-		 * @name _parse_model_from_html(d [, p, ps])
-		 * @param  {jQuery} d the jQuery object to parse
-		 * @param  {String} p the parent ID
-		 * @param  {Array} ps list of all parents
-		 * @return {String} the ID of the object added to the model
-		 */
-		_parse_model_from_html : function (d, p, ps) {
-			if(!ps) { ps = []; }
-			else { ps = [].concat(ps); }
-			if(p) { ps.unshift(p); }
-			var c, e, m = this._model.data,
-				data = {
-					id			: false,
-					text		: false,
-					icon		: true,
-					parent		: p,
-					parents		: ps,
-					children	: [],
-					children_d	: [],
-					data		: null,
-					state		: { },
-					li_attr		: { id : false },
-					a_attr		: { href : '#' },
-					original	: false
-				}, i, tmp, tid;
-			for(i in this._model.default_state) {
-				if(this._model.default_state.hasOwnProperty(i)) {
-					data.state[i] = this._model.default_state[i];
-				}
-			}
-			tmp = $.vakata.attributes(d, true);
-			$.each(tmp, function (i, v) {
-				v = $.trim(v);
-				if(!v.length) { return true; }
-				data.li_attr[i] = v;
-				if(i === 'id') {
-					data.id = v.toString();
-				}
-			});
-			tmp = d.children('a').eq(0);
-			if(tmp.length) {
-				tmp = $.vakata.attributes(tmp, true);
-				$.each(tmp, function (i, v) {
-					v = $.trim(v);
-					if(v.length) {
-						data.a_attr[i] = v;
-					}
-				});
-			}
-			tmp = d.children("a:eq(0)").length ? d.children("a:eq(0)").clone() : d.clone();
-			tmp.children("ins, i, ul").remove();
-			tmp = tmp.html();
-			tmp = $('<div />').html(tmp);
-			data.text = this.settings.core.force_text ? tmp.text() : tmp.html();
-			tmp = d.data();
-			data.data = tmp ? $.extend(true, {}, tmp) : null;
-			data.state.opened = d.hasClass('jstree-open');
-			data.state.selected = d.children('a').hasClass('jstree-clicked');
-			data.state.disabled = d.children('a').hasClass('jstree-disabled');
-			if(data.data && data.data.jstree) {
-				for(i in data.data.jstree) {
-					if(data.data.jstree.hasOwnProperty(i)) {
-						data.state[i] = data.data.jstree[i];
-					}
-				}
-			}
-			tmp = d.children("a").children(".jstree-themeicon");
-			if(tmp.length) {
-				data.icon = tmp.hasClass('jstree-themeicon-hidden') ? false : tmp.attr('rel');
-			}
-			if(data.state.icon) {
-				data.icon = data.state.icon;
-			}
-			tmp = d.children("ul").children("li");
-			do {
-				tid = 'j' + this._id + '_' + (++this._cnt);
-			} while(m[tid]);
-			data.id = data.li_attr.id ? data.li_attr.id.toString() : tid;
-			if(tmp.length) {
-				tmp.each($.proxy(function (i, v) {
-					c = this._parse_model_from_html($(v), data.id, ps);
-					e = this._model.data[c];
-					data.children.push(c);
-					if(e.children_d.length) {
-						data.children_d = data.children_d.concat(e.children_d);
-					}
-				}, this));
-				data.children_d = data.children_d.concat(data.children);
-			}
-			else {
-				if(d.hasClass('jstree-closed')) {
-					data.state.loaded = false;
-				}
-			}
-			if(data.li_attr['class']) {
-				data.li_attr['class'] = data.li_attr['class'].replace('jstree-closed','').replace('jstree-open','');
-			}
-			if(data.a_attr['class']) {
-				data.a_attr['class'] = data.a_attr['class'].replace('jstree-clicked','').replace('jstree-disabled','');
-			}
-			m[data.id] = data;
-			if(data.state.selected) {
-				this._data.core.selected.push(data.id);
-			}
-			return data.id;
-		},
-		/**
-		 * parses a node from a JSON object (used when dealing with flat data, which has no nesting of children, but has id and parent properties) and appends it to the in memory tree model. Used internally.
-		 * @private
-		 * @name _parse_model_from_flat_json(d [, p, ps])
-		 * @param  {Object} d the JSON object to parse
-		 * @param  {String} p the parent ID
-		 * @param  {Array} ps list of all parents
-		 * @return {String} the ID of the object added to the model
-		 */
-		_parse_model_from_flat_json : function (d, p, ps) {
-			if(!ps) { ps = []; }
-			else { ps = ps.concat(); }
-			if(p) { ps.unshift(p); }
-			var tid = d.id.toString(),
-				m = this._model.data,
-				df = this._model.default_state,
-				i, j, c, e,
-				tmp = {
-					id			: tid,
-					text		: d.text || '',
-					icon		: d.icon !== undefined ? d.icon : true,
-					parent		: p,
-					parents		: ps,
-					children	: d.children || [],
-					children_d	: d.children_d || [],
-					data		: d.data,
-					state		: { },
-					li_attr		: { id : false },
-					a_attr		: { href : '#' },
-					original	: false
-				};
-			for(i in df) {
-				if(df.hasOwnProperty(i)) {
-					tmp.state[i] = df[i];
-				}
-			}
-			if(d && d.data && d.data.jstree && d.data.jstree.icon) {
-				tmp.icon = d.data.jstree.icon;
-			}
-			if(d && d.data) {
-				tmp.data = d.data;
-				if(d.data.jstree) {
-					for(i in d.data.jstree) {
-						if(d.data.jstree.hasOwnProperty(i)) {
-							tmp.state[i] = d.data.jstree[i];
-						}
-					}
-				}
-			}
-			if(d && typeof d.state === 'object') {
-				for (i in d.state) {
-					if(d.state.hasOwnProperty(i)) {
-						tmp.state[i] = d.state[i];
-					}
-				}
-			}
-			if(d && typeof d.li_attr === 'object') {
-				for (i in d.li_attr) {
-					if(d.li_attr.hasOwnProperty(i)) {
-						tmp.li_attr[i] = d.li_attr[i];
-					}
-				}
-			}
-			if(!tmp.li_attr.id) {
-				tmp.li_attr.id = tid;
-			}
-			if(d && typeof d.a_attr === 'object') {
-				for (i in d.a_attr) {
-					if(d.a_attr.hasOwnProperty(i)) {
-						tmp.a_attr[i] = d.a_attr[i];
-					}
-				}
-			}
-			if(d && d.children && d.children === true) {
-				tmp.state.loaded = false;
-				tmp.children = [];
-				tmp.children_d = [];
-			}
-			m[tmp.id] = tmp;
-			for(i = 0, j = tmp.children.length; i < j; i++) {
-				c = this._parse_model_from_flat_json(m[tmp.children[i]], tmp.id, ps);
-				e = m[c];
-				tmp.children_d.push(c);
-				if(e.children_d.length) {
-					tmp.children_d = tmp.children_d.concat(e.children_d);
-				}
-			}
-			delete d.data;
-			delete d.children;
-			m[tmp.id].original = d;
-			if(tmp.state.selected) {
-				this._data.core.selected.push(tmp.id);
-			}
-			return tmp.id;
-		},
-		/**
-		 * parses a node from a JSON object and appends it to the in memory tree model. Used internally.
-		 * @private
-		 * @name _parse_model_from_json(d [, p, ps])
-		 * @param  {Object} d the JSON object to parse
-		 * @param  {String} p the parent ID
-		 * @param  {Array} ps list of all parents
-		 * @return {String} the ID of the object added to the model
-		 */
-		_parse_model_from_json : function (d, p, ps) {
-			if(!ps) { ps = []; }
-			else { ps = ps.concat(); }
-			if(p) { ps.unshift(p); }
-			var tid = false, i, j, c, e, m = this._model.data, df = this._model.default_state, tmp;
-			do {
-				tid = 'j' + this._id + '_' + (++this._cnt);
-			} while(m[tid]);
-
-			tmp = {
-				id			: false,
-				text		: typeof d === 'string' ? d : '',
-				icon		: typeof d === 'object' && d.icon !== undefined ? d.icon : true,
-				parent		: p,
-				parents		: ps,
-				children	: [],
-				children_d	: [],
-				data		: null,
-				state		: { },
-				li_attr		: { id : false },
-				a_attr		: { href : '#' },
-				original	: false
-			};
-			for(i in df) {
-				if(df.hasOwnProperty(i)) {
-					tmp.state[i] = df[i];
-				}
-			}
-			if(d && d.id) { tmp.id = d.id.toString(); }
-			if(d && d.text) { tmp.text = d.text; }
-			if(d && d.data && d.data.jstree && d.data.jstree.icon) {
-				tmp.icon = d.data.jstree.icon;
-			}
-			if(d && d.data) {
-				tmp.data = d.data;
-				if(d.data.jstree) {
-					for(i in d.data.jstree) {
-						if(d.data.jstree.hasOwnProperty(i)) {
-							tmp.state[i] = d.data.jstree[i];
-						}
-					}
-				}
-			}
-			if(d && typeof d.state === 'object') {
-				for (i in d.state) {
-					if(d.state.hasOwnProperty(i)) {
-						tmp.state[i] = d.state[i];
-					}
-				}
-			}
-			if(d && typeof d.li_attr === 'object') {
-				for (i in d.li_attr) {
-					if(d.li_attr.hasOwnProperty(i)) {
-						tmp.li_attr[i] = d.li_attr[i];
-					}
-				}
-			}
-			if(tmp.li_attr.id && !tmp.id) {
-				tmp.id = tmp.li_attr.id.toString();
-			}
-			if(!tmp.id) {
-				tmp.id = tid;
-			}
-			if(!tmp.li_attr.id) {
-				tmp.li_attr.id = tmp.id;
-			}
-			if(d && typeof d.a_attr === 'object') {
-				for (i in d.a_attr) {
-					if(d.a_attr.hasOwnProperty(i)) {
-						tmp.a_attr[i] = d.a_attr[i];
-					}
-				}
-			}
-			if(d && d.children && d.children.length) {
-				for(i = 0, j = d.children.length; i < j; i++) {
-					c = this._parse_model_from_json(d.children[i], tmp.id, ps);
-					e = m[c];
-					tmp.children.push(c);
-					if(e.children_d.length) {
-						tmp.children_d = tmp.children_d.concat(e.children_d);
-					}
-				}
-				tmp.children_d = tmp.children_d.concat(tmp.children);
-			}
-			if(d && d.children && d.children === true) {
-				tmp.state.loaded = false;
-				tmp.children = [];
-				tmp.children_d = [];
-			}
-			delete d.data;
-			delete d.children;
-			tmp.original = d;
-			m[tmp.id] = tmp;
-			if(tmp.state.selected) {
-				this._data.core.selected.push(tmp.id);
-			}
-			return tmp.id;
-		},
-		/**
-		 * redraws all nodes that need to be redrawn. Used internally.
-		 * @private
-		 * @name _redraw()
-		 * @trigger redraw.jstree
-		 */
-		_redraw : function () {
-			var nodes = this._model.force_full_redraw ? this._model.data['#'].children.concat([]) : this._model.changed.concat([]),
-				f = document.createElement('UL'), tmp, i, j;
-			for(i = 0, j = nodes.length; i < j; i++) {
-				tmp = this.redraw_node(nodes[i], true, this._model.force_full_redraw);
-				if(tmp && this._model.force_full_redraw) {
-					f.appendChild(tmp);
-				}
-			}
-			if(this._model.force_full_redraw) {
-				f.className = this.get_container_ul()[0].className;
-				this.element.empty().append(f);
-				//this.get_container_ul()[0].appendChild(f);
-			}
-			this._model.force_full_redraw = false;
-			this._model.changed = [];
-			/**
-			 * triggered after nodes are redrawn
-			 * @event
-			 * @name redraw.jstree
-			 * @param {array} nodes the redrawn nodes
-			 */
-			this.trigger('redraw', { "nodes" : nodes });
-		},
-		/**
-		 * redraws all nodes that need to be redrawn or optionally - the whole tree
-		 * @name redraw([full])
-		 * @param {Boolean} full if set to `true` all nodes are redrawn.
-		 */
-		redraw : function (full) {
-			if(full) {
-				this._model.force_full_redraw = true;
-			}
-			//if(this._model.redraw_timeout) {
-			//	clearTimeout(this._model.redraw_timeout);
-			//}
-			//this._model.redraw_timeout = setTimeout($.proxy(this._redraw, this),0);
-			this._redraw();
-		},
-		/**
-		 * redraws a single node. Used internally.
-		 * @private
-		 * @name redraw_node(node, deep, is_callback)
-		 * @param {mixed} node the node to redraw
-		 * @param {Boolean} deep should child nodes be redrawn too
-		 * @param {Boolean} is_callback is this a recursion call
-		 */
-		redraw_node : function (node, deep, is_callback) {
-			var obj = this.get_node(node),
-				par = false,
-				ind = false,
-				old = false,
-				i = false,
-				j = false,
-				k = false,
-				c = '',
-				d = document,
-				m = this._model.data,
-				f = false,
-				s = false,
-				tmp = null;
-			if(!obj) { return false; }
-			if(obj.id === '#') {  return this.redraw(true); }
-			deep = deep || obj.children.length === 0;
-			node = !document.querySelector ? document.getElementById(obj.id) : this.element[0].querySelector('#' + ("0123456789".indexOf(obj.id[0]) !== -1 ? '\\3' + obj.id[0] + ' ' + obj.id.substr(1).replace($.jstree.idregex,'\\$&') : obj.id.replace($.jstree.idregex,'\\$&')) ); //, this.element);
-			if(!node) {
-				deep = true;
-				//node = d.createElement('LI');
-				if(!is_callback) {
-					par = obj.parent !== '#' ? $('#' + obj.parent.replace($.jstree.idregex,'\\$&'), this.element)[0] : null;
-					if(par !== null && (!par || !m[obj.parent].state.opened)) {
-						return false;
-					}
-					ind = $.inArray(obj.id, par === null ? m['#'].children : m[obj.parent].children);
-				}
-			}
-			else {
-				node = $(node);
-				if(!is_callback) {
-					par = node.parent().parent()[0];
-					if(par === this.element[0]) {
-						par = null;
-					}
-					ind = node.index();
-				}
-				// m[obj.id].data = node.data(); // use only node's data, no need to touch jquery storage
-				if(!deep && obj.children.length && !node.children('.jstree-children').length) {
-					deep = true;
-				}
-				if(!deep) {
-					old = node.children('.jstree-children')[0];
-				}
-				s = node.attr('aria-selected');
-				f = node.children('.jstree-anchor')[0] === document.activeElement;
-				node.remove();
-				//node = d.createElement('LI');
-				//node = node[0];
-			}
-			node = _node.cloneNode(true);
-			// node is DOM, deep is boolean
-
-			c = 'jstree-node ';
-			for(i in obj.li_attr) {
-				if(obj.li_attr.hasOwnProperty(i)) {
-					if(i === 'id') { continue; }
-					if(i !== 'class') {
-						node.setAttribute(i, obj.li_attr[i]);
-					}
-					else {
-						c += obj.li_attr[i];
-					}
-				}
-			}
-			if(s && s !== "false") {
-				node.setAttribute('aria-selected', true);
-			}
-			if(obj.state.loaded && !obj.children.length) {
-				c += ' jstree-leaf';
-			}
-			else {
-				c += obj.state.opened && obj.state.loaded ? ' jstree-open' : ' jstree-closed';
-				node.setAttribute('aria-expanded', (obj.state.opened && obj.state.loaded) );
-			}
-			if(obj.parent !== null && m[obj.parent].children[m[obj.parent].children.length - 1] === obj.id) {
-				c += ' jstree-last';
-			}
-			node.id = obj.id;
-			node.className = c;
-			c = ( obj.state.selected ? ' jstree-clicked' : '') + ( obj.state.disabled ? ' jstree-disabled' : '');
-			for(j in obj.a_attr) {
-				if(obj.a_attr.hasOwnProperty(j)) {
-					if(j === 'href' && obj.a_attr[j] === '#') { continue; }
-					if(j !== 'class') {
-						node.childNodes[1].setAttribute(j, obj.a_attr[j]);
-					}
-					else {
-						c += ' ' + obj.a_attr[j];
-					}
-				}
-			}
-			if(c.length) {
-				node.childNodes[1].className = 'jstree-anchor ' + c;
-			}
-			if((obj.icon && obj.icon !== true) || obj.icon === false) {
-				if(obj.icon === false) {
-					node.childNodes[1].childNodes[0].className += ' jstree-themeicon-hidden';
-				}
-				else if(obj.icon.indexOf('/') === -1 && obj.icon.indexOf('.') === -1) {
-					node.childNodes[1].childNodes[0].className += ' ' + obj.icon + ' jstree-themeicon-custom';
-				}
-				else {
-					node.childNodes[1].childNodes[0].style.backgroundImage = 'url('+obj.icon+')';
-					node.childNodes[1].childNodes[0].style.backgroundPosition = 'center center';
-					node.childNodes[1].childNodes[0].style.backgroundSize = 'auto';
-					node.childNodes[1].childNodes[0].className += ' jstree-themeicon-custom';
-				}
-			}
-
-			if(this.settings.core.force_text) {
-				node.childNodes[1].appendChild(d.createTextNode(obj.text));
-			}
-			else {
-				node.childNodes[1].innerHTML += obj.text;
-			}
-
-			if(deep && obj.children.length && obj.state.opened && obj.state.loaded) {
-				k = d.createElement('UL');
-				k.setAttribute('role', 'group');
-				k.className = 'jstree-children';
-				for(i = 0, j = obj.children.length; i < j; i++) {
-					k.appendChild(this.redraw_node(obj.children[i], deep, true));
-				}
-				node.appendChild(k);
-			}
-			if(old) {
-				node.appendChild(old);
-			}
-			if(!is_callback) {
-				// append back using par / ind
-				if(!par) {
-					par = this.element[0];
-				}
-				for(i = 0, j = par.childNodes.length; i < j; i++) {
-					if(par.childNodes[i] && par.childNodes[i].className && par.childNodes[i].className.indexOf('jstree-children') !== -1) {
-						tmp = par.childNodes[i];
-						break;
-					}
-				}
-				if(!tmp) {
-					tmp = d.createElement('UL');
-					tmp.setAttribute('role', 'group');
-					tmp.className = 'jstree-children';
-					par.appendChild(tmp);
-				}
-				par = tmp;
-
-				if(ind < par.childNodes.length) {
-					par.insertBefore(node, par.childNodes[ind]);
-				}
-				else {
-					par.appendChild(node);
-				}
-				if(f) {
-					node.childNodes[1].focus();
-				}
-			}
-			if(obj.state.opened && !obj.state.loaded) {
-				obj.state.opened = false;
-				setTimeout($.proxy(function () {
-					this.open_node(obj.id, false, 0);
-				}, this), 0);
-			}
-			return node;
-		},
-		/**
-		 * opens a node, revaling its children. If the node is not loaded it will be loaded and opened once ready.
-		 * @name open_node(obj [, callback, animation])
-		 * @param {mixed} obj the node to open
-		 * @param {Function} callback a function to execute once the node is opened
-		 * @param {Number} animation the animation duration in milliseconds when opening the node (overrides the `core.animation` setting). Use `false` for no animation.
-		 * @trigger open_node.jstree, after_open.jstree, before_open.jstree
-		 */
-		open_node : function (obj, callback, animation) {
-			var t1, t2, d, t;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.open_node(obj[t1], callback, animation);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') {
-				return false;
-			}
-			animation = animation === undefined ? this.settings.core.animation : animation;
-			if(!this.is_closed(obj)) {
-				if(callback) {
-					callback.call(this, obj, false);
-				}
-				return false;
-			}
-			if(!this.is_loaded(obj)) {
-				if(this.is_loading(obj)) {
-					return setTimeout($.proxy(function () {
-						this.open_node(obj, callback, animation);
-					}, this), 500);
-				}
-				this.load_node(obj, function (o, ok) {
-					return ok ? this.open_node(o, callback, animation) : (callback ? callback.call(this, o, false) : false);
-				});
-			}
-			else {
-				d = this.get_node(obj, true);
-				t = this;
-				if(d.length) {
-					if(obj.children.length && !this._firstChild(d.children('.jstree-children')[0])) {
-						obj.state.opened = true;
-						this.redraw_node(obj, true);
-						d = this.get_node(obj, true);
-					}
-					if(!animation) {
-						this.trigger('before_open', { "node" : obj });
-						d[0].className = d[0].className.replace('jstree-closed', 'jstree-open');
-						d[0].setAttribute("aria-expanded", true);
-					}
-					else {
-						this.trigger('before_open', { "node" : obj });
-						d
-							.children(".jstree-children").css("display","none").end()
-							.removeClass("jstree-closed").addClass("jstree-open").attr("aria-expanded", true)
-							.children(".jstree-children").stop(true, true)
-								.slideDown(animation, function () {
-									this.style.display = "";
-									t.trigger("after_open", { "node" : obj });
-								});
-					}
-				}
-				obj.state.opened = true;
-				if(callback) {
-					callback.call(this, obj, true);
-				}
-				if(!d.length) {
-					/**
-					 * triggered when a node is about to be opened (if the node is supposed to be in the DOM, it will be, but it won't be visible yet)
-					 * @event
-					 * @name before_open.jstree
-					 * @param {Object} node the opened node
-					 */
-					this.trigger('before_open', { "node" : obj });
-				}
-				/**
-				 * triggered when a node is opened (if there is an animation it will not be completed yet)
-				 * @event
-				 * @name open_node.jstree
-				 * @param {Object} node the opened node
-				 */
-				this.trigger('open_node', { "node" : obj });
-				if(!animation || !d.length) {
-					/**
-					 * triggered when a node is opened and the animation is complete
-					 * @event
-					 * @name after_open.jstree
-					 * @param {Object} node the opened node
-					 */
-					this.trigger("after_open", { "node" : obj });
-				}
-			}
-		},
-		/**
-		 * opens every parent of a node (node should be loaded)
-		 * @name _open_to(obj)
-		 * @param {mixed} obj the node to reveal
-		 * @private
-		 */
-		_open_to : function (obj) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') {
-				return false;
-			}
-			var i, j, p = obj.parents;
-			for(i = 0, j = p.length; i < j; i+=1) {
-				if(i !== '#') {
-					this.open_node(p[i], false, 0);
-				}
-			}
-			return $('#' + obj.id.replace($.jstree.idregex,'\\$&'), this.element);
-		},
-		/**
-		 * closes a node, hiding its children
-		 * @name close_node(obj [, animation])
-		 * @param {mixed} obj the node to close
-		 * @param {Number} animation the animation duration in milliseconds when closing the node (overrides the `core.animation` setting). Use `false` for no animation.
-		 * @trigger close_node.jstree, after_close.jstree
-		 */
-		close_node : function (obj, animation) {
-			var t1, t2, t, d;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.close_node(obj[t1], animation);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') {
-				return false;
-			}
-			if(this.is_closed(obj)) {
-				return false;
-			}
-			animation = animation === undefined ? this.settings.core.animation : animation;
-			t = this;
-			d = this.get_node(obj, true);
-			if(d.length) {
-				if(!animation) {
-					d[0].className = d[0].className.replace('jstree-open', 'jstree-closed');
-					d.attr("aria-expanded", false).children('.jstree-children').remove();
-				}
-				else {
-					d
-						.children(".jstree-children").attr("style","display:block !important").end()
-						.removeClass("jstree-open").addClass("jstree-closed").attr("aria-expanded", false)
-						.children(".jstree-children").stop(true, true).slideUp(animation, function () {
-							this.style.display = "";
-							d.children('.jstree-children').remove();
-							t.trigger("after_close", { "node" : obj });
-						});
-				}
-			}
-			obj.state.opened = false;
-			/**
-			 * triggered when a node is closed (if there is an animation it will not be complete yet)
-			 * @event
-			 * @name close_node.jstree
-			 * @param {Object} node the closed node
-			 */
-			this.trigger('close_node',{ "node" : obj });
-			if(!animation || !d.length) {
-				/**
-				 * triggered when a node is closed and the animation is complete
-				 * @event
-				 * @name after_close.jstree
-				 * @param {Object} node the closed node
-				 */
-				this.trigger("after_close", { "node" : obj });
-			}
-		},
-		/**
-		 * toggles a node - closing it if it is open, opening it if it is closed
-		 * @name toggle_node(obj)
-		 * @param {mixed} obj the node to toggle
-		 */
-		toggle_node : function (obj) {
-			var t1, t2;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.toggle_node(obj[t1]);
-				}
-				return true;
-			}
-			if(this.is_closed(obj)) {
-				return this.open_node(obj);
-			}
-			if(this.is_open(obj)) {
-				return this.close_node(obj);
-			}
-		},
-		/**
-		 * opens all nodes within a node (or the tree), revaling their children. If the node is not loaded it will be loaded and opened once ready.
-		 * @name open_all([obj, animation, original_obj])
-		 * @param {mixed} obj the node to open recursively, omit to open all nodes in the tree
-		 * @param {Number} animation the animation duration in milliseconds when opening the nodes, the default is no animation
-		 * @param {jQuery} reference to the node that started the process (internal use)
-		 * @trigger open_all.jstree
-		 */
-		open_all : function (obj, animation, original_obj) {
-			if(!obj) { obj = '#'; }
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			var dom = obj.id === '#' ? this.get_container_ul() : this.get_node(obj, true), i, j, _this;
-			if(!dom.length) {
-				for(i = 0, j = obj.children_d.length; i < j; i++) {
-					if(this.is_closed(this._model.data[obj.children_d[i]])) {
-						this._model.data[obj.children_d[i]].state.opened = true;
-					}
-				}
-				return this.trigger('open_all', { "node" : obj });
-			}
-			original_obj = original_obj || dom;
-			_this = this;
-			dom = this.is_closed(obj) ? dom.find('.jstree-closed').addBack() : dom.find('.jstree-closed');
-			dom.each(function () {
-				_this.open_node(
-					this,
-					function(node, status) { if(status && this.is_parent(node)) { this.open_all(node, animation, original_obj); } },
-					animation || 0
-				);
-			});
-			if(original_obj.find('.jstree-closed').length === 0) {
-				/**
-				 * triggered when an `open_all` call completes
-				 * @event
-				 * @name open_all.jstree
-				 * @param {Object} node the opened node
-				 */
-				this.trigger('open_all', { "node" : this.get_node(original_obj) });
-			}
-		},
-		/**
-		 * closes all nodes within a node (or the tree), revaling their children
-		 * @name close_all([obj, animation])
-		 * @param {mixed} obj the node to close recursively, omit to close all nodes in the tree
-		 * @param {Number} animation the animation duration in milliseconds when closing the nodes, the default is no animation
-		 * @trigger close_all.jstree
-		 */
-		close_all : function (obj, animation) {
-			if(!obj) { obj = '#'; }
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			var dom = obj.id === '#' ? this.get_container_ul() : this.get_node(obj, true),
-				_this = this, i, j;
-			if(!dom.length) {
-				for(i = 0, j = obj.children_d.length; i < j; i++) {
-					this._model.data[obj.children_d[i]].state.opened = false;
-				}
-				return this.trigger('close_all', { "node" : obj });
-			}
-			dom = this.is_open(obj) ? dom.find('.jstree-open').addBack() : dom.find('.jstree-open');
-			$(dom.get().reverse()).each(function () { _this.close_node(this, animation || 0); });
-			/**
-			 * triggered when an `close_all` call completes
-			 * @event
-			 * @name close_all.jstree
-			 * @param {Object} node the closed node
-			 */
-			this.trigger('close_all', { "node" : obj });
-		},
-		/**
-		 * checks if a node is disabled (not selectable)
-		 * @name is_disabled(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		is_disabled : function (obj) {
-			obj = this.get_node(obj);
-			return obj && obj.state && obj.state.disabled;
-		},
-		/**
-		 * enables a node - so that it can be selected
-		 * @name enable_node(obj)
-		 * @param {mixed} obj the node to enable
-		 * @trigger enable_node.jstree
-		 */
-		enable_node : function (obj) {
-			var t1, t2;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.enable_node(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') {
-				return false;
-			}
-			obj.state.disabled = false;
-			this.get_node(obj,true).children('.jstree-anchor').removeClass('jstree-disabled');
-			/**
-			 * triggered when an node is enabled
-			 * @event
-			 * @name enable_node.jstree
-			 * @param {Object} node the enabled node
-			 */
-			this.trigger('enable_node', { 'node' : obj });
-		},
-		/**
-		 * disables a node - so that it can not be selected
-		 * @name disable_node(obj)
-		 * @param {mixed} obj the node to disable
-		 * @trigger disable_node.jstree
-		 */
-		disable_node : function (obj) {
-			var t1, t2;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.disable_node(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') {
-				return false;
-			}
-			obj.state.disabled = true;
-			this.get_node(obj,true).children('.jstree-anchor').addClass('jstree-disabled');
-			/**
-			 * triggered when an node is disabled
-			 * @event
-			 * @name disable_node.jstree
-			 * @param {Object} node the disabled node
-			 */
-			this.trigger('disable_node', { 'node' : obj });
-		},
-		/**
-		 * called when a node is selected by the user. Used internally.
-		 * @private
-		 * @name activate_node(obj, e)
-		 * @param {mixed} obj the node
-		 * @param {Object} e the related event
-		 * @trigger activate_node.jstree
-		 */
-		activate_node : function (obj, e) {
-			if(this.is_disabled(obj)) {
-				return false;
-			}
-
-			// ensure last_clicked is still in the DOM, make it fresh (maybe it was moved?) and make sure it is still selected, if not - make last_clicked the last selected node
-			this._data.core.last_clicked = this._data.core.last_clicked && this._data.core.last_clicked.id !== undefined ? this.get_node(this._data.core.last_clicked.id) : null;
-			if(this._data.core.last_clicked && !this._data.core.last_clicked.state.selected) { this._data.core.last_clicked = null; }
-			if(!this._data.core.last_clicked && this._data.core.selected.length) { this._data.core.last_clicked = this.get_node(this._data.core.selected[this._data.core.selected.length - 1]); }
-
-			if(!this.settings.core.multiple || (!e.metaKey && !e.ctrlKey && !e.shiftKey) || (e.shiftKey && (!this._data.core.last_clicked || !this.get_parent(obj) || this.get_parent(obj) !== this._data.core.last_clicked.parent ) )) {
-				if(!this.settings.core.multiple && (e.metaKey || e.ctrlKey || e.shiftKey) && this.is_selected(obj)) {
-					this.deselect_node(obj, false, e);
-				}
-				else {
-					this.deselect_all(true);
-					this.select_node(obj, false, false, e);
-					this._data.core.last_clicked = this.get_node(obj);
-				}
-			}
-			else {
-				if(e.shiftKey) {
-					var o = this.get_node(obj).id,
-						l = this._data.core.last_clicked.id,
-						p = this.get_node(this._data.core.last_clicked.parent).children,
-						c = false,
-						i, j;
-					for(i = 0, j = p.length; i < j; i += 1) {
-						// separate IFs work whem o and l are the same
-						if(p[i] === o) {
-							c = !c;
-						}
-						if(p[i] === l) {
-							c = !c;
-						}
-						if(c || p[i] === o || p[i] === l) {
-							this.select_node(p[i], false, false, e);
-						}
-						else {
-							this.deselect_node(p[i], false, e);
-						}
-					}
-				}
-				else {
-					if(!this.is_selected(obj)) {
-						this.select_node(obj, false, false, e);
-					}
-					else {
-						this.deselect_node(obj, false, e);
-					}
-				}
-			}
-			/**
-			 * triggered when an node is clicked or intercated with by the user
-			 * @event
-			 * @name activate_node.jstree
-			 * @param {Object} node
-			 */
-			this.trigger('activate_node', { 'node' : this.get_node(obj) });
-		},
-		/**
-		 * applies the hover state on a node, called when a node is hovered by the user. Used internally.
-		 * @private
-		 * @name hover_node(obj)
-		 * @param {mixed} obj
-		 * @trigger hover_node.jstree
-		 */
-		hover_node : function (obj) {
-			obj = this.get_node(obj, true);
-			if(!obj || !obj.length || obj.children('.jstree-hovered').length) {
-				return false;
-			}
-			var o = this.element.find('.jstree-hovered'), t = this.element;
-			if(o && o.length) { this.dehover_node(o); }
-
-			obj.children('.jstree-anchor').addClass('jstree-hovered');
-			/**
-			 * triggered when an node is hovered
-			 * @event
-			 * @name hover_node.jstree
-			 * @param {Object} node
-			 */
-			this.trigger('hover_node', { 'node' : this.get_node(obj) });
-			setTimeout(function () { t.attr('aria-activedescendant', obj[0].id); obj.attr('aria-selected', true); }, 0);
-		},
-		/**
-		 * removes the hover state from a nodecalled when a node is no longer hovered by the user. Used internally.
-		 * @private
-		 * @name dehover_node(obj)
-		 * @param {mixed} obj
-		 * @trigger dehover_node.jstree
-		 */
-		dehover_node : function (obj) {
-			obj = this.get_node(obj, true);
-			if(!obj || !obj.length || !obj.children('.jstree-hovered').length) {
-				return false;
-			}
-			obj.attr('aria-selected', false).children('.jstree-anchor').removeClass('jstree-hovered');
-			/**
-			 * triggered when an node is no longer hovered
-			 * @event
-			 * @name dehover_node.jstree
-			 * @param {Object} node
-			 */
-			this.trigger('dehover_node', { 'node' : this.get_node(obj) });
-		},
-		/**
-		 * select a node
-		 * @name select_node(obj [, supress_event, prevent_open])
-		 * @param {mixed} obj an array can be used to select multiple nodes
-		 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
-		 * @param {Boolean} prevent_open if set to `true` parents of the selected node won't be opened
-		 * @trigger select_node.jstree, changed.jstree
-		 */
-		select_node : function (obj, supress_event, prevent_open, e) {
-			var dom, t1, t2, th;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.select_node(obj[t1], supress_event, prevent_open, e);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(!obj.state.selected) {
-				obj.state.selected = true;
-				this._data.core.selected.push(obj.id);
-				if(!prevent_open) {
-					dom = this._open_to(obj);
-				}
-				if(dom && dom.length) {
-					dom.children('.jstree-anchor').addClass('jstree-clicked');
-				}
-				/**
-				 * triggered when an node is selected
-				 * @event
-				 * @name select_node.jstree
-				 * @param {Object} node
-				 * @param {Array} selected the current selection
-				 * @param {Object} event the event (if any) that triggered this select_node
-				 */
-				this.trigger('select_node', { 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
-				if(!supress_event) {
-					/**
-					 * triggered when selection changes
-					 * @event
-					 * @name changed.jstree
-					 * @param {Object} node
-					 * @param {Object} action the action that caused the selection to change
-					 * @param {Array} selected the current selection
-					 * @param {Object} event the event (if any) that triggered this changed event
-					 */
-					this.trigger('changed', { 'action' : 'select_node', 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
-				}
-			}
-		},
-		/**
-		 * deselect a node
-		 * @name deselect_node(obj [, supress_event])
-		 * @param {mixed} obj an array can be used to deselect multiple nodes
-		 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
-		 * @trigger deselect_node.jstree, changed.jstree
-		 */
-		deselect_node : function (obj, supress_event, e) {
-			var t1, t2, dom;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.deselect_node(obj[t1], supress_event, e);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(obj.state.selected) {
-				obj.state.selected = false;
-				this._data.core.selected = $.vakata.array_remove_item(this._data.core.selected, obj.id);
-				if(dom.length) {
-					dom.children('.jstree-anchor').removeClass('jstree-clicked');
-				}
-				/**
-				 * triggered when an node is deselected
-				 * @event
-				 * @name deselect_node.jstree
-				 * @param {Object} node
-				 * @param {Array} selected the current selection
-				 * @param {Object} event the event (if any) that triggered this deselect_node
-				 */
-				this.trigger('deselect_node', { 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
-				if(!supress_event) {
-					this.trigger('changed', { 'action' : 'deselect_node', 'node' : obj, 'selected' : this._data.core.selected, 'event' : e });
-				}
-			}
-		},
-		/**
-		 * select all nodes in the tree
-		 * @name select_all([supress_event])
-		 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
-		 * @trigger select_all.jstree, changed.jstree
-		 */
-		select_all : function (supress_event) {
-			var tmp = this._data.core.selected.concat([]), i, j;
-			this._data.core.selected = this._model.data['#'].children_d.concat();
-			for(i = 0, j = this._data.core.selected.length; i < j; i++) {
-				if(this._model.data[this._data.core.selected[i]]) {
-					this._model.data[this._data.core.selected[i]].state.selected = true;
-				}
-			}
-			this.redraw(true);
-			/**
-			 * triggered when all nodes are selected
-			 * @event
-			 * @name select_all.jstree
-			 * @param {Array} selected the current selection
-			 */
-			this.trigger('select_all', { 'selected' : this._data.core.selected });
-			if(!supress_event) {
-				this.trigger('changed', { 'action' : 'select_all', 'selected' : this._data.core.selected, 'old_selection' : tmp });
-			}
-		},
-		/**
-		 * deselect all selected nodes
-		 * @name deselect_all([supress_event])
-		 * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered
-		 * @trigger deselect_all.jstree, changed.jstree
-		 */
-		deselect_all : function (supress_event) {
-			var tmp = this._data.core.selected.concat([]), i, j;
-			for(i = 0, j = this._data.core.selected.length; i < j; i++) {
-				if(this._model.data[this._data.core.selected[i]]) {
-					this._model.data[this._data.core.selected[i]].state.selected = false;
-				}
-			}
-			this._data.core.selected = [];
-			this.element.find('.jstree-clicked').removeClass('jstree-clicked');
-			/**
-			 * triggered when all nodes are deselected
-			 * @event
-			 * @name deselect_all.jstree
-			 * @param {Object} node the previous selection
-			 * @param {Array} selected the current selection
-			 */
-			this.trigger('deselect_all', { 'selected' : this._data.core.selected, 'node' : tmp });
-			if(!supress_event) {
-				this.trigger('changed', { 'action' : 'deselect_all', 'selected' : this._data.core.selected, 'old_selection' : tmp });
-			}
-		},
-		/**
-		 * checks if a node is selected
-		 * @name is_selected(obj)
-		 * @param  {mixed}  obj
-		 * @return {Boolean}
-		 */
-		is_selected : function (obj) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') {
-				return false;
-			}
-			return obj.state.selected;
-		},
-		/**
-		 * get an array of all selected nodes
-		 * @name get_selected([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 */
-		get_selected : function (full) {
-			return full ? $.map(this._data.core.selected, $.proxy(function (i) { return this.get_node(i); }, this)) : this._data.core.selected.slice();
-		},
-		/**
-		 * get an array of all top level selected nodes (ignoring children of selected nodes)
-		 * @name get_top_selected([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 */
-		get_top_selected : function (full) {
-			var tmp = this.get_selected(true),
-				obj = {}, i, j, k, l;
-			for(i = 0, j = tmp.length; i < j; i++) {
-				obj[tmp[i].id] = tmp[i];
-			}
-			for(i = 0, j = tmp.length; i < j; i++) {
-				for(k = 0, l = tmp[i].children_d.length; k < l; k++) {
-					if(obj[tmp[i].children_d[k]]) {
-						delete obj[tmp[i].children_d[k]];
-					}
-				}
-			}
-			tmp = [];
-			for(i in obj) {
-				if(obj.hasOwnProperty(i)) {
-					tmp.push(i);
-				}
-			}
-			return full ? $.map(tmp, $.proxy(function (i) { return this.get_node(i); }, this)) : tmp;
-		},
-		/**
-		 * get an array of all bottom level selected nodes (ignoring selected parents)
-		 * @name get_bottom_selected([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 */
-		get_bottom_selected : function (full) {
-			var tmp = this.get_selected(true),
-				obj = [], i, j;
-			for(i = 0, j = tmp.length; i < j; i++) {
-				if(!tmp[i].children.length) {
-					obj.push(tmp[i].id);
-				}
-			}
-			return full ? $.map(obj, $.proxy(function (i) { return this.get_node(i); }, this)) : obj;
-		},
-		/**
-		 * gets the current state of the tree so that it can be restored later with `set_state(state)`. Used internally.
-		 * @name get_state()
-		 * @private
-		 * @return {Object}
-		 */
-		get_state : function () {
-			var state	= {
-				'core' : {
-					'open' : [],
-					'scroll' : {
-						'left' : this.element.scrollLeft(),
-						'top' : this.element.scrollTop()
-					},
-					/*!
-					'themes' : {
-						'name' : this.get_theme(),
-						'icons' : this._data.core.themes.icons,
-						'dots' : this._data.core.themes.dots
-					},
-					*/
-					'selected' : []
-				}
-			}, i;
-			for(i in this._model.data) {
-				if(this._model.data.hasOwnProperty(i)) {
-					if(i !== '#') {
-						if(this._model.data[i].state.opened) {
-							state.core.open.push(i);
-						}
-						if(this._model.data[i].state.selected) {
-							state.core.selected.push(i);
-						}
-					}
-				}
-			}
-			return state;
-		},
-		/**
-		 * sets the state of the tree. Used internally.
-		 * @name set_state(state [, callback])
-		 * @private
-		 * @param {Object} state the state to restore
-		 * @param {Function} callback an optional function to execute once the state is restored.
-		 * @trigger set_state.jstree
-		 */
-		set_state : function (state, callback) {
-			if(state) {
-				if(state.core) {
-					var res, n, t, _this;
-					if(state.core.open) {
-						if(!$.isArray(state.core.open)) {
-							delete state.core.open;
-							this.set_state(state, callback);
-							return false;
-						}
-						res = true;
-						n = false;
-						t = this;
-						$.each(state.core.open.concat([]), function (i, v) {
-							n = t.get_node(v);
-							if(n) {
-								if(t.is_loaded(v)) {
-									if(t.is_closed(v)) {
-										t.open_node(v, false, 0);
-									}
-									if(state && state.core && state.core.open) {
-										$.vakata.array_remove_item(state.core.open, v);
-									}
-								}
-								else {
-									if(!t.is_loading(v)) {
-										t.open_node(v, $.proxy(function (o, s) {
-											if(!s && state && state.core && state.core.open) {
-												$.vakata.array_remove_item(state.core.open, o.id);
-											}
-											this.set_state(state, callback);
-										}, t), 0);
-									}
-									// there will be some async activity - so wait for it
-									res = false;
-								}
-							}
-						});
-						if(res) {
-							delete state.core.open;
-							this.set_state(state, callback);
-						}
-						return false;
-					}
-					if(state.core.scroll) {
-						if(state.core.scroll && state.core.scroll.left !== undefined) {
-							this.element.scrollLeft(state.core.scroll.left);
-						}
-						if(state.core.scroll && state.core.scroll.top !== undefined) {
-							this.element.scrollTop(state.core.scroll.top);
-						}
-						delete state.core.scroll;
-						this.set_state(state, callback);
-						return false;
-					}
-					/*!
-					if(state.core.themes) {
-						if(state.core.themes.name) {
-							this.set_theme(state.core.themes.name);
-						}
-						if(typeof state.core.themes.dots !== 'undefined') {
-							this[ state.core.themes.dots ? "show_dots" : "hide_dots" ]();
-						}
-						if(typeof state.core.themes.icons !== 'undefined') {
-							this[ state.core.themes.icons ? "show_icons" : "hide_icons" ]();
-						}
-						delete state.core.themes;
-						delete state.core.open;
-						this.set_state(state, callback);
-						return false;
-					}
-					*/
-					if(state.core.selected) {
-						_this = this;
-						this.deselect_all();
-						$.each(state.core.selected, function (i, v) {
-							_this.select_node(v);
-						});
-						delete state.core.selected;
-						this.set_state(state, callback);
-						return false;
-					}
-					if($.isEmptyObject(state.core)) {
-						delete state.core;
-						this.set_state(state, callback);
-						return false;
-					}
-				}
-				if($.isEmptyObject(state)) {
-					state = null;
-					if(callback) { callback.call(this); }
-					/**
-					 * triggered when a `set_state` call completes
-					 * @event
-					 * @name set_state.jstree
-					 */
-					this.trigger('set_state');
-					return false;
-				}
-				return true;
-			}
-			return false;
-		},
-		/**
-		 * refreshes the tree - all nodes are reloaded with calls to `load_node`.
-		 * @name refresh()
-		 * @param {Boolean} skip_loading an option to skip showing the loading indicator
-		 * @param {Mixed} forget_state if set to `true` state will not be reapplied, if set to a function (receiving the current state as argument) the result of that function will be used as state
-		 * @trigger refresh.jstree
-		 */
-		refresh : function (skip_loading, forget_state) {
-			this._data.core.state = forget_state === true ? {} : this.get_state();
-			if(forget_state && $.isFunction(forget_state)) { this._data.core.state = forget_state.call(this, this._data.core.state); }
-			this._cnt = 0;
-			this._model.data = {
-				'#' : {
-					id : '#',
-					parent : null,
-					parents : [],
-					children : [],
-					children_d : [],
-					state : { loaded : false }
-				}
-			};
-			var c = this.get_container_ul()[0].className;
-			if(!skip_loading) {
-				this.element.html("<"+"ul class='"+c+"'><"+"li class='jstree-initial-node jstree-loading jstree-leaf jstree-last'><i class='jstree-icon jstree-ocl'></i><"+"a class='jstree-anchor' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>" + this.get_string("Loading ...") + "</a></li></ul>");
-			}
-			this.load_node('#', function (o, s) {
-				if(s) {
-					this.get_container_ul()[0].className = c;
-					this.set_state($.extend(true, {}, this._data.core.state), function () {
-						/**
-						 * triggered when a `refresh` call completes
-						 * @event
-						 * @name refresh.jstree
-						 */
-						this.trigger('refresh');
-					});
-				}
-				this._data.core.state = null;
-			});
-		},
-		/**
-		 * refreshes a node in the tree (reload its children) all opened nodes inside that node are reloaded with calls to `load_node`.
-		 * @name refresh_node(obj)
-		 * @param  {mixed} obj the node
-		 * @trigger refresh_node.jstree
-		 */
-		refresh_node : function (obj) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') { return false; }
-			var opened = [], to_load = [], s = this._data.core.selected.concat([]);
-			to_load.push(obj.id);
-			if(obj.state.opened === true) { opened.push(obj.id); }
-			this.get_node(obj, true).find('.jstree-open').each(function() { opened.push(this.id); });
-			this._load_nodes(to_load, $.proxy(function (nodes) {
-				this.open_node(opened, false, 0);
-				this.select_node(this._data.core.selected);
-				/**
-				 * triggered when a node is refreshed
-				 * @event
-				 * @name refresh_node.jstree
-				 * @param {Object} node - the refreshed node
-				 * @param {Array} nodes - an array of the IDs of the nodes that were reloaded
-				 */
-				this.trigger('refresh_node', { 'node' : obj, 'nodes' : nodes });
-			}, this));
-		},
-		/**
-		 * set (change) the ID of a node
-		 * @name set_id(obj, id)
-		 * @param  {mixed} obj the node
-		 * @param  {String} id the new ID
-		 * @return {Boolean}
-		 */
-		set_id : function (obj, id) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') { return false; }
-			var i, j, m = this._model.data;
-			id = id.toString();
-			// update parents (replace current ID with new one in children and children_d)
-			m[obj.parent].children[$.inArray(obj.id, m[obj.parent].children)] = id;
-			for(i = 0, j = obj.parents.length; i < j; i++) {
-				m[obj.parents[i]].children_d[$.inArray(obj.id, m[obj.parents[i]].children_d)] = id;
-			}
-			// update children (replace current ID with new one in parent and parents)
-			for(i = 0, j = obj.children.length; i < j; i++) {
-				m[obj.children[i]].parent = id;
-			}
-			for(i = 0, j = obj.children_d.length; i < j; i++) {
-				m[obj.children_d[i]].parents[$.inArray(obj.id, m[obj.children_d[i]].parents)] = id;
-			}
-			i = $.inArray(obj.id, this._data.core.selected);
-			if(i !== -1) { this._data.core.selected[i] = id; }
-			// update model and obj itself (obj.id, this._model.data[KEY])
-			i = this.get_node(obj.id, true);
-			if(i) {
-				i.attr('id', id);
-			}
-			delete m[obj.id];
-			obj.id = id;
-			m[id] = obj;
-			return true;
-		},
-		/**
-		 * get the text value of a node
-		 * @name get_text(obj)
-		 * @param  {mixed} obj the node
-		 * @return {String}
-		 */
-		get_text : function (obj) {
-			obj = this.get_node(obj);
-			return (!obj || obj.id === '#') ? false : obj.text;
-		},
-		/**
-		 * set the text value of a node. Used internally, please use `rename_node(obj, val)`.
-		 * @private
-		 * @name set_text(obj, val)
-		 * @param  {mixed} obj the node, you can pass an array to set the text on multiple nodes
-		 * @param  {String} val the new text value
-		 * @return {Boolean}
-		 * @trigger set_text.jstree
-		 */
-		set_text : function (obj, val) {
-			var t1, t2;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.set_text(obj[t1], val);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') { return false; }
-			obj.text = val;
-			if(this.get_node(obj, true).length) {
-				this.redraw_node(obj.id);
-			}
-			/**
-			 * triggered when a node text value is changed
-			 * @event
-			 * @name set_text.jstree
-			 * @param {Object} obj
-			 * @param {String} text the new value
-			 */
-			this.trigger('set_text',{ "obj" : obj, "text" : val });
-			return true;
-		},
-		/**
-		 * gets a JSON representation of a node (or the whole tree)
-		 * @name get_json([obj, options])
-		 * @param  {mixed} obj
-		 * @param  {Object} options
-		 * @param  {Boolean} options.no_state do not return state information
-		 * @param  {Boolean} options.no_id do not return ID
-		 * @param  {Boolean} options.no_children do not include children
-		 * @param  {Boolean} options.no_data do not include node data
-		 * @param  {Boolean} options.flat return flat JSON instead of nested
-		 * @return {Object}
-		 */
-		get_json : function (obj, options, flat) {
-			obj = this.get_node(obj || '#');
-			if(!obj) { return false; }
-			if(options && options.flat && !flat) { flat = []; }
-			var tmp = {
-				'id' : obj.id,
-				'text' : obj.text,
-				'icon' : this.get_icon(obj),
-				'li_attr' : obj.li_attr,
-				'a_attr' : obj.a_attr,
-				'state' : {},
-				'data' : options && options.no_data ? false : obj.data
-				//( this.get_node(obj, true).length ? this.get_node(obj, true).data() : obj.data ),
-			}, i, j;
-			if(options && options.flat) {
-				tmp.parent = obj.parent;
-			}
-			else {
-				tmp.children = [];
-			}
-			if(!options || !options.no_state) {
-				for(i in obj.state) {
-					if(obj.state.hasOwnProperty(i)) {
-						tmp.state[i] = obj.state[i];
-					}
-				}
-			}
-			if(options && options.no_id) {
-				delete tmp.id;
-				if(tmp.li_attr && tmp.li_attr.id) {
-					delete tmp.li_attr.id;
-				}
-			}
-			if(options && options.flat && obj.id !== '#') {
-				flat.push(tmp);
-			}
-			if(!options || !options.no_children) {
-				for(i = 0, j = obj.children.length; i < j; i++) {
-					if(options && options.flat) {
-						this.get_json(obj.children[i], options, flat);
-					}
-					else {
-						tmp.children.push(this.get_json(obj.children[i], options));
-					}
-				}
-			}
-			return options && options.flat ? flat : (obj.id === '#' ? tmp.children : tmp);
-		},
-		/**
-		 * create a new node (do not confuse with load_node)
-		 * @name create_node([obj, node, pos, callback, is_loaded])
-		 * @param  {mixed}   par       the parent node (to create a root node use either "#" (string) or `null`)
-		 * @param  {mixed}   node      the data for the new node (a valid JSON object, or a simple string with the name)
-		 * @param  {mixed}   pos       the index at which to insert the node, "first" and "last" are also supported, default is "last"
-		 * @param  {Function} callback a function to be called once the node is created
-		 * @param  {Boolean} is_loaded internal argument indicating if the parent node was succesfully loaded
-		 * @return {String}            the ID of the newly create node
-		 * @trigger model.jstree, create_node.jstree
-		 */
-		create_node : function (par, node, pos, callback, is_loaded) {
-			if(par === null) { par = "#"; }
-			par = this.get_node(par);
-			if(!par) { return false; }
-			pos = pos === undefined ? "last" : pos;
-			if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
-				return this.load_node(par, function () { this.create_node(par, node, pos, callback, true); });
-			}
-			if(!node) { node = { "text" : this.get_string('New node') }; }
-			if(node.text === undefined) { node.text = this.get_string('New node'); }
-			var tmp, dpc, i, j;
-
-			if(par.id === '#') {
-				if(pos === "before") { pos = "first"; }
-				if(pos === "after") { pos = "last"; }
-			}
-			switch(pos) {
-				case "before":
-					tmp = this.get_node(par.parent);
-					pos = $.inArray(par.id, tmp.children);
-					par = tmp;
-					break;
-				case "after" :
-					tmp = this.get_node(par.parent);
-					pos = $.inArray(par.id, tmp.children) + 1;
-					par = tmp;
-					break;
-				case "inside":
-				case "first":
-					pos = 0;
-					break;
-				case "last":
-					pos = par.children.length;
-					break;
-				default:
-					if(!pos) { pos = 0; }
-					break;
-			}
-			if(pos > par.children.length) { pos = par.children.length; }
-			if(!node.id) { node.id = true; }
-			if(!this.check("create_node", node, par, pos)) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			if(node.id === true) { delete node.id; }
-			node = this._parse_model_from_json(node, par.id, par.parents.concat());
-			if(!node) { return false; }
-			tmp = this.get_node(node);
-			dpc = [];
-			dpc.push(node);
-			dpc = dpc.concat(tmp.children_d);
-			this.trigger('model', { "nodes" : dpc, "parent" : par.id });
-
-			par.children_d = par.children_d.concat(dpc);
-			for(i = 0, j = par.parents.length; i < j; i++) {
-				this._model.data[par.parents[i]].children_d = this._model.data[par.parents[i]].children_d.concat(dpc);
-			}
-			node = tmp;
-			tmp = [];
-			for(i = 0, j = par.children.length; i < j; i++) {
-				tmp[i >= pos ? i+1 : i] = par.children[i];
-			}
-			tmp[pos] = node.id;
-			par.children = tmp;
-
-			this.redraw_node(par, true);
-			if(callback) { callback.call(this, this.get_node(node)); }
-			/**
-			 * triggered when a node is created
-			 * @event
-			 * @name create_node.jstree
-			 * @param {Object} node
-			 * @param {String} parent the parent's ID
-			 * @param {Number} position the position of the new node among the parent's children
-			 */
-			this.trigger('create_node', { "node" : this.get_node(node), "parent" : par.id, "position" : pos });
-			return node.id;
-		},
-		/**
-		 * set the text value of a node
-		 * @name rename_node(obj, val)
-		 * @param  {mixed} obj the node, you can pass an array to rename multiple nodes to the same name
-		 * @param  {String} val the new text value
-		 * @return {Boolean}
-		 * @trigger rename_node.jstree
-		 */
-		rename_node : function (obj, val) {
-			var t1, t2, old;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.rename_node(obj[t1], val);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') { return false; }
-			old = obj.text;
-			if(!this.check("rename_node", obj, this.get_parent(obj), val)) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			this.set_text(obj, val); // .apply(this, Array.prototype.slice.call(arguments))
-			/**
-			 * triggered when a node is renamed
-			 * @event
-			 * @name rename_node.jstree
-			 * @param {Object} node
-			 * @param {String} text the new value
-			 * @param {String} old the old value
-			 */
-			this.trigger('rename_node', { "node" : obj, "text" : val, "old" : old });
-			return true;
-		},
-		/**
-		 * remove a node
-		 * @name delete_node(obj)
-		 * @param  {mixed} obj the node, you can pass an array to delete multiple nodes
-		 * @return {Boolean}
-		 * @trigger delete_node.jstree, changed.jstree
-		 */
-		delete_node : function (obj) {
-			var t1, t2, par, pos, tmp, i, j, k, l, c;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.delete_node(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') { return false; }
-			par = this.get_node(obj.parent);
-			pos = $.inArray(obj.id, par.children);
-			c = false;
-			if(!this.check("delete_node", obj, par, pos)) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			if(pos !== -1) {
-				par.children = $.vakata.array_remove(par.children, pos);
-			}
-			tmp = obj.children_d.concat([]);
-			tmp.push(obj.id);
-			for(k = 0, l = tmp.length; k < l; k++) {
-				for(i = 0, j = obj.parents.length; i < j; i++) {
-					pos = $.inArray(tmp[k], this._model.data[obj.parents[i]].children_d);
-					if(pos !== -1) {
-						this._model.data[obj.parents[i]].children_d = $.vakata.array_remove(this._model.data[obj.parents[i]].children_d, pos);
-					}
-				}
-				if(this._model.data[tmp[k]].state.selected) {
-					c = true;
-					pos = $.inArray(tmp[k], this._data.core.selected);
-					if(pos !== -1) {
-						this._data.core.selected = $.vakata.array_remove(this._data.core.selected, pos);
-					}
-				}
-			}
-			/**
-			 * triggered when a node is deleted
-			 * @event
-			 * @name delete_node.jstree
-			 * @param {Object} node
-			 * @param {String} parent the parent's ID
-			 */
-			this.trigger('delete_node', { "node" : obj, "parent" : par.id });
-			if(c) {
-				this.trigger('changed', { 'action' : 'delete_node', 'node' : obj, 'selected' : this._data.core.selected, 'parent' : par.id });
-			}
-			for(k = 0, l = tmp.length; k < l; k++) {
-				delete this._model.data[tmp[k]];
-			}
-			this.redraw_node(par, true);
-			return true;
-		},
-		/**
-		 * check if an operation is premitted on the tree. Used internally.
-		 * @private
-		 * @name check(chk, obj, par, pos)
-		 * @param  {String} chk the operation to check, can be "create_node", "rename_node", "delete_node", "copy_node" or "move_node"
-		 * @param  {mixed} obj the node
-		 * @param  {mixed} par the parent
-		 * @param  {mixed} pos the position to insert at, or if "rename_node" - the new name
-		 * @param  {mixed} more some various additional information, for example if a "move_node" operations is triggered by DND this will be the hovered node
-		 * @return {Boolean}
-		 */
-		check : function (chk, obj, par, pos, more) {
-			obj = obj && obj.id ? obj : this.get_node(obj);
-			par = par && par.id ? par : this.get_node(par);
-			var tmp = chk.match(/^move_node|copy_node|create_node$/i) ? par : obj,
-				chc = this.settings.core.check_callback;
-			if(chk === "move_node" || chk === "copy_node") {
-				if((!more || !more.is_multi) && (obj.id === par.id || $.inArray(obj.id, par.children) === pos || $.inArray(par.id, obj.children_d) !== -1)) {
-					this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_01', 'reason' : 'Moving parent inside child', 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-					return false;
-				}
-			}
-			if(tmp && tmp.data) { tmp = tmp.data; }
-			if(tmp && tmp.functions && (tmp.functions[chk] === false || tmp.functions[chk] === true)) {
-				if(tmp.functions[chk] === false) {
-					this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_02', 'reason' : 'Node data prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-				}
-				return tmp.functions[chk];
-			}
-			if(chc === false || ($.isFunction(chc) && chc.call(this, chk, obj, par, pos, more) === false) || (chc && chc[chk] === false)) {
-				this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_03', 'reason' : 'User config for core.check_callback prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-				return false;
-			}
-			return true;
-		},
-		/**
-		 * get the last error
-		 * @name last_error()
-		 * @return {Object}
-		 */
-		last_error : function () {
-			return this._data.core.last_error;
-		},
-		/**
-		 * move a node to a new parent
-		 * @name move_node(obj, par [, pos, callback, is_loaded])
-		 * @param  {mixed} obj the node to move, pass an array to move multiple nodes
-		 * @param  {mixed} par the new parent
-		 * @param  {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0`
-		 * @param  {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position
-		 * @param  {Boolean} internal parameter indicating if the parent node has been loaded
-		 * @trigger move_node.jstree
-		 */
-		move_node : function (obj, par, pos, callback, is_loaded) {
-			var t1, t2, old_par, old_pos, new_par, old_ins, is_multi, dpc, tmp, i, j, k, l, p;
-
-			par = this.get_node(par);
-			pos = pos === undefined ? 0 : pos;
-			if(!par) { return false; }
-			if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
-				return this.load_node(par, function () { this.move_node(obj, par, pos, callback, true); });
-			}
-
-			if($.isArray(obj)) {
-				obj = obj.reverse().slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.move_node(obj[t1], par, pos, callback, is_loaded);
-				}
-				return true;
-			}
-			obj = obj && obj.id ? obj : this.get_node(obj);
-
-			if(!obj || obj.id === '#') { return false; }
-
-			old_par = (obj.parent || '#').toString();
-			new_par = (!pos.toString().match(/^(before|after)$/) || par.id === '#') ? par : this.get_node(par.parent);
-			old_ins = obj.instance ? obj.instance : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id));
-			is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id);
-			old_pos = old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1;
-			if(is_multi) {
-				if(this.copy_node(obj, par, pos, callback, is_loaded)) {
-					if(old_ins) { old_ins.delete_node(obj); }
-					return true;
-				}
-				return false;
-			}
-			//var m = this._model.data;
-			if(new_par.id === '#') {
-				if(pos === "before") { pos = "first"; }
-				if(pos === "after") { pos = "last"; }
-			}
-			switch(pos) {
-				case "before":
-					pos = $.inArray(par.id, new_par.children);
-					break;
-				case "after" :
-					pos = $.inArray(par.id, new_par.children) + 1;
-					break;
-				case "inside":
-				case "first":
-					pos = 0;
-					break;
-				case "last":
-					pos = new_par.children.length;
-					break;
-				default:
-					if(!pos) { pos = 0; }
-					break;
-			}
-			if(pos > new_par.children.length) { pos = new_par.children.length; }
-			if(!this.check("move_node", obj, new_par, pos, { 'core' : true, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			if(obj.parent === new_par.id) {
-				dpc = new_par.children.concat();
-				tmp = $.inArray(obj.id, dpc);
-				if(tmp !== -1) {
-					dpc = $.vakata.array_remove(dpc, tmp);
-					if(pos > tmp) { pos--; }
-				}
-				tmp = [];
-				for(i = 0, j = dpc.length; i < j; i++) {
-					tmp[i >= pos ? i+1 : i] = dpc[i];
-				}
-				tmp[pos] = obj.id;
-				new_par.children = tmp;
-				this._node_changed(new_par.id);
-				this.redraw(new_par.id === '#');
-			}
-			else {
-				// clean old parent and up
-				tmp = obj.children_d.concat();
-				tmp.push(obj.id);
-				for(i = 0, j = obj.parents.length; i < j; i++) {
-					dpc = [];
-					p = old_ins._model.data[obj.parents[i]].children_d;
-					for(k = 0, l = p.length; k < l; k++) {
-						if($.inArray(p[k], tmp) === -1) {
-							dpc.push(p[k]);
-						}
-					}
-					old_ins._model.data[obj.parents[i]].children_d = dpc;
-				}
-				old_ins._model.data[old_par].children = $.vakata.array_remove_item(old_ins._model.data[old_par].children, obj.id);
-
-				// insert into new parent and up
-				for(i = 0, j = new_par.parents.length; i < j; i++) {
-					this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(tmp);
-				}
-				dpc = [];
-				for(i = 0, j = new_par.children.length; i < j; i++) {
-					dpc[i >= pos ? i+1 : i] = new_par.children[i];
-				}
-				dpc[pos] = obj.id;
-				new_par.children = dpc;
-				new_par.children_d.push(obj.id);
-				new_par.children_d = new_par.children_d.concat(obj.children_d);
-
-				// update object
-				obj.parent = new_par.id;
-				tmp = new_par.parents.concat();
-				tmp.unshift(new_par.id);
-				p = obj.parents.length;
-				obj.parents = tmp;
-
-				// update object children
-				tmp = tmp.concat();
-				for(i = 0, j = obj.children_d.length; i < j; i++) {
-					this._model.data[obj.children_d[i]].parents = this._model.data[obj.children_d[i]].parents.slice(0,p*-1);
-					Array.prototype.push.apply(this._model.data[obj.children_d[i]].parents, tmp);
-				}
-
-				this._node_changed(old_par);
-				this._node_changed(new_par.id);
-				this.redraw(old_par === '#' || new_par.id === '#');
-			}
-			if(callback) { callback.call(this, obj, new_par, pos); }
-			/**
-			 * triggered when a node is moved
-			 * @event
-			 * @name move_node.jstree
-			 * @param {Object} node
-			 * @param {String} parent the parent's ID
-			 * @param {Number} position the position of the node among the parent's children
-			 * @param {String} old_parent the old parent of the node
-			 * @param {Number} old_position the old position of the node
-			 * @param {Boolean} is_multi do the node and new parent belong to different instances
-			 * @param {jsTree} old_instance the instance the node came from
-			 * @param {jsTree} new_instance the instance of the new parent
-			 */
-			this.trigger('move_node', { "node" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_pos, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this });
-			return true;
-		},
-		/**
-		 * copy a node to a new parent
-		 * @name copy_node(obj, par [, pos, callback, is_loaded])
-		 * @param  {mixed} obj the node to copy, pass an array to copy multiple nodes
-		 * @param  {mixed} par the new parent
-		 * @param  {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0`
-		 * @param  {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position
-		 * @param  {Boolean} internal parameter indicating if the parent node has been loaded
-		 * @trigger model.jstree copy_node.jstree
-		 */
-		copy_node : function (obj, par, pos, callback, is_loaded) {
-			var t1, t2, dpc, tmp, i, j, node, old_par, new_par, old_ins, is_multi;
-
-			par = this.get_node(par);
-			pos = pos === undefined ? 0 : pos;
-			if(!par) { return false; }
-			if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
-				return this.load_node(par, function () { this.copy_node(obj, par, pos, callback, true); });
-			}
-
-			if($.isArray(obj)) {
-				obj = obj.reverse().slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.copy_node(obj[t1], par, pos, callback, is_loaded);
-				}
-				return true;
-			}
-			obj = obj && obj.id ? obj : this.get_node(obj);
-			if(!obj || obj.id === '#') { return false; }
-
-			old_par = (obj.parent || '#').toString();
-			new_par = (!pos.toString().match(/^(before|after)$/) || par.id === '#') ? par : this.get_node(par.parent);
-			old_ins = obj.instance ? obj.instance : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id));
-			is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id);
-			if(new_par.id === '#') {
-				if(pos === "before") { pos = "first"; }
-				if(pos === "after") { pos = "last"; }
-			}
-			switch(pos) {
-				case "before":
-					pos = $.inArray(par.id, new_par.children);
-					break;
-				case "after" :
-					pos = $.inArray(par.id, new_par.children) + 1;
-					break;
-				case "inside":
-				case "first":
-					pos = 0;
-					break;
-				case "last":
-					pos = new_par.children.length;
-					break;
-				default:
-					if(!pos) { pos = 0; }
-					break;
-			}
-			if(pos > new_par.children.length) { pos = new_par.children.length; }
-			if(!this.check("copy_node", obj, new_par, pos, { 'core' : true, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) {
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			node = old_ins ? old_ins.get_json(obj, { no_id : true, no_data : true, no_state : true }) : obj;
-			if(!node) { return false; }
-			if(node.id === true) { delete node.id; }
-			node = this._parse_model_from_json(node, new_par.id, new_par.parents.concat());
-			if(!node) { return false; }
-			tmp = this.get_node(node);
-			if(obj && obj.state && obj.state.loaded === false) { tmp.state.loaded = false; }
-			dpc = [];
-			dpc.push(node);
-			dpc = dpc.concat(tmp.children_d);
-			this.trigger('model', { "nodes" : dpc, "parent" : new_par.id });
-
-			// insert into new parent and up
-			for(i = 0, j = new_par.parents.length; i < j; i++) {
-				this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(dpc);
-			}
-			dpc = [];
-			for(i = 0, j = new_par.children.length; i < j; i++) {
-				dpc[i >= pos ? i+1 : i] = new_par.children[i];
-			}
-			dpc[pos] = tmp.id;
-			new_par.children = dpc;
-			new_par.children_d.push(tmp.id);
-			new_par.children_d = new_par.children_d.concat(tmp.children_d);
-
-			this._node_changed(new_par.id);
-			this.redraw(new_par.id === '#');
-			if(callback) { callback.call(this, tmp, new_par, pos); }
-			/**
-			 * triggered when a node is copied
-			 * @event
-			 * @name copy_node.jstree
-			 * @param {Object} node the copied node
-			 * @param {Object} original the original node
-			 * @param {String} parent the parent's ID
-			 * @param {Number} position the position of the node among the parent's children
-			 * @param {String} old_parent the old parent of the node
-			 * @param {Number} old_position the position of the original node
-			 * @param {Boolean} is_multi do the node and new parent belong to different instances
-			 * @param {jsTree} old_instance the instance the node came from
-			 * @param {jsTree} new_instance the instance of the new parent
-			 */
-			this.trigger('copy_node', { "node" : tmp, "original" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1,'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this });
-			return tmp.id;
-		},
-		/**
-		 * cut a node (a later call to `paste(obj)` would move the node)
-		 * @name cut(obj)
-		 * @param  {mixed} obj multiple objects can be passed using an array
-		 * @trigger cut.jstree
-		 */
-		cut : function (obj) {
-			if(!obj) { obj = this._data.core.selected.concat(); }
-			if(!$.isArray(obj)) { obj = [obj]; }
-			if(!obj.length) { return false; }
-			var tmp = [], o, t1, t2;
-			for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-				o = this.get_node(obj[t1]);
-				if(o && o.id && o.id !== '#') { tmp.push(o); }
-			}
-			if(!tmp.length) { return false; }
-			ccp_node = tmp;
-			ccp_inst = this;
-			ccp_mode = 'move_node';
-			/**
-			 * triggered when nodes are added to the buffer for moving
-			 * @event
-			 * @name cut.jstree
-			 * @param {Array} node
-			 */
-			this.trigger('cut', { "node" : obj });
-		},
-		/**
-		 * copy a node (a later call to `paste(obj)` would copy the node)
-		 * @name copy(obj)
-		 * @param  {mixed} obj multiple objects can be passed using an array
-		 * @trigger copy.jstre
-		 */
-		copy : function (obj) {
-			if(!obj) { obj = this._data.core.selected.concat(); }
-			if(!$.isArray(obj)) { obj = [obj]; }
-			if(!obj.length) { return false; }
-			var tmp = [], o, t1, t2;
-			for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-				o = this.get_node(obj[t1]);
-				if(o && o.id && o.id !== '#') { tmp.push(o); }
-			}
-			if(!tmp.length) { return false; }
-			ccp_node = tmp;
-			ccp_inst = this;
-			ccp_mode = 'copy_node';
-			/**
-			 * triggered when nodes are added to the buffer for copying
-			 * @event
-			 * @name copy.jstree
-			 * @param {Array} node
-			 */
-			this.trigger('copy', { "node" : obj });
-		},
-		/**
-		 * get the current buffer (any nodes that are waiting for a paste operation)
-		 * @name get_buffer()
-		 * @return {Object} an object consisting of `mode` ("copy_node" or "move_node"), `node` (an array of objects) and `inst` (the instance)
-		 */
-		get_buffer : function () {
-			return { 'mode' : ccp_mode, 'node' : ccp_node, 'inst' : ccp_inst };
-		},
-		/**
-		 * check if there is something in the buffer to paste
-		 * @name can_paste()
-		 * @return {Boolean}
-		 */
-		can_paste : function () {
-			return ccp_mode !== false && ccp_node !== false; // && ccp_inst._model.data[ccp_node];
-		},
-		/**
-		 * copy or move the previously cut or copied nodes to a new parent
-		 * @name paste(obj [, pos])
-		 * @param  {mixed} obj the new parent
-		 * @param  {mixed} pos the position to insert at (besides integer, "first" and "last" are supported), defaults to integer `0`
-		 * @trigger paste.jstree
-		 */
-		paste : function (obj, pos) {
-			obj = this.get_node(obj);
-			if(!obj || !ccp_mode || !ccp_mode.match(/^(copy_node|move_node)$/) || !ccp_node) { return false; }
-			if(this[ccp_mode](ccp_node, obj, pos)) {
-				/**
-				 * triggered when paste is invoked
-				 * @event
-				 * @name paste.jstree
-				 * @param {String} parent the ID of the receiving node
-				 * @param {Array} node the nodes in the buffer
-				 * @param {String} mode the performed operation - "copy_node" or "move_node"
-				 */
-				this.trigger('paste', { "parent" : obj.id, "node" : ccp_node, "mode" : ccp_mode });
-			}
-			ccp_node = false;
-			ccp_mode = false;
-			ccp_inst = false;
-		},
-		/**
-		 * put a node in edit mode (input field to rename the node)
-		 * @name edit(obj [, default_text])
-		 * @param  {mixed} obj
-		 * @param  {String} default_text the text to populate the input with (if omitted the node text value is used)
-		 */
-		edit : function (obj, default_text) {
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			if(this.settings.core.check_callback === false) {
-				this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_07', 'reason' : 'Could not edit node because of check_callback' };
-				this.settings.core.error.call(this, this._data.core.last_error);
-				return false;
-			}
-			default_text = typeof default_text === 'string' ? default_text : obj.text;
-			this.set_text(obj, "");
-			obj = this._open_to(obj);
-
-			var rtl = this._data.core.rtl,
-				w  = this.element.width(),
-				a  = obj.children('.jstree-anchor'),
-				s  = $('<span>'),
-				/*!
-				oi = obj.children("i:visible"),
-				ai = a.children("i:visible"),
-				w1 = oi.width() * oi.length,
-				w2 = ai.width() * ai.length,
-				*/
-				t  = default_text,
-				h1 = $("<"+"div />", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo("body"),
-				h2 = $("<"+"input />", {
-						"value" : t,
-						"class" : "jstree-rename-input",
-						// "size" : t.length,
-						"css" : {
-							"padding" : "0",
-							"border" : "1px solid silver",
-							"box-sizing" : "border-box",
-							"display" : "inline-block",
-							"height" : (this._data.core.li_height) + "px",
-							"lineHeight" : (this._data.core.li_height) + "px",
-							"width" : "150px" // will be set a bit further down
-						},
-						"blur" : $.proxy(function () {
-							var i = s.children(".jstree-rename-input"),
-								v = i.val();
-							if(v === "") { v = t; }
-							h1.remove();
-							s.replaceWith(a);
-							s.remove();
-							this.set_text(obj, t);
-							if(this.rename_node(obj, $('<div></div>').text(v)[this.settings.core.force_text ? 'text' : 'html']()) === false) {
-								this.set_text(obj, t); // move this up? and fix #483
-							}
-						}, this),
-						"keydown" : function (event) {
-							var key = event.which;
-							if(key === 27) {
-								this.value = t;
-							}
-							if(key === 27 || key === 13 || key === 37 || key === 38 || key === 39 || key === 40 || key === 32) {
-								event.stopImmediatePropagation();
-							}
-							if(key === 27 || key === 13) {
-								event.preventDefault();
-								this.blur();
-							}
-						},
-						"click" : function (e) { e.stopImmediatePropagation(); },
-						"mousedown" : function (e) { e.stopImmediatePropagation(); },
-						"keyup" : function (event) {
-							h2.width(Math.min(h1.text("pW" + this.value).width(),w));
-						},
-						"keypress" : function(event) {
-							if(event.which === 13) { return false; }
-						}
-					}),
-				fn = {
-						fontFamily		: a.css('fontFamily')		|| '',
-						fontSize		: a.css('fontSize')			|| '',
-						fontWeight		: a.css('fontWeight')		|| '',
-						fontStyle		: a.css('fontStyle')		|| '',
-						fontStretch		: a.css('fontStretch')		|| '',
-						fontVariant		: a.css('fontVariant')		|| '',
-						letterSpacing	: a.css('letterSpacing')	|| '',
-						wordSpacing		: a.css('wordSpacing')		|| ''
-				};
-			s.attr('class', a.attr('class')).append(a.contents().clone()).append(h2);
-			a.replaceWith(s);
-			h1.css(fn);
-			h2.css(fn).width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select();
-		},
-
-
-		/**
-		 * changes the theme
-		 * @name set_theme(theme_name [, theme_url])
-		 * @param {String} theme_name the name of the new theme to apply
-		 * @param {mixed} theme_url  the location of the CSS file for this theme. Omit or set to `false` if you manually included the file. Set to `true` to autoload from the `core.themes.dir` directory.
-		 * @trigger set_theme.jstree
-		 */
-		set_theme : function (theme_name, theme_url) {
-			if(!theme_name) { return false; }
-			if(theme_url === true) {
-				var dir = this.settings.core.themes.dir;
-				if(!dir) { dir = $.jstree.path + '/themes'; }
-				theme_url = dir + '/' + theme_name + '/style.css';
-			}
-			if(theme_url && $.inArray(theme_url, themes_loaded) === -1) {
-				$('head').append('<'+'link rel="stylesheet" href="' + theme_url + '" type="text/css" />');
-				themes_loaded.push(theme_url);
-			}
-			if(this._data.core.themes.name) {
-				this.element.removeClass('jstree-' + this._data.core.themes.name);
-			}
-			this._data.core.themes.name = theme_name;
-			this.element.addClass('jstree-' + theme_name);
-			this.element[this.settings.core.themes.responsive ? 'addClass' : 'removeClass' ]('jstree-' + theme_name + '-responsive');
-			/**
-			 * triggered when a theme is set
-			 * @event
-			 * @name set_theme.jstree
-			 * @param {String} theme the new theme
-			 */
-			this.trigger('set_theme', { 'theme' : theme_name });
-		},
-		/**
-		 * gets the name of the currently applied theme name
-		 * @name get_theme()
-		 * @return {String}
-		 */
-		get_theme : function () { return this._data.core.themes.name; },
-		/**
-		 * changes the theme variant (if the theme has variants)
-		 * @name set_theme_variant(variant_name)
-		 * @param {String|Boolean} variant_name the variant to apply (if `false` is used the current variant is removed)
-		 */
-		set_theme_variant : function (variant_name) {
-			if(this._data.core.themes.variant) {
-				this.element.removeClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant);
-			}
-			this._data.core.themes.variant = variant_name;
-			if(variant_name) {
-				this.element.addClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant);
-			}
-		},
-		/**
-		 * gets the name of the currently applied theme variant
-		 * @name get_theme()
-		 * @return {String}
-		 */
-		get_theme_variant : function () { return this._data.core.themes.variant; },
-		/**
-		 * shows a striped background on the container (if the theme supports it)
-		 * @name show_stripes()
-		 */
-		show_stripes : function () { this._data.core.themes.stripes = true; this.get_container_ul().addClass("jstree-striped"); },
-		/**
-		 * hides the striped background on the container
-		 * @name hide_stripes()
-		 */
-		hide_stripes : function () { this._data.core.themes.stripes = false; this.get_container_ul().removeClass("jstree-striped"); },
-		/**
-		 * toggles the striped background on the container
-		 * @name toggle_stripes()
-		 */
-		toggle_stripes : function () { if(this._data.core.themes.stripes) { this.hide_stripes(); } else { this.show_stripes(); } },
-		/**
-		 * shows the connecting dots (if the theme supports it)
-		 * @name show_dots()
-		 */
-		show_dots : function () { this._data.core.themes.dots = true; this.get_container_ul().removeClass("jstree-no-dots"); },
-		/**
-		 * hides the connecting dots
-		 * @name hide_dots()
-		 */
-		hide_dots : function () { this._data.core.themes.dots = false; this.get_container_ul().addClass("jstree-no-dots"); },
-		/**
-		 * toggles the connecting dots
-		 * @name toggle_dots()
-		 */
-		toggle_dots : function () { if(this._data.core.themes.dots) { this.hide_dots(); } else { this.show_dots(); } },
-		/**
-		 * show the node icons
-		 * @name show_icons()
-		 */
-		show_icons : function () { this._data.core.themes.icons = true; this.get_container_ul().removeClass("jstree-no-icons"); },
-		/**
-		 * hide the node icons
-		 * @name hide_icons()
-		 */
-		hide_icons : function () { this._data.core.themes.icons = false; this.get_container_ul().addClass("jstree-no-icons"); },
-		/**
-		 * toggle the node icons
-		 * @name toggle_icons()
-		 */
-		toggle_icons : function () { if(this._data.core.themes.icons) { this.hide_icons(); } else { this.show_icons(); } },
-		/**
-		 * set the node icon for a node
-		 * @name set_icon(obj, icon)
-		 * @param {mixed} obj
-		 * @param {String} icon the new icon - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class
-		 */
-		set_icon : function (obj, icon) {
-			var t1, t2, dom, old;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.set_icon(obj[t1], icon);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') { return false; }
-			old = obj.icon;
-			obj.icon = icon;
-			dom = this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon");
-			if(icon === false) {
-				this.hide_icon(obj);
-			}
-			else if(icon === true) {
-				dom.removeClass('jstree-themeicon-custom ' + old).css("background","").removeAttr("rel");
-			}
-			else if(icon.indexOf("/") === -1 && icon.indexOf(".") === -1) {
-				dom.removeClass(old).css("background","");
-				dom.addClass(icon + ' jstree-themeicon-custom').attr("rel",icon);
-			}
-			else {
-				dom.removeClass(old).css("background","");
-				dom.addClass('jstree-themeicon-custom').css("background", "url('" + icon + "') center center no-repeat").attr("rel",icon);
-			}
-			return true;
-		},
-		/**
-		 * get the node icon for a node
-		 * @name get_icon(obj)
-		 * @param {mixed} obj
-		 * @return {String}
-		 */
-		get_icon : function (obj) {
-			obj = this.get_node(obj);
-			return (!obj || obj.id === '#') ? false : obj.icon;
-		},
-		/**
-		 * hide the icon on an individual node
-		 * @name hide_icon(obj)
-		 * @param {mixed} obj
-		 */
-		hide_icon : function (obj) {
-			var t1, t2;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.hide_icon(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj === '#') { return false; }
-			obj.icon = false;
-			this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon").addClass('jstree-themeicon-hidden');
-			return true;
-		},
-		/**
-		 * show the icon on an individual node
-		 * @name show_icon(obj)
-		 * @param {mixed} obj
-		 */
-		show_icon : function (obj) {
-			var t1, t2, dom;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.show_icon(obj[t1]);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj === '#') { return false; }
-			dom = this.get_node(obj, true);
-			obj.icon = dom.length ? dom.children(".jstree-anchor").children(".jstree-themeicon").attr('rel') : true;
-			if(!obj.icon) { obj.icon = true; }
-			dom.children(".jstree-anchor").children(".jstree-themeicon").removeClass('jstree-themeicon-hidden');
-			return true;
-		}
-	};
-
-	// helpers
-	$.vakata = {};
-	// collect attributes
-	$.vakata.attributes = function(node, with_values) {
-		node = $(node)[0];
-		var attr = with_values ? {} : [];
-		if(node && node.attributes) {
-			$.each(node.attributes, function (i, v) {
-				if($.inArray(v.nodeName.toLowerCase(),['style','contenteditable','hasfocus','tabindex']) !== -1) { return; }
-				if(v.nodeValue !== null && $.trim(v.nodeValue) !== '') {
-					if(with_values) { attr[v.nodeName] = v.nodeValue; }
-					else { attr.push(v.nodeName); }
-				}
-			});
-		}
-		return attr;
-	};
-	$.vakata.array_unique = function(array) {
-		var a = [], i, j, l;
-		for(i = 0, l = array.length; i < l; i++) {
-			for(j = 0; j <= i; j++) {
-				if(array[i] === array[j]) {
-					break;
-				}
-			}
-			if(j === i) { a.push(array[i]); }
-		}
-		return a;
-	};
-	// remove item from array
-	$.vakata.array_remove = function(array, from, to) {
-		var rest = array.slice((to || from) + 1 || array.length);
-		array.length = from < 0 ? array.length + from : from;
-		array.push.apply(array, rest);
-		return array;
-	};
-	// remove item from array
-	$.vakata.array_remove_item = function(array, item) {
-		var tmp = $.inArray(item, array);
-		return tmp !== -1 ? $.vakata.array_remove(array, tmp) : array;
-	};
-
-/**
- * ### Checkbox plugin
- *
- * This plugin renders checkbox icons in front of each node, making multiple selection much easier. 
- * It also supports tri-state behavior, meaning that if a node has a few of its children checked it will be rendered as undetermined, and state will be propagated up.
- */
-
-	var _i = document.createElement('I');
-	_i.className = 'jstree-icon jstree-checkbox';
-	/**
-	 * stores all defaults for the checkbox plugin
-	 * @name $.jstree.defaults.checkbox
-	 * @plugin checkbox
-	 */
-	$.jstree.defaults.checkbox = {
-		/**
-		 * a boolean indicating if checkboxes should be visible (can be changed at a later time using `show_checkboxes()` and `hide_checkboxes`). Defaults to `true`.
-		 * @name $.jstree.defaults.checkbox.visible
-		 * @plugin checkbox
-		 */
-		visible				: true,
-		/**
-		 * a boolean indicating if checkboxes should cascade down and have an undetermined state. Defaults to `true`.
-		 * @name $.jstree.defaults.checkbox.three_state
-		 * @plugin checkbox
-		 */
-		three_state			: true,
-		/**
-		 * a boolean indicating if clicking anywhere on the node should act as clicking on the checkbox. Defaults to `true`.
-		 * @name $.jstree.defaults.checkbox.whole_node
-		 * @plugin checkbox
-		 */
-		whole_node			: true,
-		/**
-		 * a boolean indicating if the selected style of a node should be kept, or removed. Defaults to `true`.
-		 * @name $.jstree.defaults.checkbox.keep_selected_style
-		 * @plugin checkbox
-		 */
-		keep_selected_style	: true,
-		/**
-		 * This setting controls how cascading and undetermined nodes are applied. 
-		 * If 'up' is in the string - cascading up is enabled, if 'down' is in the string - cascading down is enabled, if 'undetermined' is in the string - undetermined nodes will be used. 
-		 * If `three_state` is set to `true` this setting is automatically set to 'up+down+undetermined'. Defaults to ''.
-		 * @name $.jstree.defaults.checkbox.cascade
-		 * @plugin checkbox
-		 */
-		cascade				: '',
-		/**
-		 * This setting controls if checkbox are bound to the general tree selection or to an internal array maintained by the checkbox plugin. Defaults to `true`, only set to `false` if you know exactly what you are doing. 
-		 * @name $.jstree.defaults.checkbox.tie_selection
-		 * @plugin checkbox
-		 */
-		tie_selection		: true
-	};
-	$.jstree.plugins.checkbox = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-			this._data.checkbox.uto = false;
-			this._data.checkbox.selected = [];
-			if(this.settings.checkbox.three_state) {
-				this.settings.checkbox.cascade = 'up+down+undetermined';
-			}
-			this.element
-				.on("init.jstree", $.proxy(function () {
-						this._data.checkbox.visible = this.settings.checkbox.visible;
-						if(!this.settings.checkbox.keep_selected_style) {
-							this.element.addClass('jstree-checkbox-no-clicked');
-						}
-						if(this.settings.checkbox.tie_selection) {
-							this.element.addClass('jstree-checkbox-selection');
-						}
-					}, this))
-				.on("loading.jstree", $.proxy(function () {
-						this[ this._data.checkbox.visible ? 'show_checkboxes' : 'hide_checkboxes' ]();
-					}, this));
-			if(this.settings.checkbox.cascade.indexOf('undetermined') !== -1) {
-				this.element
-					.on('changed.jstree uncheck_node.jstree check_node.jstree uncheck_all.jstree check_all.jstree move_node.jstree copy_node.jstree redraw.jstree open_node.jstree', $.proxy(function () {
-							// only if undetermined is in setting
-							if(this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); }
-							this._data.checkbox.uto = setTimeout($.proxy(this._undetermined, this), 50);
-						}, this));
-			}
-			if(!this.settings.checkbox.tie_selection) {
-				this.element
-					.on('model.jstree', $.proxy(function (e, data) {
-						var m = this._model.data,
-							p = m[data.parent],
-							dpc = data.nodes,
-							i, j;
-						for(i = 0, j = dpc.length; i < j; i++) {
-							m[dpc[i]].state.checked = (m[dpc[i]].original && m[dpc[i]].original.state && m[dpc[i]].original.state.checked);
-							if(m[dpc[i]].state.checked) {
-								this._data.checkbox.selected.push(dpc[i]);
-							}
-						}
-					}, this));
-			}
-			if(this.settings.checkbox.cascade.indexOf('up') !== -1 || this.settings.checkbox.cascade.indexOf('down') !== -1) {
-				this.element
-					.on('model.jstree', $.proxy(function (e, data) {
-							var m = this._model.data,
-								p = m[data.parent],
-								dpc = data.nodes,
-								chd = [],
-								c, i, j, k, l, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection;
-
-							if(s.indexOf('down') !== -1) {
-								// apply down
-								if(p.state[ t ? 'selected' : 'checked' ]) {
-									for(i = 0, j = dpc.length; i < j; i++) {
-										m[dpc[i]].state[ t ? 'selected' : 'checked' ] = true;
-									}
-									this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(dpc);
-								}
-								else {
-									for(i = 0, j = dpc.length; i < j; i++) {
-										if(m[dpc[i]].state[ t ? 'selected' : 'checked' ]) {
-											for(k = 0, l = m[dpc[i]].children_d.length; k < l; k++) {
-												m[m[dpc[i]].children_d[k]].state[ t ? 'selected' : 'checked' ] = true;
-											}
-											this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(m[dpc[i]].children_d);
-										}
-									}
-								}
-							}
-
-							if(s.indexOf('up') !== -1) {
-								// apply up
-								for(i = 0, j = p.children_d.length; i < j; i++) {
-									if(!m[p.children_d[i]].children.length) {
-										chd.push(m[p.children_d[i]].parent);
-									}
-								}
-								chd = $.vakata.array_unique(chd);
-								for(k = 0, l = chd.length; k < l; k++) {
-									p = m[chd[k]];
-									while(p && p.id !== '#') {
-										c = 0;
-										for(i = 0, j = p.children.length; i < j; i++) {
-											c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
-										}
-										if(c === j) {
-											p.state[ t ? 'selected' : 'checked' ] = true;
-											this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
-											tmp = this.get_node(p, true);
-											if(tmp && tmp.length) {
-												tmp.children('.jstree-anchor').addClass( t ? 'jstree-clicked' : 'jstree-checked');
-											}
-										}
-										else {
-											break;
-										}
-										p = this.get_node(p.parent);
-									}
-								}
-							}
-
-							this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected);
-						}, this))
-					.on(this.settings.checkbox.tie_selection ? 'select_node.jstree' : 'check_node.jstree', $.proxy(function (e, data) {
-							var obj = data.node,
-								m = this._model.data,
-								par = this.get_node(obj.parent),
-								dom = this.get_node(obj, true),
-								i, j, c, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection;
-
-							// apply down
-							if(s.indexOf('down') !== -1) {
-								this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected.concat(obj.children_d));
-								for(i = 0, j = obj.children_d.length; i < j; i++) {
-									tmp = m[obj.children_d[i]];
-									tmp.state[ t ? 'selected' : 'checked' ] = true;
-									if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
-										tmp.original.state.undetermined = false;
-									}
-								}
-							}
-
-							// apply up
-							if(s.indexOf('up') !== -1) {
-								while(par && par.id !== '#') {
-									c = 0;
-									for(i = 0, j = par.children.length; i < j; i++) {
-										c += m[par.children[i]].state[ t ? 'selected' : 'checked' ];
-									}
-									if(c === j) {
-										par.state[ t ? 'selected' : 'checked' ] = true;
-										this._data[ t ? 'core' : 'checkbox' ].selected.push(par.id);
-										tmp = this.get_node(par, true);
-										if(tmp && tmp.length) {
-											tmp.children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');
-										}
-									}
-									else {
-										break;
-									}
-									par = this.get_node(par.parent);
-								}
-							}
-
-							// apply down (process .children separately?)
-							if(s.indexOf('down') !== -1 && dom.length) {
-								dom.find('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');
-							}
-						}, this))
-					.on(this.settings.checkbox.tie_selection ? 'deselect_all.jstree' : 'uncheck_all.jstree', $.proxy(function (e, data) {
-							var obj = this.get_node('#'),
-								m = this._model.data,
-								i, j, tmp;
-							for(i = 0, j = obj.children_d.length; i < j; i++) {
-								tmp = m[obj.children_d[i]];
-								if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
-									tmp.original.state.undetermined = false;
-								}
-							}
-						}, this))
-					.on(this.settings.checkbox.tie_selection ? 'deselect_node.jstree' : 'uncheck_node.jstree', $.proxy(function (e, data) {
-							var obj = data.node,
-								dom = this.get_node(obj, true),
-								i, j, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection;
-							if(obj && obj.original && obj.original.state && obj.original.state.undetermined) {
-								obj.original.state.undetermined = false;
-							}
-
-							// apply down
-							if(s.indexOf('down') !== -1) {
-								for(i = 0, j = obj.children_d.length; i < j; i++) {
-									tmp = this._model.data[obj.children_d[i]];
-									tmp.state[ t ? 'selected' : 'checked' ] = false;
-									if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
-										tmp.original.state.undetermined = false;
-									}
-								}
-							}
-
-							// apply up
-							if(s.indexOf('up') !== -1) {
-								for(i = 0, j = obj.parents.length; i < j; i++) {
-									tmp = this._model.data[obj.parents[i]];
-									tmp.state[ t ? 'selected' : 'checked' ] = false;
-									if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
-										tmp.original.state.undetermined = false;
-									}
-									tmp = this.get_node(obj.parents[i], true);
-									if(tmp && tmp.length) {
-										tmp.children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked');
-									}
-								}
-							}
-							tmp = [];
-							for(i = 0, j = this._data[ t ? 'core' : 'checkbox' ].selected.length; i < j; i++) {
-								// apply down + apply up
-								if(
-									(s.indexOf('down') === -1 || $.inArray(this._data[ t ? 'core' : 'checkbox' ].selected[i], obj.children_d) === -1) &&
-									(s.indexOf('up') === -1 || $.inArray(this._data[ t ? 'core' : 'checkbox' ].selected[i], obj.parents) === -1)
-								) {
-									tmp.push(this._data[ t ? 'core' : 'checkbox' ].selected[i]);
-								}
-							}
-							this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(tmp);
-
-							// apply down (process .children separately?)
-							if(s.indexOf('down') !== -1 && dom.length) {
-								dom.find('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked');
-							}
-						}, this));
-			}
-			if(this.settings.checkbox.cascade.indexOf('up') !== -1) {
-				this.element
-					.on('delete_node.jstree', $.proxy(function (e, data) {
-							// apply up (whole handler)
-							var p = this.get_node(data.parent),
-								m = this._model.data,
-								i, j, c, tmp, t = this.settings.checkbox.tie_selection;
-							while(p && p.id !== '#') {
-								c = 0;
-								for(i = 0, j = p.children.length; i < j; i++) {
-									c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
-								}
-								if(c === j) {
-									p.state[ t ? 'selected' : 'checked' ] = true;
-									this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
-									tmp = this.get_node(p, true);
-									if(tmp && tmp.length) {
-										tmp.children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');
-									}
-								}
-								else {
-									break;
-								}
-								p = this.get_node(p.parent);
-							}
-						}, this))
-					.on('move_node.jstree', $.proxy(function (e, data) {
-							// apply up (whole handler)
-							var is_multi = data.is_multi,
-								old_par = data.old_parent,
-								new_par = this.get_node(data.parent),
-								m = this._model.data,
-								p, c, i, j, tmp, t = this.settings.checkbox.tie_selection;
-							if(!is_multi) {
-								p = this.get_node(old_par);
-								while(p && p.id !== '#') {
-									c = 0;
-									for(i = 0, j = p.children.length; i < j; i++) {
-										c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
-									}
-									if(c === j) {
-										p.state[ t ? 'selected' : 'checked' ] = true;
-										this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
-										tmp = this.get_node(p, true);
-										if(tmp && tmp.length) {
-											tmp.children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');
-										}
-									}
-									else {
-										break;
-									}
-									p = this.get_node(p.parent);
-								}
-							}
-							p = new_par;
-							while(p && p.id !== '#') {
-								c = 0;
-								for(i = 0, j = p.children.length; i < j; i++) {
-									c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
-								}
-								if(c === j) {
-									if(!p.state[ t ? 'selected' : 'checked' ]) {
-										p.state[ t ? 'selected' : 'checked' ] = true;
-										this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id);
-										tmp = this.get_node(p, true);
-										if(tmp && tmp.length) {
-											tmp.children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');
-										}
-									}
-								}
-								else {
-									if(p.state[ t ? 'selected' : 'checked' ]) {
-										p.state[ t ? 'selected' : 'checked' ] = false;
-										this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_remove_item(this._data[ t ? 'core' : 'checkbox' ].selected, p.id);
-										tmp = this.get_node(p, true);
-										if(tmp && tmp.length) {
-											tmp.children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked');
-										}
-									}
-									else {
-										break;
-									}
-								}
-								p = this.get_node(p.parent);
-							}
-						}, this));
-			}
-		};
-		/**
-		 * set the undetermined state where and if necessary. Used internally.
-		 * @private
-		 * @name _undetermined()
-		 * @plugin checkbox
-		 */
-		this._undetermined = function () {
-			var i, j, m = this._model.data, t = this.settings.checkbox.tie_selection, s = this._data[ t ? 'core' : 'checkbox' ].selected, p = [], tt = this;
-			for(i = 0, j = s.length; i < j; i++) {
-				if(m[s[i]] && m[s[i]].parents) {
-					p = p.concat(m[s[i]].parents);
-				}
-			}
-			// attempt for server side undetermined state
-			this.element.find('.jstree-closed').not(':has(.jstree-children)')
-				.each(function () {
-					var tmp = tt.get_node(this), tmp2;
-					if(!tmp.state.loaded) {
-						if(tmp.original && tmp.original.state && tmp.original.state.undetermined && tmp.original.state.undetermined === true) {
-							p.push(tmp.id);
-							p = p.concat(tmp.parents);
-						}
-					}
-					else {
-						for(i = 0, j = tmp.children_d.length; i < j; i++) {
-							tmp2 = m[tmp.children_d[i]];
-							if(!tmp2.state.loaded && tmp2.original && tmp2.original.state && tmp2.original.state.undetermined && tmp2.original.state.undetermined === true) {
-								p.push(tmp2.id);
-								p = p.concat(tmp2.parents);
-							}
-						}
-					}
-				});
-			p = $.vakata.array_unique(p);
-			p = $.vakata.array_remove_item(p,'#');
-
-			this.element.find('.jstree-undetermined').removeClass('jstree-undetermined');
-			for(i = 0, j = p.length; i < j; i++) {
-				if(!m[p[i]].state[ t ? 'selected' : 'checked' ]) {
-					s = this.get_node(p[i], true);
-					if(s && s.length) {
-						s.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-undetermined');
-					}
-				}
-			}
-		};
-		this.redraw_node = function(obj, deep, is_callback) {
-			obj = parent.redraw_node.call(this, obj, deep, is_callback);
-			if(obj) {
-				var i, j, tmp = null;
-				for(i = 0, j = obj.childNodes.length; i < j; i++) {
-					if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
-						tmp = obj.childNodes[i];
-						break;
-					}
-				}
-				if(tmp) {
-					if(!this.settings.checkbox.tie_selection && this._model.data[obj.id].state.checked) { tmp.className += ' jstree-checked'; }
-					tmp.insertBefore(_i.cloneNode(false), tmp.childNodes[0]);
-				}
-			}
-			if(!is_callback && this.settings.checkbox.cascade.indexOf('undetermined') !== -1) {
-				if(this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); }
-				this._data.checkbox.uto = setTimeout($.proxy(this._undetermined, this), 50);
-			}
-			return obj;
-		};
-		/**
-		 * show the node checkbox icons
-		 * @name show_checkboxes()
-		 * @plugin checkbox
-		 */
-		this.show_checkboxes = function () { this._data.core.themes.checkboxes = true; this.get_container_ul().removeClass("jstree-no-checkboxes"); };
-		/**
-		 * hide the node checkbox icons
-		 * @name hide_checkboxes()
-		 * @plugin checkbox
-		 */
-		this.hide_checkboxes = function () { this._data.core.themes.checkboxes = false; this.get_container_ul().addClass("jstree-no-checkboxes"); };
-		/**
-		 * toggle the node icons
-		 * @name toggle_checkboxes()
-		 * @plugin checkbox
-		 */
-		this.toggle_checkboxes = function () { if(this._data.core.themes.checkboxes) { this.hide_checkboxes(); } else { this.show_checkboxes(); } };
-		/**
-		 * checks if a node is in an undetermined state
-		 * @name is_undetermined(obj)
-		 * @param  {mixed} obj
-		 * @return {Boolean}
-		 */
-		this.is_undetermined = function (obj) {
-			obj = this.get_node(obj);
-			var s = this.settings.checkbox.cascade, i, j, t = this.settings.checkbox.tie_selection, d = this._data[ t ? 'core' : 'checkbox' ].selected, m = this._model.data;
-			if(!obj || obj.state[ t ? 'selected' : 'checked' ] === true || s.indexOf('undetermined') === -1 || (s.indexOf('down') === -1 && s.indexOf('up') === -1)) {
-				return false;
-			}
-			if(!obj.state.loaded && obj.original.state.undetermined === true) {
-				return true;
-			}
-			for(i = 0, j = obj.children_d.length; i < j; i++) {
-				if($.inArray(obj.children_d[i], d) !== -1 || (!m[obj.children_d[i]].state.loaded && m[obj.children_d[i]].original.state.undetermined)) {
-					return true;
-				}
-			}
-			return false;
-		};
-
-		this.activate_node = function (obj, e) {
-			if(this.settings.checkbox.tie_selection && (this.settings.checkbox.whole_node || $(e.target).hasClass('jstree-checkbox'))) {
-				e.ctrlKey = true;
-			}
-			if(this.settings.checkbox.tie_selection || (!this.settings.checkbox.whole_node && !$(e.target).hasClass('jstree-checkbox'))) {
-				return parent.activate_node.call(this, obj, e);
-			}
-			if(this.is_checked(obj)) {
-				this.uncheck_node(obj, e);
-			}
-			else {
-				this.check_node(obj, e);
-			}
-			this.trigger('activate_node', { 'node' : this.get_node(obj) });
-		};
-
-		/**
-		 * check a node (only if tie_selection in checkbox settings is false, otherwise select_node will be called internally)
-		 * @name check_node(obj)
-		 * @param {mixed} obj an array can be used to check multiple nodes
-		 * @trigger check_node.jstree
-		 * @plugin checkbox
-		 */
-		this.check_node = function (obj, e) {
-			if(this.settings.checkbox.tie_selection) { return this.select_node(obj, false, true, e); }
-			var dom, t1, t2, th;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.check_node(obj[t1], e);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(!obj.state.checked) {
-				obj.state.checked = true;
-				this._data.checkbox.selected.push(obj.id);
-				if(dom && dom.length) {
-					dom.children('.jstree-anchor').addClass('jstree-checked');
-				}
-				/**
-				 * triggered when an node is checked (only if tie_selection in checkbox settings is false)
-				 * @event
-				 * @name check_node.jstree
-				 * @param {Object} node
-				 * @param {Array} selected the current selection
-				 * @param {Object} event the event (if any) that triggered this check_node
-				 * @plugin checkbox
-				 */
-				this.trigger('check_node', { 'node' : obj, 'selected' : this._data.checkbox.selected, 'event' : e });
-			}
-		};
-		/**
-		 * uncheck a node (only if tie_selection in checkbox settings is false, otherwise deselect_node will be called internally)
-		 * @name deselect_node(obj)
-		 * @param {mixed} obj an array can be used to deselect multiple nodes
-		 * @trigger uncheck_node.jstree
-		 * @plugin checkbox
-		 */
-		this.uncheck_node = function (obj, e) {
-			if(this.settings.checkbox.tie_selection) { return this.deselect_node(obj, false, e); }
-			var t1, t2, dom;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.uncheck_node(obj[t1], e);
-				}
-				return true;
-			}
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') {
-				return false;
-			}
-			dom = this.get_node(obj, true);
-			if(obj.state.checked) {
-				obj.state.checked = false;
-				this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, obj.id);
-				if(dom.length) {
-					dom.children('.jstree-anchor').removeClass('jstree-checked');
-				}
-				/**
-				 * triggered when an node is unchecked (only if tie_selection in checkbox settings is false)
-				 * @event
-				 * @name uncheck_node.jstree
-				 * @param {Object} node
-				 * @param {Array} selected the current selection
-				 * @param {Object} event the event (if any) that triggered this uncheck_node
-				 * @plugin checkbox
-				 */
-				this.trigger('uncheck_node', { 'node' : obj, 'selected' : this._data.checkbox.selected, 'event' : e });
-			}
-		};
-		/**
-		 * checks all nodes in the tree (only if tie_selection in checkbox settings is false, otherwise select_all will be called internally)
-		 * @name check_all()
-		 * @trigger check_all.jstree, changed.jstree
-		 * @plugin checkbox
-		 */
-		this.check_all = function () {
-			if(this.settings.checkbox.tie_selection) { return this.select_all(); }
-			var tmp = this._data.checkbox.selected.concat([]), i, j;
-			this._data.checkbox.selected = this._model.data['#'].children_d.concat();
-			for(i = 0, j = this._data.checkbox.selected.length; i < j; i++) {
-				if(this._model.data[this._data.checkbox.selected[i]]) {
-					this._model.data[this._data.checkbox.selected[i]].state.checked = true;
-				}
-			}
-			this.redraw(true);
-			/**
-			 * triggered when all nodes are checked (only if tie_selection in checkbox settings is false)
-			 * @event
-			 * @name check_all.jstree
-			 * @param {Array} selected the current selection
-			 * @plugin checkbox
-			 */
-			this.trigger('check_all', { 'selected' : this._data.checkbox.selected });
-		};
-		/**
-		 * uncheck all checked nodes (only if tie_selection in checkbox settings is false, otherwise deselect_all will be called internally)
-		 * @name uncheck_all()
-		 * @trigger uncheck_all.jstree
-		 * @plugin checkbox
-		 */
-		this.uncheck_all = function () {
-			if(this.settings.checkbox.tie_selection) { return this.deselect_all(); }
-			var tmp = this._data.checkbox.selected.concat([]), i, j;
-			for(i = 0, j = this._data.checkbox.selected.length; i < j; i++) {
-				if(this._model.data[this._data.checkbox.selected[i]]) {
-					this._model.data[this._data.checkbox.selected[i]].state.checked = false;
-				}
-			}
-			this._data.checkbox.selected = [];
-			this.element.find('.jstree-checked').removeClass('jstree-checked');
-			/**
-			 * triggered when all nodes are unchecked (only if tie_selection in checkbox settings is false)
-			 * @event
-			 * @name uncheck_all.jstree
-			 * @param {Object} node the previous selection
-			 * @param {Array} selected the current selection
-			 * @plugin checkbox
-			 */
-			this.trigger('uncheck_all', { 'selected' : this._data.checkbox.selected, 'node' : tmp });
-		};
-		/**
-		 * checks if a node is checked (if tie_selection is on in the settings this function will return the same as is_selected)
-		 * @name is_checked(obj)
-		 * @param  {mixed}  obj
-		 * @return {Boolean}
-		 * @plugin checkbox
-		 */
-		this.is_checked = function (obj) {
-			if(this.settings.checkbox.tie_selection) { return this.is_selected(obj); }
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') { return false; }
-			return obj.state.checked;
-		};
-		/**
-		 * get an array of all checked nodes (if tie_selection is on in the settings this function will return the same as get_selected)
-		 * @name get_checked([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 * @plugin checkbox
-		 */
-		this.get_checked = function (full) {
-			if(this.settings.checkbox.tie_selection) { return this.get_selected(full); }
-			return full ? $.map(this._data.checkbox.selected, $.proxy(function (i) { return this.get_node(i); }, this)) : this._data.checkbox.selected;
-		};
-		/**
-		 * get an array of all top level checked nodes (ignoring children of checked nodes) (if tie_selection is on in the settings this function will return the same as get_top_selected)
-		 * @name get_top_checked([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 * @plugin checkbox
-		 */
-		this.get_top_checked = function (full) {
-			if(this.settings.checkbox.tie_selection) { return this.get_top_selected(full); }
-			var tmp = this.get_checked(true),
-				obj = {}, i, j, k, l;
-			for(i = 0, j = tmp.length; i < j; i++) {
-				obj[tmp[i].id] = tmp[i];
-			}
-			for(i = 0, j = tmp.length; i < j; i++) {
-				for(k = 0, l = tmp[i].children_d.length; k < l; k++) {
-					if(obj[tmp[i].children_d[k]]) {
-						delete obj[tmp[i].children_d[k]];
-					}
-				}
-			}
-			tmp = [];
-			for(i in obj) {
-				if(obj.hasOwnProperty(i)) {
-					tmp.push(i);
-				}
-			}
-			return full ? $.map(tmp, $.proxy(function (i) { return this.get_node(i); }, this)) : tmp;
-		};
-		/**
-		 * get an array of all bottom level checked nodes (ignoring selected parents) (if tie_selection is on in the settings this function will return the same as get_bottom_selected)
-		 * @name get_bottom_checked([full])
-		 * @param  {mixed}  full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned
-		 * @return {Array}
-		 * @plugin checkbox
-		 */
-		this.get_bottom_checked = function (full) {
-			if(this.settings.checkbox.tie_selection) { return this.get_bottom_selected(full); }
-			var tmp = this.get_checked(true),
-				obj = [], i, j;
-			for(i = 0, j = tmp.length; i < j; i++) {
-				if(!tmp[i].children.length) {
-					obj.push(tmp[i].id);
-				}
-			}
-			return full ? $.map(obj, $.proxy(function (i) { return this.get_node(i); }, this)) : obj;
-		};
-	};
-
-	// include the checkbox plugin by default
-	// $.jstree.defaults.plugins.push("checkbox");
-
-/**
- * ### Contextmenu plugin
- *
- * Shows a context menu when a node is right-clicked.
- */
-// TODO: move logic outside of function + check multiple move
-
-	/**
-	 * stores all defaults for the contextmenu plugin
-	 * @name $.jstree.defaults.contextmenu
-	 * @plugin contextmenu
-	 */
-	$.jstree.defaults.contextmenu = {
-		/**
-		 * a boolean indicating if the node should be selected when the context menu is invoked on it. Defaults to `true`.
-		 * @name $.jstree.defaults.contextmenu.select_node
-		 * @plugin contextmenu
-		 */
-		select_node : true,
-		/**
-		 * a boolean indicating if the menu should be shown aligned with the node. Defaults to `true`, otherwise the mouse coordinates are used.
-		 * @name $.jstree.defaults.contextmenu.show_at_node
-		 * @plugin contextmenu
-		 */
-		show_at_node : true,
-		/**
-		 * an object of actions, or a function that accepts a node and a callback function and calls the callback function with an object of actions available for that node (you can also return the items too).
-		 * 
-		 * Each action consists of a key (a unique name) and a value which is an object with the following properties (only label and action are required):
-		 * 
-		 * * `separator_before` - a boolean indicating if there should be a separator before this item
-		 * * `separator_after` - a boolean indicating if there should be a separator after this item
-		 * * `_disabled` - a boolean indicating if this action should be disabled
-		 * * `label` - a string - the name of the action (could be a function returning a string)
-		 * * `action` - a function to be executed if this item is chosen
-		 * * `icon` - a string, can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class
-		 * * `shortcut` - keyCode which will trigger the action if the menu is open (for example `113` for rename, which equals F2)
-		 * * `shortcut_label` - shortcut label (like for example `F2` for rename)
-		 * 
-		 * @name $.jstree.defaults.contextmenu.items
-		 * @plugin contextmenu
-		 */
-		items : function (o, cb) { // Could be an object directly
-			return {
-				"create" : {
-					"separator_before"	: false,
-					"separator_after"	: true,
-					"_disabled"			: false, //(this.check("create_node", data.reference, {}, "last")),
-					"label"				: "Create",
-					"action"			: function (data) {
-						var inst = $.jstree.reference(data.reference),
-							obj = inst.get_node(data.reference);
-						inst.create_node(obj, {}, "last", function (new_node) {
-							setTimeout(function () { inst.edit(new_node); },0);
-						});
-					}
-				},
-				"rename" : {
-					"separator_before"	: false,
-					"separator_after"	: false,
-					"_disabled"			: false, //(this.check("rename_node", data.reference, this.get_parent(data.reference), "")),
-					"label"				: "Rename",
-					/*
-					"shortcut"			: 113,
-					"shortcut_label"	: 'F2',
-					"icon"				: "glyphicon glyphicon-leaf",
-					*/
-					"action"			: function (data) {
-						var inst = $.jstree.reference(data.reference),
-							obj = inst.get_node(data.reference);
-						inst.edit(obj);
-					}
-				},
-				"remove" : {
-					"separator_before"	: false,
-					"icon"				: false,
-					"separator_after"	: false,
-					"_disabled"			: false, //(this.check("delete_node", data.reference, this.get_parent(data.reference), "")),
-					"label"				: "Delete",
-					"action"			: function (data) {
-						var inst = $.jstree.reference(data.reference),
-							obj = inst.get_node(data.reference);
-						if(inst.is_selected(obj)) {
-							inst.delete_node(inst.get_selected());
-						}
-						else {
-							inst.delete_node(obj);
-						}
-					}
-				},
-				"ccp" : {
-					"separator_before"	: true,
-					"icon"				: false,
-					"separator_after"	: false,
-					"label"				: "Edit",
-					"action"			: false,
-					"submenu" : {
-						"cut" : {
-							"separator_before"	: false,
-							"separator_after"	: false,
-							"label"				: "Cut",
-							"action"			: function (data) {
-								var inst = $.jstree.reference(data.reference),
-									obj = inst.get_node(data.reference);
-								if(inst.is_selected(obj)) {
-									inst.cut(inst.get_selected());
-								}
-								else {
-									inst.cut(obj);
-								}
-							}
-						},
-						"copy" : {
-							"separator_before"	: false,
-							"icon"				: false,
-							"separator_after"	: false,
-							"label"				: "Copy",
-							"action"			: function (data) {
-								var inst = $.jstree.reference(data.reference),
-									obj = inst.get_node(data.reference);
-								if(inst.is_selected(obj)) {
-									inst.copy(inst.get_selected());
-								}
-								else {
-									inst.copy(obj);
-								}
-							}
-						},
-						"paste" : {
-							"separator_before"	: false,
-							"icon"				: false,
-							"_disabled"			: function (data) {
-								return !$.jstree.reference(data.reference).can_paste();
-							},
-							"separator_after"	: false,
-							"label"				: "Paste",
-							"action"			: function (data) {
-								var inst = $.jstree.reference(data.reference),
-									obj = inst.get_node(data.reference);
-								inst.paste(obj);
-							}
-						}
-					}
-				}
-			};
-		}
-	};
-
-	$.jstree.plugins.contextmenu = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-
-			var last_ts = 0;
-			this.element
-				.on("contextmenu.jstree", ".jstree-anchor", $.proxy(function (e) {
-						e.preventDefault();
-						last_ts = e.ctrlKey ? e.timeStamp : 0;
-						if(!this.is_loading(e.currentTarget)) {
-							this.show_contextmenu(e.currentTarget, e.pageX, e.pageY, e);
-						}
-					}, this))
-				.on("click.jstree", ".jstree-anchor", $.proxy(function (e) {
-						if(this._data.contextmenu.visible && (!last_ts || e.timeStamp - last_ts > 250)) { // work around safari & macOS ctrl+click
-							$.vakata.context.hide();
-						}
-					}, this));
-			/*
-			if(!('oncontextmenu' in document.body) && ('ontouchstart' in document.body)) {
-				var el = null, tm = null;
-				this.element
-					.on("touchstart", ".jstree-anchor", function (e) {
-						el = e.currentTarget;
-						tm = +new Date();
-						$(document).one("touchend", function (e) {
-							e.target = document.elementFromPoint(e.originalEvent.targetTouches[0].pageX - window.pageXOffset, e.originalEvent.targetTouches[0].pageY - window.pageYOffset);
-							e.currentTarget = e.target;
-							tm = ((+(new Date())) - tm);
-							if(e.target === el && tm > 600 && tm < 1000) {
-								e.preventDefault();
-								$(el).trigger('contextmenu', e);
-							}
-							el = null;
-							tm = null;
-						});
-					});
-			}
-			*/
-			$(document).on("context_hide.vakata", $.proxy(function () { this._data.contextmenu.visible = false; }, this));
-		};
-		this.teardown = function () {
-			if(this._data.contextmenu.visible) {
-				$.vakata.context.hide();
-			}
-			parent.teardown.call(this);
-		};
-
-		/**
-		 * prepare and show the context menu for a node
-		 * @name show_contextmenu(obj [, x, y])
-		 * @param {mixed} obj the node
-		 * @param {Number} x the x-coordinate relative to the document to show the menu at
-		 * @param {Number} y the y-coordinate relative to the document to show the menu at
-		 * @param {Object} e the event if available that triggered the contextmenu
-		 * @plugin contextmenu
-		 * @trigger show_contextmenu.jstree
-		 */
-		this.show_contextmenu = function (obj, x, y, e) {
-			obj = this.get_node(obj);
-			if(!obj || obj.id === '#') { return false; }
-			var s = this.settings.contextmenu,
-				d = this.get_node(obj, true),
-				a = d.children(".jstree-anchor"),
-				o = false,
-				i = false;
-			if(s.show_at_node || x === undefined || y === undefined) {
-				o = a.offset();
-				x = o.left;
-				y = o.top + this._data.core.li_height;
-			}
-			if(this.settings.contextmenu.select_node && !this.is_selected(obj)) {
-				this.activate_node(obj, e);
-			}
-
-			i = s.items;
-			if($.isFunction(i)) {
-				i = i.call(this, obj, $.proxy(function (i) {
-					this._show_contextmenu(obj, x, y, i);
-				}, this));
-			}
-			if($.isPlainObject(i)) {
-				this._show_contextmenu(obj, x, y, i);
-			}
-		};
-		/**
-		 * show the prepared context menu for a node
-		 * @name _show_contextmenu(obj, x, y, i)
-		 * @param {mixed} obj the node
-		 * @param {Number} x the x-coordinate relative to the document to show the menu at
-		 * @param {Number} y the y-coordinate relative to the document to show the menu at
-		 * @param {Number} i the object of items to show
-		 * @plugin contextmenu
-		 * @trigger show_contextmenu.jstree
-		 * @private
-		 */
-		this._show_contextmenu = function (obj, x, y, i) {
-			var d = this.get_node(obj, true),
-				a = d.children(".jstree-anchor");
-			$(document).one("context_show.vakata", $.proxy(function (e, data) {
-				var cls = 'jstree-contextmenu jstree-' + this.get_theme() + '-contextmenu';
-				$(data.element).addClass(cls);
-			}, this));
-			this._data.contextmenu.visible = true;
-			$.vakata.context.show(a, { 'x' : x, 'y' : y }, i);
-			/**
-			 * triggered when the contextmenu is shown for a node
-			 * @event
-			 * @name show_contextmenu.jstree
-			 * @param {Object} node the node
-			 * @param {Number} x the x-coordinate of the menu relative to the document
-			 * @param {Number} y the y-coordinate of the menu relative to the document
-			 * @plugin contextmenu
-			 */
-			this.trigger('show_contextmenu', { "node" : obj, "x" : x, "y" : y });
-		};
-	};
-
-	// contextmenu helper
-	(function ($) {
-		var right_to_left = false,
-			vakata_context = {
-				element		: false,
-				reference	: false,
-				position_x	: 0,
-				position_y	: 0,
-				items		: [],
-				html		: "",
-				is_visible	: false
-			};
-
-		$.vakata.context = {
-			settings : {
-				hide_onmouseleave	: 0,
-				icons				: true
-			},
-			_trigger : function (event_name) {
-				$(document).triggerHandler("context_" + event_name + ".vakata", {
-					"reference"	: vakata_context.reference,
-					"element"	: vakata_context.element,
-					"position"	: {
-						"x" : vakata_context.position_x,
-						"y" : vakata_context.position_y
-					}
-				});
-			},
-			_execute : function (i) {
-				i = vakata_context.items[i];
-				return i && (!i._disabled || ($.isFunction(i._disabled) && !i._disabled({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }))) && i.action ? i.action.call(null, {
-							"item"		: i,
-							"reference"	: vakata_context.reference,
-							"element"	: vakata_context.element,
-							"position"	: {
-								"x" : vakata_context.position_x,
-								"y" : vakata_context.position_y
-							}
-						}) : false;
-			},
-			_parse : function (o, is_callback) {
-				if(!o) { return false; }
-				if(!is_callback) {
-					vakata_context.html		= "";
-					vakata_context.items	= [];
-				}
-				var str = "",
-					sep = false,
-					tmp;
-
-				if(is_callback) { str += "<"+"ul>"; }
-				$.each(o, function (i, val) {
-					if(!val) { return true; }
-					vakata_context.items.push(val);
-					if(!sep && val.separator_before) {
-						str += "<"+"li class='vakata-context-separator'><"+"a href='#' " + ($.vakata.context.settings.icons ? '' : 'style="margin-left:0px;"') + ">&#160;<"+"/a><"+"/li>";
-					}
-					sep = false;
-					str += "<"+"li class='" + (val._class || "") + (val._disabled === true || ($.isFunction(val._disabled) && val._disabled({ "item" : val, "reference" : vakata_context.reference, "element" : vakata_context.element })) ? " vakata-contextmenu-disabled " : "") + "' "+(val.shortcut?" data-shortcut='"+val.shortcut+"' ":'')+">";
-					str += "<"+"a href='#' rel='" + (vakata_context.items.length - 1) + "'>";
-					if($.vakata.context.settings.icons) {
-						str += "<"+"i ";
-						if(val.icon) {
-							if(val.icon.indexOf("/") !== -1 || val.icon.indexOf(".") !== -1) { str += " style='background:url(\"" + val.icon + "\") center center no-repeat' "; }
-							else { str += " class='" + val.icon + "' "; }
-						}
-						str += "><"+"/i><"+"span class='vakata-contextmenu-sep'>&#160;<"+"/span>";
-					}
-					str += ($.isFunction(val.label) ? val.label({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }) : val.label) + (val.shortcut?' <span class="vakata-contextmenu-shortcut vakata-contextmenu-shortcut-'+val.shortcut+'">'+ (val.shortcut_label || '') +'</span>':'') + "<"+"/a>";
-					if(val.submenu) {
-						tmp = $.vakata.context._parse(val.submenu, true);
-						if(tmp) { str += tmp; }
-					}
-					str += "<"+"/li>";
-					if(val.separator_after) {
-						str += "<"+"li class='vakata-context-separator'><"+"a href='#' " + ($.vakata.context.settings.icons ? '' : 'style="margin-left:0px;"') + ">&#160;<"+"/a><"+"/li>";
-						sep = true;
-					}
-				});
-				str  = str.replace(/<li class\='vakata-context-separator'\><\/li\>$/,"");
-				if(is_callback) { str += "</ul>"; }
-				/**
-				 * triggered on the document when the contextmenu is parsed (HTML is built)
-				 * @event
-				 * @plugin contextmenu
-				 * @name context_parse.vakata
-				 * @param {jQuery} reference the element that was right clicked
-				 * @param {jQuery} element the DOM element of the menu itself
-				 * @param {Object} position the x & y coordinates of the menu
-				 */
-				if(!is_callback) { vakata_context.html = str; $.vakata.context._trigger("parse"); }
-				return str.length > 10 ? str : false;
-			},
-			_show_submenu : function (o) {
-				o = $(o);
-				if(!o.length || !o.children("ul").length) { return; }
-				var e = o.children("ul"),
-					x = o.offset().left + o.outerWidth(),
-					y = o.offset().top,
-					w = e.width(),
-					h = e.height(),
-					dw = $(window).width() + $(window).scrollLeft(),
-					dh = $(window).height() + $(window).scrollTop();
-				// може да се спести е една проверка - дали няма някой от класовете вече нагоре
-				if(right_to_left) {
-					o[x - (w + 10 + o.outerWidth()) < 0 ? "addClass" : "removeClass"]("vakata-context-left");
-				}
-				else {
-					o[x + w + 10 > dw ? "addClass" : "removeClass"]("vakata-context-right");
-				}
-				if(y + h + 10 > dh) {
-					e.css("bottom","-1px");
-				}
-				e.show();
-			},
-			show : function (reference, position, data) {
-				var o, e, x, y, w, h, dw, dh, cond = true;
-				if(vakata_context.element && vakata_context.element.length) {
-					vakata_context.element.width('');
-				}
-				switch(cond) {
-					case (!position && !reference):
-						return false;
-					case (!!position && !!reference):
-						vakata_context.reference	= reference;
-						vakata_context.position_x	= position.x;
-						vakata_context.position_y	= position.y;
-						break;
-					case (!position && !!reference):
-						vakata_context.reference	= reference;
-						o = reference.offset();
-						vakata_context.position_x	= o.left + reference.outerHeight();
-						vakata_context.position_y	= o.top;
-						break;
-					case (!!position && !reference):
-						vakata_context.position_x	= position.x;
-						vakata_context.position_y	= position.y;
-						break;
-				}
-				if(!!reference && !data && $(reference).data('vakata_contextmenu')) {
-					data = $(reference).data('vakata_contextmenu');
-				}
-				if($.vakata.context._parse(data)) {
-					vakata_context.element.html(vakata_context.html);
-				}
-				if(vakata_context.items.length) {
-					e = vakata_context.element;
-					x = vakata_context.position_x;
-					y = vakata_context.position_y;
-					w = e.width();
-					h = e.height();
-					dw = $(window).width() + $(window).scrollLeft();
-					dh = $(window).height() + $(window).scrollTop();
-					if(right_to_left) {
-						x -= e.outerWidth();
-						if(x < $(window).scrollLeft() + 20) {
-							x = $(window).scrollLeft() + 20;
-						}
-					}
-					if(x + w + 20 > dw) {
-						x = dw - (w + 20);
-					}
-					if(y + h + 20 > dh) {
-						y = dh - (h + 20);
-					}
-
-					vakata_context.element
-						.css({ "left" : x, "top" : y })
-						.show()
-						.find('a:eq(0)').focus().parent().addClass("vakata-context-hover");
-					vakata_context.is_visible = true;
-					/**
-					 * triggered on the document when the contextmenu is shown
-					 * @event
-					 * @plugin contextmenu
-					 * @name context_show.vakata
-					 * @param {jQuery} reference the element that was right clicked
-					 * @param {jQuery} element the DOM element of the menu itself
-					 * @param {Object} position the x & y coordinates of the menu
-					 */
-					$.vakata.context._trigger("show");
-				}
-			},
-			hide : function () {
-				if(vakata_context.is_visible) {
-					vakata_context.element.hide().find("ul").hide().end().find(':focus').blur();
-					vakata_context.is_visible = false;
-					/**
-					 * triggered on the document when the contextmenu is hidden
-					 * @event
-					 * @plugin contextmenu
-					 * @name context_hide.vakata
-					 * @param {jQuery} reference the element that was right clicked
-					 * @param {jQuery} element the DOM element of the menu itself
-					 * @param {Object} position the x & y coordinates of the menu
-					 */
-					$.vakata.context._trigger("hide");
-				}
-			}
-		};
-		$(function () {
-			right_to_left = $("body").css("direction") === "rtl";
-			var to = false;
-
-			vakata_context.element = $("<ul class='vakata-context'></ul>");
-			vakata_context.element
-				.on("mouseenter", "li", function (e) {
-					e.stopImmediatePropagation();
-
-					if($.contains(this, e.relatedTarget)) {
-						// премахнато заради delegate mouseleave по-долу
-						// $(this).find(".vakata-context-hover").removeClass("vakata-context-hover");
-						return;
-					}
-
-					if(to) { clearTimeout(to); }
-					vakata_context.element.find(".vakata-context-hover").removeClass("vakata-context-hover").end();
-
-					$(this)
-						.siblings().find("ul").hide().end().end()
-						.parentsUntil(".vakata-context", "li").addBack().addClass("vakata-context-hover");
-					$.vakata.context._show_submenu(this);
-				})
-				// тестово - дали не натоварва?
-				.on("mouseleave", "li", function (e) {
-					if($.contains(this, e.relatedTarget)) { return; }
-					$(this).find(".vakata-context-hover").addBack().removeClass("vakata-context-hover");
-				})
-				.on("mouseleave", function (e) {
-					$(this).find(".vakata-context-hover").removeClass("vakata-context-hover");
-					if($.vakata.context.settings.hide_onmouseleave) {
-						to = setTimeout(
-							(function (t) {
-								return function () { $.vakata.context.hide(); };
-							}(this)), $.vakata.context.settings.hide_onmouseleave);
-					}
-				})
-				.on("click", "a", function (e) {
-					e.preventDefault();
-				//})
-				//.on("mouseup", "a", function (e) {
-					if(!$(this).blur().parent().hasClass("vakata-context-disabled") && $.vakata.context._execute($(this).attr("rel")) !== false) {
-						$.vakata.context.hide();
-					}
-				})
-				.on('keydown', 'a', function (e) {
-						var o = null;
-						switch(e.which) {
-							case 13:
-							case 32:
-								e.type = "mouseup";
-								e.preventDefault();
-								$(e.currentTarget).trigger(e);
-								break;
-							case 37:
-								if(vakata_context.is_visible) {
-									vakata_context.element.find(".vakata-context-hover").last().parents("li:eq(0)").find("ul").hide().find(".vakata-context-hover").removeClass("vakata-context-hover").end().end().children('a').focus();
-									e.stopImmediatePropagation();
-									e.preventDefault();
-								}
-								break;
-							case 38:
-								if(vakata_context.is_visible) {
-									o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").prevAll("li:not(.vakata-context-separator)").first();
-									if(!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").last(); }
-									o.addClass("vakata-context-hover").children('a').focus();
-									e.stopImmediatePropagation();
-									e.preventDefault();
-								}
-								break;
-							case 39:
-								if(vakata_context.is_visible) {
-									vakata_context.element.find(".vakata-context-hover").last().children("ul").show().children("li:not(.vakata-context-separator)").removeClass("vakata-context-hover").first().addClass("vakata-context-hover").children('a').focus();
-									e.stopImmediatePropagation();
-									e.preventDefault();
-								}
-								break;
-							case 40:
-								if(vakata_context.is_visible) {
-									o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").nextAll("li:not(.vakata-context-separator)").first();
-									if(!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").first(); }
-									o.addClass("vakata-context-hover").children('a').focus();
-									e.stopImmediatePropagation();
-									e.preventDefault();
-								}
-								break;
-							case 27:
-								$.vakata.context.hide();
-								e.preventDefault();
-								break;
-							default:
-								//console.log(e.which);
-								break;
-						}
-					})
-				.on('keydown', function (e) {
-					e.preventDefault();
-					var a = vakata_context.element.find('.vakata-contextmenu-shortcut-' + e.which).parent();
-					if(a.parent().not('.vakata-context-disabled')) {
-						a.mouseup();
-					}
-				})
-				.appendTo("body");
-
-			$(document)
-				.on("mousedown", function (e) {
-					if(vakata_context.is_visible && !$.contains(vakata_context.element[0], e.target)) { $.vakata.context.hide(); }
-				})
-				.on("context_show.vakata", function (e, data) {
-					vakata_context.element.find("li:has(ul)").children("a").addClass("vakata-context-parent");
-					if(right_to_left) {
-						vakata_context.element.addClass("vakata-context-rtl").css("direction", "rtl");
-					}
-					// also apply a RTL class?
-					vakata_context.element.find("ul").hide().end();
-				});
-		});
-	}($));
-	// $.jstree.defaults.plugins.push("contextmenu");
-
-/**
- * ### Drag'n'drop plugin
- *
- * Enables dragging and dropping of nodes in the tree, resulting in a move or copy operations.
- */
-
-	/**
-	 * stores all defaults for the drag'n'drop plugin
-	 * @name $.jstree.defaults.dnd
-	 * @plugin dnd
-	 */
-	$.jstree.defaults.dnd = {
-		/**
-		 * a boolean indicating if a copy should be possible while dragging (by pressint the meta key or Ctrl). Defaults to `true`.
-		 * @name $.jstree.defaults.dnd.copy
-		 * @plugin dnd
-		 */
-		copy : true,
-		/**
-		 * a number indicating how long a node should remain hovered while dragging to be opened. Defaults to `500`.
-		 * @name $.jstree.defaults.dnd.open_timeout
-		 * @plugin dnd
-		 */
-		open_timeout : 500,
-		/**
-		 * a function invoked each time a node is about to be dragged, invoked in the tree's scope and receives the nodes about to be dragged as an argument (array) - return `false` to prevent dragging
-		 * @name $.jstree.defaults.dnd.is_draggable
-		 * @plugin dnd
-		 */
-		is_draggable : true,
-		/**
-		 * a boolean indicating if checks should constantly be made while the user is dragging the node (as opposed to checking only on drop), default is `true`
-		 * @name $.jstree.defaults.dnd.check_while_dragging
-		 * @plugin dnd
-		 */
-		check_while_dragging : true,
-		/**
-		 * a boolean indicating if nodes from this tree should only be copied with dnd (as opposed to moved), default is `false`
-		 * @name $.jstree.defaults.dnd.always_copy
-		 * @plugin dnd
-		 */
-		always_copy : false,
-		/**
-		 * when dropping a node "inside", this setting indicates the position the node should go to - it can be an integer or a string: "first" (same as 0) or "last", default is `0`
-		 * @name $.jstree.defaults.dnd.inside_pos
-		 * @plugin dnd
-		 */
-		inside_pos : 0
-	};
-	// TODO: now check works by checking for each node individually, how about max_children, unique, etc?
-	// TODO: drop somewhere else - maybe demo only?
-	$.jstree.plugins.dnd = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-
-			this.element
-				.on('mousedown.jstree touchstart.jstree', '.jstree-anchor', $.proxy(function (e) {
-					var obj = this.get_node(e.target),
-						mlt = this.is_selected(obj) ? this.get_selected().length : 1;
-					if(obj && obj.id && obj.id !== "#" && (e.which === 1 || e.type === "touchstart") &&
-						(this.settings.dnd.is_draggable === true || ($.isFunction(this.settings.dnd.is_draggable) && this.settings.dnd.is_draggable.call(this, (mlt > 1 ? this.get_selected(true) : [obj]))))
-					) {
-						this.element.trigger('mousedown.jstree');
-						return $.vakata.dnd.start(e, { 'jstree' : true, 'origin' : this, 'obj' : this.get_node(obj,true), 'nodes' : mlt > 1 ? this.get_selected() : [obj.id] }, '<div id="jstree-dnd" class="jstree-' + this.get_theme() + ( this.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ) + '"><i class="jstree-icon jstree-er"></i>' + (mlt > 1 ? mlt + ' ' + this.get_string('nodes') : this.get_text(e.currentTarget, true)) + '<ins class="jstree-copy" style="display:none;">+</ins></div>');
-					}
-				}, this));
-		};
-	};
-
-	$(function() {
-		// bind only once for all instances
-		var lastmv = false,
-			laster = false,
-			opento = false,
-			marker = $('<div id="jstree-marker">&#160;</div>').hide().appendTo('body');
-
-		$(document)
-			.bind('dnd_start.vakata', function (e, data) {
-				lastmv = false;
-			})
-			.bind('dnd_move.vakata', function (e, data) {
-				if(opento) { clearTimeout(opento); }
-				if(!data || !data.data || !data.data.jstree) { return; }
-
-				// if we are hovering the marker image do nothing (can happen on "inside" drags)
-				if(data.event.target.id && data.event.target.id === 'jstree-marker') {
-					return;
-				}
-
-				var ins = $.jstree.reference(data.event.target),
-					ref = false,
-					off = false,
-					rel = false,
-					l, t, h, p, i, o, ok, t1, t2, op, ps, pr, ip, tm;
-				// if we are over an instance
-				if(ins && ins._data && ins._data.dnd) {
-					marker.attr('class', 'jstree-' + ins.get_theme() + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ));
-					data.helper
-						.children().attr('class', 'jstree-' + ins.get_theme() + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ))
-						.find('.jstree-copy:eq(0)')[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? 'show' : 'hide' ]();
-
-
-					// if are hovering the container itself add a new root node
-					if( (data.event.target === ins.element[0] || data.event.target === ins.get_container_ul()[0]) && ins.get_container_ul().children().length === 0) {
-						ok = true;
-						for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {
-							ok = ok && ins.check( (data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)) ) ? "copy_node" : "move_node"), (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), '#', 'last', { 'dnd' : true, 'ref' : ins.get_node('#'), 'pos' : 'i', 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) });
-							if(!ok) { break; }
-						}
-						if(ok) {
-							lastmv = { 'ins' : ins, 'par' : '#', 'pos' : 'last' };
-							marker.hide();
-							data.helper.find('.jstree-icon:eq(0)').removeClass('jstree-er').addClass('jstree-ok');
-							return;
-						}
-					}
-					else {
-						// if we are hovering a tree node
-						ref = $(data.event.target).closest('.jstree-anchor');
-						if(ref && ref.length && ref.parent().is('.jstree-closed, .jstree-open, .jstree-leaf')) {
-							off = ref.offset();
-							rel = data.event.pageY - off.top;
-							h = ref.height();
-							if(rel < h / 3) {
-								o = ['b', 'i', 'a'];
-							}
-							else if(rel > h - h / 3) {
-								o = ['a', 'i', 'b'];
-							}
-							else {
-								o = rel > h / 2 ? ['i', 'a', 'b'] : ['i', 'b', 'a'];
-							}
-							$.each(o, function (j, v) {
-								switch(v) {
-									case 'b':
-										l = off.left - 6;
-										t = off.top;
-										p = ins.get_parent(ref);
-										i = ref.parent().index();
-										break;
-									case 'i':
-										ip = ins.settings.dnd.inside_pos;
-										tm = ins.get_node(ref.parent());
-										l = off.left - 2;
-										t = off.top + h / 2 + 1;
-										p = tm.id;
-										i = ip === 'first' ? 0 : (ip === 'last' ? tm.children.length : Math.min(ip, tm.children.length));
-										break;
-									case 'a':
-										l = off.left - 6;
-										t = off.top + h;
-										p = ins.get_parent(ref);
-										i = ref.parent().index() + 1;
-										break;
-								}
-								/*!
-								// TODO: moving inside, but the node is not yet loaded?
-								// the check will work anyway, as when moving the node will be loaded first and checked again
-								if(v === 'i' && !ins.is_loaded(p)) { }
-								*/
-								ok = true;
-								for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {
-									op = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? "copy_node" : "move_node";
-									ps = i;
-									if(op === "move_node" && v === 'a' && (data.data.origin && data.data.origin === ins) && p === ins.get_parent(data.data.nodes[t1])) {
-										pr = ins.get_node(p);
-										if(ps > $.inArray(data.data.nodes[t1], pr.children)) {
-											ps -= 1;
-										}
-									}
-									ok = ok && ( (ins && ins.settings && ins.settings.dnd && ins.settings.dnd.check_while_dragging === false) || ins.check(op, (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), p, ps, { 'dnd' : true, 'ref' : ins.get_node(ref.parent()), 'pos' : v, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) }) );
-									if(!ok) {
-										if(ins && ins.last_error) { laster = ins.last_error(); }
-										break;
-									}
-								}
-								if(ok) {
-									if(v === 'i' && ref.parent().is('.jstree-closed') && ins.settings.dnd.open_timeout) {
-										opento = setTimeout((function (x, z) { return function () { x.open_node(z); }; }(ins, ref)), ins.settings.dnd.open_timeout);
-									}
-									lastmv = { 'ins' : ins, 'par' : p, 'pos' : v === 'i' && ip === 'last' && i === 0 && !ins.is_loaded(tm) ? 'last' : i };
-									marker.css({ 'left' : l + 'px', 'top' : t + 'px' }).show();
-									data.helper.find('.jstree-icon:eq(0)').removeClass('jstree-er').addClass('jstree-ok');
-									laster = {};
-									o = true;
-									return false;
-								}
-							});
-							if(o === true) { return; }
-						}
-					}
-				}
-				lastmv = false;
-				data.helper.find('.jstree-icon').removeClass('jstree-ok').addClass('jstree-er');
-				marker.hide();
-			})
-			.bind('dnd_scroll.vakata', function (e, data) {
-				if(!data || !data.data || !data.data.jstree) { return; }
-				marker.hide();
-				lastmv = false;
-				data.helper.find('.jstree-icon:eq(0)').removeClass('jstree-ok').addClass('jstree-er');
-			})
-			.bind('dnd_stop.vakata', function (e, data) {
-				if(opento) { clearTimeout(opento); }
-				if(!data || !data.data || !data.data.jstree) { return; }
-				marker.hide();
-				var i, j, nodes = [];
-				if(lastmv) {
-					for(i = 0, j = data.data.nodes.length; i < j; i++) {
-						nodes[i] = data.data.origin ? data.data.origin.get_node(data.data.nodes[i]) : data.data.nodes[i];
-						if(data.data.origin) {
-							nodes[i].instance = data.data.origin;
-						}
-					}
-					lastmv.ins[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? 'copy_node' : 'move_node' ](nodes, lastmv.par, lastmv.pos);
-				}
-				else {
-					i = $(data.event.target).closest('.jstree');
-					if(i.length && laster && laster.error && laster.error === 'check') {
-						i = i.jstree(true);
-						if(i) {
-							i.settings.core.error.call(this, laster);
-						}
-					}
-				}
-			})
-			.bind('keyup keydown', function (e, data) {
-				data = $.vakata.dnd._get();
-				if(data && data.data && data.data.jstree) {
-					data.helper.find('.jstree-copy:eq(0)')[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (e.metaKey || e.ctrlKey))) ? 'show' : 'hide' ]();
-				}
-			});
-	});
-
-	// helpers
-	(function ($) {
-		// private variable
-		var vakata_dnd = {
-			element	: false,
-			target	: false,
-			is_down	: false,
-			is_drag	: false,
-			helper	: false,
-			helper_w: 0,
-			data	: false,
-			init_x	: 0,
-			init_y	: 0,
-			scroll_l: 0,
-			scroll_t: 0,
-			scroll_e: false,
-			scroll_i: false,
-			is_touch: false
-		};
-		$.vakata.dnd = {
-			settings : {
-				scroll_speed		: 10,
-				scroll_proximity	: 20,
-				helper_left			: 5,
-				helper_top			: 10,
-				threshold			: 5,
-				threshold_touch		: 50
-			},
-			_trigger : function (event_name, e) {
-				var data = $.vakata.dnd._get();
-				data.event = e;
-				$(document).triggerHandler("dnd_" + event_name + ".vakata", data);
-			},
-			_get : function () {
-				return {
-					"data"		: vakata_dnd.data,
-					"element"	: vakata_dnd.element,
-					"helper"	: vakata_dnd.helper
-				};
-			},
-			_clean : function () {
-				if(vakata_dnd.helper) { vakata_dnd.helper.remove(); }
-				if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; }
-				vakata_dnd = {
-					element	: false,
-					target	: false,
-					is_down	: false,
-					is_drag	: false,
-					helper	: false,
-					helper_w: 0,
-					data	: false,
-					init_x	: 0,
-					init_y	: 0,
-					scroll_l: 0,
-					scroll_t: 0,
-					scroll_e: false,
-					scroll_i: false,
-					is_touch: false
-				};
-				$(document).off("mousemove touchmove", $.vakata.dnd.drag);
-				$(document).off("mouseup touchend", $.vakata.dnd.stop);
-			},
-			_scroll : function (init_only) {
-				if(!vakata_dnd.scroll_e || (!vakata_dnd.scroll_l && !vakata_dnd.scroll_t)) {
-					if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; }
-					return false;
-				}
-				if(!vakata_dnd.scroll_i) {
-					vakata_dnd.scroll_i = setInterval($.vakata.dnd._scroll, 100);
-					return false;
-				}
-				if(init_only === true) { return false; }
-
-				var i = vakata_dnd.scroll_e.scrollTop(),
-					j = vakata_dnd.scroll_e.scrollLeft();
-				vakata_dnd.scroll_e.scrollTop(i + vakata_dnd.scroll_t * $.vakata.dnd.settings.scroll_speed);
-				vakata_dnd.scroll_e.scrollLeft(j + vakata_dnd.scroll_l * $.vakata.dnd.settings.scroll_speed);
-				if(i !== vakata_dnd.scroll_e.scrollTop() || j !== vakata_dnd.scroll_e.scrollLeft()) {
-					/**
-					 * triggered on the document when a drag causes an element to scroll
-					 * @event
-					 * @plugin dnd
-					 * @name dnd_scroll.vakata
-					 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
-					 * @param {DOM} element the DOM element being dragged
-					 * @param {jQuery} helper the helper shown next to the mouse
-					 * @param {jQuery} event the element that is scrolling
-					 */
-					$.vakata.dnd._trigger("scroll", vakata_dnd.scroll_e);
-				}
-			},
-			start : function (e, data, html) {
-				if(e.type === "touchstart" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
-					e.pageX = e.originalEvent.changedTouches[0].pageX;
-					e.pageY = e.originalEvent.changedTouches[0].pageY;
-					e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
-				}
-				if(vakata_dnd.is_drag) { $.vakata.dnd.stop({}); }
-				try {
-					e.currentTarget.unselectable = "on";
-					e.currentTarget.onselectstart = function() { return false; };
-					if(e.currentTarget.style) { e.currentTarget.style.MozUserSelect = "none"; }
-				} catch(ignore) { }
-				vakata_dnd.init_x	= e.pageX;
-				vakata_dnd.init_y	= e.pageY;
-				vakata_dnd.data		= data;
-				vakata_dnd.is_down	= true;
-				vakata_dnd.element	= e.currentTarget;
-				vakata_dnd.target	= e.target;
-				vakata_dnd.is_touch	= e.type === "touchstart";
-				if(html !== false) {
-					vakata_dnd.helper = $("<div id='vakata-dnd'></div>").html(html).css({
-						"display"		: "block",
-						"margin"		: "0",
-						"padding"		: "0",
-						"position"		: "absolute",
-						"top"			: "-2000px",
-						"lineHeight"	: "16px",
-						"zIndex"		: "10000"
-					});
-				}
-				$(document).bind("mousemove touchmove", $.vakata.dnd.drag);
-				$(document).bind("mouseup touchend", $.vakata.dnd.stop);
-				return false;
-			},
-			drag : function (e) {
-				if(e.type === "touchmove" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
-					e.pageX = e.originalEvent.changedTouches[0].pageX;
-					e.pageY = e.originalEvent.changedTouches[0].pageY;
-					e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
-				}
-				if(!vakata_dnd.is_down) { return; }
-				if(!vakata_dnd.is_drag) {
-					if(
-						Math.abs(e.pageX - vakata_dnd.init_x) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) ||
-						Math.abs(e.pageY - vakata_dnd.init_y) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold)
-					) {
-						if(vakata_dnd.helper) {
-							vakata_dnd.helper.appendTo("body");
-							vakata_dnd.helper_w = vakata_dnd.helper.outerWidth();
-						}
-						vakata_dnd.is_drag = true;
-						/**
-						 * triggered on the document when a drag starts
-						 * @event
-						 * @plugin dnd
-						 * @name dnd_start.vakata
-						 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
-						 * @param {DOM} element the DOM element being dragged
-						 * @param {jQuery} helper the helper shown next to the mouse
-						 * @param {Object} event the event that caused the start (probably mousemove)
-						 */
-						$.vakata.dnd._trigger("start", e);
-					}
-					else { return; }
-				}
-
-				var d  = false, w  = false,
-					dh = false, wh = false,
-					dw = false, ww = false,
-					dt = false, dl = false,
-					ht = false, hl = false;
-
-				vakata_dnd.scroll_t = 0;
-				vakata_dnd.scroll_l = 0;
-				vakata_dnd.scroll_e = false;
-				$($(e.target).parentsUntil("body").addBack().get().reverse())
-					.filter(function () {
-						return	(/^auto|scroll$/).test($(this).css("overflow")) &&
-								(this.scrollHeight > this.offsetHeight || this.scrollWidth > this.offsetWidth);
-					})
-					.each(function () {
-						var t = $(this), o = t.offset();
-						if(this.scrollHeight > this.offsetHeight) {
-							if(o.top + t.height() - e.pageY < $.vakata.dnd.settings.scroll_proximity)	{ vakata_dnd.scroll_t = 1; }
-							if(e.pageY - o.top < $.vakata.dnd.settings.scroll_proximity)				{ vakata_dnd.scroll_t = -1; }
-						}
-						if(this.scrollWidth > this.offsetWidth) {
-							if(o.left + t.width() - e.pageX < $.vakata.dnd.settings.scroll_proximity)	{ vakata_dnd.scroll_l = 1; }
-							if(e.pageX - o.left < $.vakata.dnd.settings.scroll_proximity)				{ vakata_dnd.scroll_l = -1; }
-						}
-						if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) {
-							vakata_dnd.scroll_e = $(this);
-							return false;
-						}
-					});
-
-				if(!vakata_dnd.scroll_e) {
-					d  = $(document); w = $(window);
-					dh = d.height(); wh = w.height();
-					dw = d.width(); ww = w.width();
-					dt = d.scrollTop(); dl = d.scrollLeft();
-					if(dh > wh && e.pageY - dt < $.vakata.dnd.settings.scroll_proximity)		{ vakata_dnd.scroll_t = -1;  }
-					if(dh > wh && wh - (e.pageY - dt) < $.vakata.dnd.settings.scroll_proximity)	{ vakata_dnd.scroll_t = 1; }
-					if(dw > ww && e.pageX - dl < $.vakata.dnd.settings.scroll_proximity)		{ vakata_dnd.scroll_l = -1; }
-					if(dw > ww && ww - (e.pageX - dl) < $.vakata.dnd.settings.scroll_proximity)	{ vakata_dnd.scroll_l = 1; }
-					if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) {
-						vakata_dnd.scroll_e = d;
-					}
-				}
-				if(vakata_dnd.scroll_e) { $.vakata.dnd._scroll(true); }
-
-				if(vakata_dnd.helper) {
-					ht = parseInt(e.pageY + $.vakata.dnd.settings.helper_top, 10);
-					hl = parseInt(e.pageX + $.vakata.dnd.settings.helper_left, 10);
-					if(dh && ht + 25 > dh) { ht = dh - 50; }
-					if(dw && hl + vakata_dnd.helper_w > dw) { hl = dw - (vakata_dnd.helper_w + 2); }
-					vakata_dnd.helper.css({
-						left	: hl + "px",
-						top		: ht + "px"
-					});
-				}
-				/**
-				 * triggered on the document when a drag is in progress
-				 * @event
-				 * @plugin dnd
-				 * @name dnd_move.vakata
-				 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
-				 * @param {DOM} element the DOM element being dragged
-				 * @param {jQuery} helper the helper shown next to the mouse
-				 * @param {Object} event the event that caused this to trigger (most likely mousemove)
-				 */
-				$.vakata.dnd._trigger("move", e);
-				return false;
-			},
-			stop : function (e) {
-				if(e.type === "touchend" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
-					e.pageX = e.originalEvent.changedTouches[0].pageX;
-					e.pageY = e.originalEvent.changedTouches[0].pageY;
-					e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
-				}
-				if(vakata_dnd.is_drag) {
-					/**
-					 * triggered on the document when a drag stops (the dragged element is dropped)
-					 * @event
-					 * @plugin dnd
-					 * @name dnd_stop.vakata
-					 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
-					 * @param {DOM} element the DOM element being dragged
-					 * @param {jQuery} helper the helper shown next to the mouse
-					 * @param {Object} event the event that caused the stop
-					 */
-					$.vakata.dnd._trigger("stop", e);
-				}
-				else {
-					if(e.type === "touchend" && e.target === vakata_dnd.target) {
-						var to = setTimeout(function () { $(e.target).click(); }, 100);
-						$(e.target).one('click', function() { if(to) { clearTimeout(to); } });
-					}
-				}
-				$.vakata.dnd._clean();
-				return false;
-			}
-		};
-	}($));
-
-	// include the dnd plugin by default
-	// $.jstree.defaults.plugins.push("dnd");
-
-
-/**
- * ### Search plugin
- *
- * Adds search functionality to jsTree.
- */
-
-	/**
-	 * stores all defaults for the search plugin
-	 * @name $.jstree.defaults.search
-	 * @plugin search
-	 */
-	$.jstree.defaults.search = {
-		/**
-		 * a jQuery-like AJAX config, which jstree uses if a server should be queried for results. 
-		 * 
-		 * A `str` (which is the search string) parameter will be added with the request. The expected result is a JSON array with nodes that need to be opened so that matching nodes will be revealed.
-		 * Leave this setting as `false` to not query the server. You can also set this to a function, which will be invoked in the instance's scope and receive 2 parameters - the search string and the callback to call with the array of nodes to load.
-		 * @name $.jstree.defaults.search.ajax
-		 * @plugin search
-		 */
-		ajax : false,
-		/**
-		 * Indicates if the search should be fuzzy or not (should `chnd3` match `child node 3`). Default is `false`.
-		 * @name $.jstree.defaults.search.fuzzy
-		 * @plugin search
-		 */
-		fuzzy : false,
-		/**
-		 * Indicates if the search should be case sensitive. Default is `false`.
-		 * @name $.jstree.defaults.search.case_sensitive
-		 * @plugin search
-		 */
-		case_sensitive : false,
-		/**
-		 * Indicates if the tree should be filtered to show only matching nodes (keep in mind this can be a heavy on large trees in old browsers). Default is `false`.
-		 * @name $.jstree.defaults.search.show_only_matches
-		 * @plugin search
-		 */
-		show_only_matches : false,
-		/**
-		 * Indicates if all nodes opened to reveal the search result, should be closed when the search is cleared or a new search is performed. Default is `true`.
-		 * @name $.jstree.defaults.search.close_opened_onclear
-		 * @plugin search
-		 */
-		close_opened_onclear : true,
-		/**
-		 * Indicates if only leaf nodes should be included in search results. Default is `false`.
-		 * @name $.jstree.defaults.search.search_leaves_only
-		 * @plugin search
-		 */
-		search_leaves_only : false,
-		/**
-		 * If set to a function it wil be called in the instance's scope with two arguments - search string and node (where node will be every node in the structure, so use with caution).
-		 * If the function returns a truthy value the node will be considered a match (it might not be displayed if search_only_leaves is set to true and the node is not a leaf). Default is `false`.
-		 * @name $.jstree.defaults.search.search_callback
-		 * @plugin search
-		 */
-		search_callback : false
-	};
-
-	$.jstree.plugins.search = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-
-			this._data.search.str = "";
-			this._data.search.dom = $();
-			this._data.search.res = [];
-			this._data.search.opn = [];
-
-			this.element.on('before_open.jstree', $.proxy(function (e, data) {
-				var i, j, f, r = this._data.search.res, s = [], o = $();
-				if(r && r.length) {
-					this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #')));
-					this._data.search.dom.children(".jstree-anchor").addClass('jstree-search');
-					if(this.settings.search.show_only_matches && this._data.search.res.length) {
-						for(i = 0, j = r.length; i < j; i++) {
-							s = s.concat(this.get_node(r[i]).parents);
-						}
-						s = $.vakata.array_remove_item($.vakata.array_unique(s),'#');
-						o = s.length ? $(this.element[0].querySelectorAll('#' + $.map(s, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #'))) : $();
-
-						this.element.find(".jstree-node").hide().filter('.jstree-last').filter(function() { return this.nextSibling; }).removeClass('jstree-last');
-						o = o.add(this._data.search.dom);
-						o.parentsUntil(".jstree").addBack().show()
-							.filter(".jstree-children").each(function () { $(this).children(".jstree-node:visible").eq(-1).addClass("jstree-last"); });
-					}
-				}
-			}, this));
-			if(this.settings.search.show_only_matches) {
-				this.element
-					.on("search.jstree", function (e, data) {
-						if(data.nodes.length) {
-							$(this).find(".jstree-node").hide().filter('.jstree-last').filter(function() { return this.nextSibling; }).removeClass('jstree-last');
-							data.nodes.parentsUntil(".jstree").addBack().show()
-								.filter(".jstree-children").each(function () { $(this).children(".jstree-node:visible").eq(-1).addClass("jstree-last"); });
-						}
-					})
-					.on("clear_search.jstree", function (e, data) {
-						if(data.nodes.length) {
-							$(this).find(".jstree-node").css("display","").filter('.jstree-last').filter(function() { return this.nextSibling; }).removeClass('jstree-last');
-						}
-					});
-			}
-		};
-		/**
-		 * used to search the tree nodes for a given string
-		 * @name search(str [, skip_async])
-		 * @param {String} str the search string
-		 * @param {Boolean} skip_async if set to true server will not be queried even if configured
-		 * @plugin search
-		 * @trigger search.jstree
-		 */
-		this.search = function (str, skip_async) {
-			if(str === false || $.trim(str.toString()) === "") {
-				return this.clear_search();
-			}
-			str = str.toString();
-			var s = this.settings.search,
-				a = s.ajax ? s.ajax : false,
-				f = null,
-				r = [],
-				p = [], i, j;
-			if(this._data.search.res.length) {
-				this.clear_search();
-			}
-			if(!skip_async && a !== false) {
-				if($.isFunction(a)) {
-					return a.call(this, str, $.proxy(function (d) {
-							if(d && d.d) { d = d.d; }
-							this._load_nodes(!$.isArray(d) ? [] : $.vakata.array_unique(d), function () {
-								this.search(str, true);
-							}, true);
-						}, this));
-				}
-				else {
-					a = $.extend({}, a);
-					if(!a.data) { a.data = {}; }
-					a.data.str = str;
-					return $.ajax(a)
-						.fail($.proxy(function () {
-							this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'search', 'id' : 'search_01', 'reason' : 'Could not load search parents', 'data' : JSON.stringify(a) };
-							this.settings.core.error.call(this, this._data.core.last_error);
-						}, this))
-						.done($.proxy(function (d) {
-							if(d && d.d) { d = d.d; }
-							this._load_nodes(!$.isArray(d) ? [] : $.vakata.array_unique(d), function () {
-								this.search(str, true);
-							}, true);
-						}, this));
-				}
-			}
-			this._data.search.str = str;
-			this._data.search.dom = $();
-			this._data.search.res = [];
-			this._data.search.opn = [];
-
-			f = new $.vakata.search(str, true, { caseSensitive : s.case_sensitive, fuzzy : s.fuzzy });
-
-			$.each(this._model.data, function (i, v) {
-				if(v.text && ( (s.search_callback && s.search_callback.call(this, str, v)) || (!s.search_callback && f.search(v.text).isMatch) ) && (!s.search_leaves_only || (v.state.loaded && v.children.length === 0)) ) {
-					r.push(i);
-					p = p.concat(v.parents);
-				}
-			});
-			if(r.length) {
-				p = $.vakata.array_unique(p);
-				this._search_open(p);
-				this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #')));
-				this._data.search.res = r;
-				this._data.search.dom.children(".jstree-anchor").addClass('jstree-search');
-			}
-			/**
-			 * triggered after search is complete
-			 * @event
-			 * @name search.jstree
-			 * @param {jQuery} nodes a jQuery collection of matching nodes
-			 * @param {String} str the search string
-			 * @param {Array} res a collection of objects represeing the matching nodes
-			 * @plugin search
-			 */
-			this.trigger('search', { nodes : this._data.search.dom, str : str, res : this._data.search.res });
-		};
-		/**
-		 * used to clear the last search (removes classes and shows all nodes if filtering is on)
-		 * @name clear_search()
-		 * @plugin search
-		 * @trigger clear_search.jstree
-		 */
-		this.clear_search = function () {
-			this._data.search.dom.children(".jstree-anchor").removeClass("jstree-search");
-			if(this.settings.search.close_opened_onclear) {
-				this.close_node(this._data.search.opn, 0);
-			}
-			/**
-			 * triggered after search is complete
-			 * @event
-			 * @name clear_search.jstree
-			 * @param {jQuery} nodes a jQuery collection of matching nodes (the result from the last search)
-			 * @param {String} str the search string (the last search string)
-			 * @param {Array} res a collection of objects represeing the matching nodes (the result from the last search)
-			 * @plugin search
-			 */
-			this.trigger('clear_search', { 'nodes' : this._data.search.dom, str : this._data.search.str, res : this._data.search.res });
-			this._data.search.str = "";
-			this._data.search.res = [];
-			this._data.search.opn = [];
-			this._data.search.dom = $();
-		};
-		/**
-		 * opens nodes that need to be opened to reveal the search results. Used only internally.
-		 * @private
-		 * @name _search_open(d)
-		 * @param {Array} d an array of node IDs
-		 * @plugin search
-		 */
-		this._search_open = function (d) {
-			var t = this;
-			$.each(d.concat([]), function (i, v) {
-				if(v === "#") { return true; }
-				try { v = $('#' + v.replace($.jstree.idregex,'\\$&'), t.element); } catch(ignore) { }
-				if(v && v.length) {
-					if(t.is_closed(v)) {
-						t._data.search.opn.push(v[0].id);
-						t.open_node(v, function () { t._search_open(d); }, 0);
-					}
-				}
-			});
-		};
-	};
-
-	// helpers
-	(function ($) {
-		// from http://kiro.me/projects/fuse.html
-		$.vakata.search = function(pattern, txt, options) {
-			options = options || {};
-			if(options.fuzzy !== false) {
-				options.fuzzy = true;
-			}
-			pattern = options.caseSensitive ? pattern : pattern.toLowerCase();
-			var MATCH_LOCATION	= options.location || 0,
-				MATCH_DISTANCE	= options.distance || 100,
-				MATCH_THRESHOLD	= options.threshold || 0.6,
-				patternLen = pattern.length,
-				matchmask, pattern_alphabet, match_bitapScore, search;
-			if(patternLen > 32) {
-				options.fuzzy = false;
-			}
-			if(options.fuzzy) {
-				matchmask = 1 << (patternLen - 1);
-				pattern_alphabet = (function () {
-					var mask = {},
-						i = 0;
-					for (i = 0; i < patternLen; i++) {
-						mask[pattern.charAt(i)] = 0;
-					}
-					for (i = 0; i < patternLen; i++) {
-						mask[pattern.charAt(i)] |= 1 << (patternLen - i - 1);
-					}
-					return mask;
-				}());
-				match_bitapScore = function (e, x) {
-					var accuracy = e / patternLen,
-						proximity = Math.abs(MATCH_LOCATION - x);
-					if(!MATCH_DISTANCE) {
-						return proximity ? 1.0 : accuracy;
-					}
-					return accuracy + (proximity / MATCH_DISTANCE);
-				};
-			}
-			search = function (text) {
-				text = options.caseSensitive ? text : text.toLowerCase();
-				if(pattern === text || text.indexOf(pattern) !== -1) {
-					return {
-						isMatch: true,
-						score: 0
-					};
-				}
-				if(!options.fuzzy) {
-					return {
-						isMatch: false,
-						score: 1
-					};
-				}
-				var i, j,
-					textLen = text.length,
-					scoreThreshold = MATCH_THRESHOLD,
-					bestLoc = text.indexOf(pattern, MATCH_LOCATION),
-					binMin, binMid,
-					binMax = patternLen + textLen,
-					lastRd, start, finish, rd, charMatch,
-					score = 1,
-					locations = [];
-				if (bestLoc !== -1) {
-					scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold);
-					bestLoc = text.lastIndexOf(pattern, MATCH_LOCATION + patternLen);
-					if (bestLoc !== -1) {
-						scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold);
-					}
-				}
-				bestLoc = -1;
-				for (i = 0; i < patternLen; i++) {
-					binMin = 0;
-					binMid = binMax;
-					while (binMin < binMid) {
-						if (match_bitapScore(i, MATCH_LOCATION + binMid) <= scoreThreshold) {
-							binMin = binMid;
-						} else {
-							binMax = binMid;
-						}
-						binMid = Math.floor((binMax - binMin) / 2 + binMin);
-					}
-					binMax = binMid;
-					start = Math.max(1, MATCH_LOCATION - binMid + 1);
-					finish = Math.min(MATCH_LOCATION + binMid, textLen) + patternLen;
-					rd = new Array(finish + 2);
-					rd[finish + 1] = (1 << i) - 1;
-					for (j = finish; j >= start; j--) {
-						charMatch = pattern_alphabet[text.charAt(j - 1)];
-						if (i === 0) {
-							rd[j] = ((rd[j + 1] << 1) | 1) & charMatch;
-						} else {
-							rd[j] = ((rd[j + 1] << 1) | 1) & charMatch | (((lastRd[j + 1] | lastRd[j]) << 1) | 1) | lastRd[j + 1];
-						}
-						if (rd[j] & matchmask) {
-							score = match_bitapScore(i, j - 1);
-							if (score <= scoreThreshold) {
-								scoreThreshold = score;
-								bestLoc = j - 1;
-								locations.push(bestLoc);
-								if (bestLoc > MATCH_LOCATION) {
-									start = Math.max(1, 2 * MATCH_LOCATION - bestLoc);
-								} else {
-									break;
-								}
-							}
-						}
-					}
-					if (match_bitapScore(i + 1, MATCH_LOCATION) > scoreThreshold) {
-						break;
-					}
-					lastRd = rd;
-				}
-				return {
-					isMatch: bestLoc >= 0,
-					score: score
-				};
-			};
-			return txt === true ? { 'search' : search } : search(txt);
-		};
-	}($));
-
-	// include the search plugin by default
-	// $.jstree.defaults.plugins.push("search");
-
-/**
- * ### Sort plugin
- *
- * Autmatically sorts all siblings in the tree according to a sorting function.
- */
-
-	/**
-	 * the settings function used to sort the nodes.
-	 * It is executed in the tree's context, accepts two nodes as arguments and should return `1` or `-1`.
-	 * @name $.jstree.defaults.sort
-	 * @plugin sort
-	 */
-	$.jstree.defaults.sort = function (a, b) {
-		//return this.get_type(a) === this.get_type(b) ? (this.get_text(a) > this.get_text(b) ? 1 : -1) : this.get_type(a) >= this.get_type(b);
-		return this.get_text(a) > this.get_text(b) ? 1 : -1;
-	};
-	$.jstree.plugins.sort = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-			this.element
-				.on("model.jstree", $.proxy(function (e, data) {
-						this.sort(data.parent, true);
-					}, this))
-				.on("rename_node.jstree create_node.jstree", $.proxy(function (e, data) {
-						this.sort(data.parent || data.node.parent, false);
-						this.redraw_node(data.parent || data.node.parent, true);
-					}, this))
-				.on("move_node.jstree copy_node.jstree", $.proxy(function (e, data) {
-						this.sort(data.parent, false);
-						this.redraw_node(data.parent, true);
-					}, this));
-		};
-		/**
-		 * used to sort a node's children
-		 * @private
-		 * @name sort(obj [, deep])
-		 * @param  {mixed} obj the node
-		 * @param {Boolean} deep if set to `true` nodes are sorted recursively.
-		 * @plugin sort
-		 * @trigger search.jstree
-		 */
-		this.sort = function (obj, deep) {
-			var i, j;
-			obj = this.get_node(obj);
-			if(obj && obj.children && obj.children.length) {
-				obj.children.sort($.proxy(this.settings.sort, this));
-				if(deep) {
-					for(i = 0, j = obj.children_d.length; i < j; i++) {
-						this.sort(obj.children_d[i], false);
-					}
-				}
-			}
-		};
-	};
-
-	// include the sort plugin by default
-	// $.jstree.defaults.plugins.push("sort");
-
-/**
- * ### State plugin
- *
- * Saves the state of the tree (selected nodes, opened nodes) on the user's computer using available options (localStorage, cookies, etc)
- */
-
-	var to = false;
-	/**
-	 * stores all defaults for the state plugin
-	 * @name $.jstree.defaults.state
-	 * @plugin state
-	 */
-	$.jstree.defaults.state = {
-		/**
-		 * A string for the key to use when saving the current tree (change if using multiple trees in your project). Defaults to `jstree`.
-		 * @name $.jstree.defaults.state.key
-		 * @plugin state
-		 */
-		key		: 'jstree',
-		/**
-		 * A space separated list of events that trigger a state save. Defaults to `changed.jstree open_node.jstree close_node.jstree`.
-		 * @name $.jstree.defaults.state.events
-		 * @plugin state
-		 */
-		events	: 'changed.jstree open_node.jstree close_node.jstree',
-		/**
-		 * Time in milliseconds after which the state will expire. Defaults to 'false' meaning - no expire.
-		 * @name $.jstree.defaults.state.ttl
-		 * @plugin state
-		 */
-		ttl		: false,
-		/**
-		 * A function that will be executed prior to restoring state with one argument - the state object. Can be used to clear unwanted parts of the state.
-		 * @name $.jstree.defaults.state.filter
-		 * @plugin state
-		 */
-		filter	: false
-	};
-	$.jstree.plugins.state = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-			var bind = $.proxy(function () {
-				this.element.on(this.settings.state.events, $.proxy(function () {
-					if(to) { clearTimeout(to); }
-					to = setTimeout($.proxy(function () { this.save_state(); }, this), 100);
-				}, this));
-			}, this);
-			this.element
-				.on("ready.jstree", $.proxy(function (e, data) {
-						this.element.one("restore_state.jstree", bind);
-						if(!this.restore_state()) { bind(); }
-					}, this));
-		};
-		/**
-		 * save the state
-		 * @name save_state()
-		 * @plugin state
-		 */
-		this.save_state = function () {
-			var st = { 'state' : this.get_state(), 'ttl' : this.settings.state.ttl, 'sec' : +(new Date()) };
-			$.vakata.storage.set(this.settings.state.key, JSON.stringify(st));
-		};
-		/**
-		 * restore the state from the user's computer
-		 * @name restore_state()
-		 * @plugin state
-		 */
-		this.restore_state = function () {
-			var k = $.vakata.storage.get(this.settings.state.key);
-			if(!!k) { try { k = JSON.parse(k); } catch(ex) { return false; } }
-			if(!!k && k.ttl && k.sec && +(new Date()) - k.sec > k.ttl) { return false; }
-			if(!!k && k.state) { k = k.state; }
-			if(!!k && $.isFunction(this.settings.state.filter)) { k = this.settings.state.filter.call(this, k); }
-			if(!!k) {
-				this.element.one("set_state.jstree", function (e, data) { data.instance.trigger('restore_state', { 'state' : $.extend(true, {}, k) }); });
-				this.set_state(k);
-				return true;
-			}
-			return false;
-		};
-		/**
-		 * clear the state on the user's computer
-		 * @name clear_state()
-		 * @plugin state
-		 */
-		this.clear_state = function () {
-			return $.vakata.storage.del(this.settings.state.key);
-		};
-	};
-
-	(function ($, undefined) {
-		$.vakata.storage = {
-			// simply specifying the functions in FF throws an error
-			set : function (key, val) { return window.localStorage.setItem(key, val); },
-			get : function (key) { return window.localStorage.getItem(key); },
-			del : function (key) { return window.localStorage.removeItem(key); }
-		};
-	}($));
-
-	// include the state plugin by default
-	// $.jstree.defaults.plugins.push("state");
-
-/**
- * ### Types plugin
- *
- * Makes it possible to add predefined types for groups of nodes, which make it possible to easily control nesting rules and icon for each group.
- */
-
-	/**
-	 * An object storing all types as key value pairs, where the key is the type name and the value is an object that could contain following keys (all optional).
-	 * 
-	 * * `max_children` the maximum number of immediate children this node type can have. Do not specify or set to `-1` for unlimited.
-	 * * `max_depth` the maximum number of nesting this node type can have. A value of `1` would mean that the node can have children, but no grandchildren. Do not specify or set to `-1` for unlimited.
-	 * * `valid_children` an array of node type strings, that nodes of this type can have as children. Do not specify or set to `-1` for no limits.
-	 * * `icon` a string - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class. Omit to use the default icon from your theme.
-	 *
-	 * There are two predefined types:
-	 * 
-	 * * `#` represents the root of the tree, for example `max_children` would control the maximum number of root nodes.
-	 * * `default` represents the default node - any settings here will be applied to all nodes that do not have a type specified.
-	 * 
-	 * @name $.jstree.defaults.types
-	 * @plugin types
-	 */
-	$.jstree.defaults.types = {
-		'#' : {},
-		'default' : {}
-	};
-
-	$.jstree.plugins.types = function (options, parent) {
-		this.init = function (el, options) {
-			var i, j;
-			if(options && options.types && options.types['default']) {
-				for(i in options.types) {
-					if(i !== "default" && i !== "#" && options.types.hasOwnProperty(i)) {
-						for(j in options.types['default']) {
-							if(options.types['default'].hasOwnProperty(j) && options.types[i][j] === undefined) {
-								options.types[i][j] = options.types['default'][j];
-							}
-						}
-					}
-				}
-			}
-			parent.init.call(this, el, options);
-			this._model.data['#'].type = '#';
-		};
-		this.refresh = function (skip_loading, forget_state) {
-			parent.refresh.call(this, skip_loading, forget_state);
-			this._model.data['#'].type = '#';
-		};
-		this.bind = function () {
-			this.element
-				.on('model.jstree', $.proxy(function (e, data) {
-						var m = this._model.data,
-							dpc = data.nodes,
-							t = this.settings.types,
-							i, j, c = 'default';
-						for(i = 0, j = dpc.length; i < j; i++) {
-							c = 'default';
-							if(m[dpc[i]].original && m[dpc[i]].original.type && t[m[dpc[i]].original.type]) {
-								c = m[dpc[i]].original.type;
-							}
-							if(m[dpc[i]].data && m[dpc[i]].data.jstree && m[dpc[i]].data.jstree.type && t[m[dpc[i]].data.jstree.type]) {
-								c = m[dpc[i]].data.jstree.type;
-							}
-							m[dpc[i]].type = c;
-							if(m[dpc[i]].icon === true && t[c].icon !== undefined) {
-								m[dpc[i]].icon = t[c].icon;
-							}
-						}
-						m['#'].type = '#';
-					}, this));
-			parent.bind.call(this);
-		};
-		this.get_json = function (obj, options, flat) {
-			var i, j,
-				m = this._model.data,
-				opt = options ? $.extend(true, {}, options, {no_id:false}) : {},
-				tmp = parent.get_json.call(this, obj, opt, flat);
-			if(tmp === false) { return false; }
-			if($.isArray(tmp)) {
-				for(i = 0, j = tmp.length; i < j; i++) {
-					tmp[i].type = tmp[i].id && m[tmp[i].id] && m[tmp[i].id].type ? m[tmp[i].id].type : "default";
-					if(options && options.no_id) {
-						delete tmp[i].id;
-						if(tmp[i].li_attr && tmp[i].li_attr.id) {
-							delete tmp[i].li_attr.id;
-						}
-					}
-				}
-			}
-			else {
-				tmp.type = tmp.id && m[tmp.id] && m[tmp.id].type ? m[tmp.id].type : "default";
-				if(options && options.no_id) {
-					tmp = this._delete_ids(tmp);
-				}
-			}
-			return tmp;
-		};
-		this._delete_ids = function (tmp) {
-			if($.isArray(tmp)) {
-				for(var i = 0, j = tmp.length; i < j; i++) {
-					tmp[i] = this._delete_ids(tmp[i]);
-				}
-				return tmp;
-			}
-			delete tmp.id;
-			if(tmp.li_attr && tmp.li_attr.id) {
-				delete tmp.li_attr.id;
-			}
-			if(tmp.children && $.isArray(tmp.children)) {
-				tmp.children = this._delete_ids(tmp.children);
-			}
-			return tmp;
-		};
-		this.check = function (chk, obj, par, pos, more) {
-			if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; }
-			obj = obj && obj.id ? obj : this.get_node(obj);
-			par = par && par.id ? par : this.get_node(par);
-			var m = obj && obj.id ? $.jstree.reference(obj.id) : null, tmp, d, i, j;
-			m = m && m._model && m._model.data ? m._model.data : null;
-			switch(chk) {
-				case "create_node":
-				case "move_node":
-				case "copy_node":
-					if(chk !== 'move_node' || $.inArray(obj.id, par.children) === -1) {
-						tmp = this.get_rules(par);
-						if(tmp.max_children !== undefined && tmp.max_children !== -1 && tmp.max_children === par.children.length) {
-							this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_01', 'reason' : 'max_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-							return false;
-						}
-						if(tmp.valid_children !== undefined && tmp.valid_children !== -1 && $.inArray(obj.type, tmp.valid_children) === -1) {
-							this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_02', 'reason' : 'valid_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-							return false;
-						}
-						if(m && obj.children_d && obj.parents) {
-							d = 0;
-							for(i = 0, j = obj.children_d.length; i < j; i++) {
-								d = Math.max(d, m[obj.children_d[i]].parents.length);
-							}
-							d = d - obj.parents.length + 1;
-						}
-						if(d <= 0 || d === undefined) { d = 1; }
-						do {
-							if(tmp.max_depth !== undefined && tmp.max_depth !== -1 && tmp.max_depth < d) {
-								this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_03', 'reason' : 'max_depth prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-								return false;
-							}
-							par = this.get_node(par.parent);
-							tmp = this.get_rules(par);
-							d++;
-						} while(par);
-					}
-					break;
-			}
-			return true;
-		};
-		/**
-		 * used to retrieve the type settings object for a node
-		 * @name get_rules(obj)
-		 * @param {mixed} obj the node to find the rules for
-		 * @return {Object}
-		 * @plugin types
-		 */
-		this.get_rules = function (obj) {
-			obj = this.get_node(obj);
-			if(!obj) { return false; }
-			var tmp = this.get_type(obj, true);
-			if(tmp.max_depth === undefined) { tmp.max_depth = -1; }
-			if(tmp.max_children === undefined) { tmp.max_children = -1; }
-			if(tmp.valid_children === undefined) { tmp.valid_children = -1; }
-			return tmp;
-		};
-		/**
-		 * used to retrieve the type string or settings object for a node
-		 * @name get_type(obj [, rules])
-		 * @param {mixed} obj the node to find the rules for
-		 * @param {Boolean} rules if set to `true` instead of a string the settings object will be returned
-		 * @return {String|Object}
-		 * @plugin types
-		 */
-		this.get_type = function (obj, rules) {
-			obj = this.get_node(obj);
-			return (!obj) ? false : ( rules ? $.extend({ 'type' : obj.type }, this.settings.types[obj.type]) : obj.type);
-		};
-		/**
-		 * used to change a node's type
-		 * @name set_type(obj, type)
-		 * @param {mixed} obj the node to change
-		 * @param {String} type the new type
-		 * @plugin types
-		 */
-		this.set_type = function (obj, type) {
-			var t, t1, t2, old_type, old_icon;
-			if($.isArray(obj)) {
-				obj = obj.slice();
-				for(t1 = 0, t2 = obj.length; t1 < t2; t1++) {
-					this.set_type(obj[t1], type);
-				}
-				return true;
-			}
-			t = this.settings.types;
-			obj = this.get_node(obj);
-			if(!t[type] || !obj) { return false; }
-			old_type = obj.type;
-			old_icon = this.get_icon(obj);
-			obj.type = type;
-			if(old_icon === true || (t[old_type] && t[old_type].icon && old_icon === t[old_type].icon)) {
-				this.set_icon(obj, t[type].icon !== undefined ? t[type].icon : true);
-			}
-			return true;
-		};
-	};
-	// include the types plugin by default
-	// $.jstree.defaults.plugins.push("types");
-
-/**
- * ### Unique plugin
- *
- * Enforces that no nodes with the same name can coexist as siblings.
- */
-
-	/**
-	 * stores all defaults for the unique plugin
-	 * @name $.jstree.defaults.unique
-	 * @plugin unique
-	 */
-	$.jstree.defaults.unique = {
-		/**
-		 * Indicates if the comparison should be case sensitive. Default is `false`.
-		 * @name $.jstree.defaults.unique.case_sensitive
-		 * @plugin unique
-		 */
-		case_sensitive : false,
-		/**
-		 * A callback executed in the instance's scope when a new node is created and the name is already taken, the two arguments are the conflicting name and the counter. The default will produce results like `New node (2)`.
-		 * @name $.jstree.defaults.unique.duplicate
-		 * @plugin unique
-		 */
-		duplicate : function (name, counter) {
-			return name + ' (' + counter + ')';
-		}
-	};
-
-	$.jstree.plugins.unique = function (options, parent) {
-		this.check = function (chk, obj, par, pos, more) {
-			if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; }
-			obj = obj && obj.id ? obj : this.get_node(obj);
-			par = par && par.id ? par : this.get_node(par);
-			if(!par || !par.children) { return true; }
-			var n = chk === "rename_node" ? pos : obj.text,
-				c = [],
-				s = this.settings.unique.case_sensitive,
-				m = this._model.data, i, j;
-			for(i = 0, j = par.children.length; i < j; i++) {
-				c.push(s ? m[par.children[i]].text : m[par.children[i]].text.toLowerCase());
-			}
-			if(!s) { n = n.toLowerCase(); }
-			switch(chk) {
-				case "delete_node":
-					return true;
-				case "rename_node":
-					i = ($.inArray(n, c) === -1 || (obj.text && obj.text[ s ? 'toString' : 'toLowerCase']() === n));
-					if(!i) {
-						this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_01', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-					}
-					return i;
-				case "create_node":
-					i = ($.inArray(n, c) === -1);
-					if(!i) {
-						this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_04', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-					}
-					return i;
-				case "copy_node":
-					i = ($.inArray(n, c) === -1);
-					if(!i) {
-						this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_02', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-					}
-					return i;
-				case "move_node":
-					i = (obj.parent === par.id || $.inArray(n, c) === -1);
-					if(!i) {
-						this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_03', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) };
-					}
-					return i;
-			}
-			return true;
-		};
-		this.create_node = function (par, node, pos, callback, is_loaded) {
-			if(!node || node.text === undefined) {
-				if(par === null) {
-					par = "#";
-				}
-				par = this.get_node(par);
-				if(!par) {
-					return parent.create_node.call(this, par, node, pos, callback, is_loaded);
-				}
-				pos = pos === undefined ? "last" : pos;
-				if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) {
-					return parent.create_node.call(this, par, node, pos, callback, is_loaded);
-				}
-				if(!node) { node = {}; }
-				var tmp, n, dpc, i, j, m = this._model.data, s = this.settings.unique.case_sensitive, cb = this.settings.unique.duplicate;
-				n = tmp = this.get_string('New node');
-				dpc = [];
-				for(i = 0, j = par.children.length; i < j; i++) {
-					dpc.push(s ? m[par.children[i]].text : m[par.children[i]].text.toLowerCase());
-				}
-				i = 1;
-				while($.inArray(s ? n : n.toLowerCase(), dpc) !== -1) {
-					n = cb.call(this, tmp, (++i)).toString();
-				}
-				node.text = n;
-			}
-			return parent.create_node.call(this, par, node, pos, callback, is_loaded);
-		};
-	};
-
-	// include the unique plugin by default
-	// $.jstree.defaults.plugins.push("unique");
-
-
-/**
- * ### Wholerow plugin
- *
- * Makes each node appear block level. Making selection easier. May cause slow down for large trees in old browsers.
- */
-
-	var div = document.createElement('DIV');
-	div.setAttribute('unselectable','on');
-	div.className = 'jstree-wholerow';
-	div.innerHTML = '&#160;';
-	$.jstree.plugins.wholerow = function (options, parent) {
-		this.bind = function () {
-			parent.bind.call(this);
-
-			this.element
-				.on('ready.jstree set_state.jstree', $.proxy(function () {
-						this.hide_dots();
-					}, this))
-				.on("init.jstree loading.jstree ready.jstree", $.proxy(function () {
-						//div.style.height = this._data.core.li_height + 'px';
-						this.get_container_ul().addClass('jstree-wholerow-ul');
-					}, this))
-				.on("deselect_all.jstree", $.proxy(function (e, data) {
-						this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked');
-					}, this))
-				.on("changed.jstree", $.proxy(function (e, data) {
-						this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked');
-						var tmp = false, i, j;
-						for(i = 0, j = data.selected.length; i < j; i++) {
-							tmp = this.get_node(data.selected[i], true);
-							if(tmp && tmp.length) {
-								tmp.children('.jstree-wholerow').addClass('jstree-wholerow-clicked');
-							}
-						}
-					}, this))
-				.on("open_node.jstree", $.proxy(function (e, data) {
-						this.get_node(data.node, true).find('.jstree-clicked').parent().children('.jstree-wholerow').addClass('jstree-wholerow-clicked');
-					}, this))
-				.on("hover_node.jstree dehover_node.jstree", $.proxy(function (e, data) {
-						this.get_node(data.node, true).children('.jstree-wholerow')[e.type === "hover_node"?"addClass":"removeClass"]('jstree-wholerow-hovered');
-					}, this))
-				.on("contextmenu.jstree", ".jstree-wholerow", $.proxy(function (e) {
-						e.preventDefault();
-						var tmp = $.Event('contextmenu', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey, pageX : e.pageX, pageY : e.pageY });
-						$(e.currentTarget).closest(".jstree-node").children(".jstree-anchor:eq(0)").trigger(tmp);
-					}, this))
-				.on("click.jstree", ".jstree-wholerow", function (e) {
-						e.stopImmediatePropagation();
-						var tmp = $.Event('click', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey });
-						$(e.currentTarget).closest(".jstree-node").children(".jstree-anchor:eq(0)").trigger(tmp).focus();
-					})
-				.on("click.jstree", ".jstree-leaf > .jstree-ocl", $.proxy(function (e) {
-						e.stopImmediatePropagation();
-						var tmp = $.Event('click', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey });
-						$(e.currentTarget).closest(".jstree-node").children(".jstree-anchor:eq(0)").trigger(tmp).focus();
-					}, this))
-				.on("mouseover.jstree", ".jstree-wholerow, .jstree-icon", $.proxy(function (e) {
-						e.stopImmediatePropagation();
-						this.hover_node(e.currentTarget);
-						return false;
-					}, this))
-				.on("mouseleave.jstree", ".jstree-node", $.proxy(function (e) {
-						this.dehover_node(e.currentTarget);
-					}, this));
-		};
-		this.teardown = function () {
-			if(this.settings.wholerow) {
-				this.element.find(".jstree-wholerow").remove();
-			}
-			parent.teardown.call(this);
-		};
-		this.redraw_node = function(obj, deep, callback) {
-			obj = parent.redraw_node.call(this, obj, deep, callback);
-			if(obj) {
-				var tmp = div.cloneNode(true);
-				//tmp.style.height = this._data.core.li_height + 'px';
-				if($.inArray(obj.id, this._data.core.selected) !== -1) { tmp.className += ' jstree-wholerow-clicked'; }
-				obj.insertBefore(tmp, obj.childNodes[0]);
-			}
-			return obj;
-		};
-	};
-	// include the wholerow plugin by default
-	// $.jstree.defaults.plugins.push("wholerow");
-
-}));
\ No newline at end of file
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/select2.min.js b/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/select2.min.js
deleted file mode 100644
index 1d3ee49..0000000
--- a/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/select2.min.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-Copyright 2014 Igor Vaynberg
-
-Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014
-
-This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
-General Public License version 2 (the "GPL License"). You may choose either license to govern your
-use of this software only upon the condition that you accept all of the terms of either the Apache
-License or the GPL License.
-
-You may obtain a copy of the Apache License and the GPL License at:
-
-http://www.apache.org/licenses/LICENSE-2.0
-http://www.gnu.org/licenses/gpl-2.0.html
-
-Unless required by applicable law or agreed to in writing, software distributed under the Apache License
-or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
-either express or implied. See the Apache License and the GPL License for the specific language governing
-permissions and limitations under the Apache License and the GPL License.
-*/
-!function(a){"undefined"==typeof a.fn.each2&&a.extend(a.fn,{each2:function(b){for(var c=a([0]),d=-1,e=this.length;++d<e&&(c.context=c[0]=this[d])&&b.call(c[0],d,c)!==!1;);return this}})}(jQuery),function(a,b){"use strict";function n(b){var c=a(document.createTextNode(""));b.before(c),c.before(b),c.remove()}function o(a){function b(a){return m[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function p(a,b){for(var c=0,d=b.length;d>c;c+=1)if(r(a,b[c]))return c;return-1}function q(){var b=a(l [...]
-break}}},highlight:function(b){var d,e,c=this.findHighlightableChoices();return 0===arguments.length?p(c.filter(".select2-highlighted")[0],c.get()):(b>=c.length&&(b=c.length-1),0>b&&(b=0),this.removeHighlight(),d=a(c[b]),d.addClass("select2-highlighted"),this.search.attr("aria-activedescendant",d.find(".select2-result-label").attr("id")),this.ensureHighlightVisible(),this.liveRegion.text(d.text()),e=d.data("select2-data"),e&&this.opts.element.trigger({type:"select2-highlight",val:this.id [...]
-},formatNoMatches:function(){return"No matches found"},formatAjaxError:function(){return"Loading failed"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" or more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(){return"Loading more results\u2026"},formatSearching:functi [...]
\ No newline at end of file
diff --git a/src/main/resources/SLING-INF/libs/sling/resource-editor/html.jsp b/src/main/resources/SLING-INF/libs/sling/resource-editor/html.jsp
index 5ec2743..b426599 100644
--- a/src/main/resources/SLING-INF/libs/sling/resource-editor/html.jsp
+++ b/src/main/resources/SLING-INF/libs/sling/resource-editor/html.jsp
@@ -26,11 +26,11 @@ original
 
 <script type="text/javascript" src="<%= request.getContextPath() %>/libs/jsnodetypes/js/jsnodetypes.js"></script>
 
-<script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/jquery.min.js"></script>
-<script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/bootstrap.min.js"></script>
-<script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/bootbox.min.js"></script>
-<script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/jstree.js"></script>
-<script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/select2.min.js"></script>
+<script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/3rd_party/jquery.min.js"></script>
+<script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/3rd_party/bootstrap.min.js"></script>
+<script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/3rd_party/bootbox.min.js"></script>
+<script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/3rd_party/jstree.min.js"></script>
+<script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/3rd_party/select2.min.js"></script>
 
 <script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/reseditor/tree/JSTreeAdapter.js"></script>
 <script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/reseditor/tree/TreeController.js"></script>
@@ -40,14 +40,14 @@ original
 
 <!-- 
 <script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/jquery.scrollTo-min.js"></script>
- -->
 <script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/urlEncode.js"></script>
+ -->
 
 <link rel="stylesheet" type="text/css" media="all" href="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/css/style.css">
 <link rel="stylesheet" type="text/css" media="all" href="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/css/bootstrap.css">
 <link rel="stylesheet" type="text/css" media="all" href="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/css/bootbox.reseditor.css">
-<link rel="stylesheet" type="text/css" media="all" href="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/css/shake.css">
-<link rel="stylesheet" type="text/css" media="all" href="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/css/select2.css">
+<link rel="stylesheet" type="text/css" media="all" href="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/css/3rd_party/animate.min.css">
+<link rel="stylesheet" type="text/css" media="all" href="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/css/3rd_party/select2.css">
 <link rel="stylesheet" type="text/css" media="all" href="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/css/select2.reseditor.css">
 
 <!--[if IE]>
@@ -97,7 +97,7 @@ new org.apache.sling.reseditor.JSTreeAdapter(jsTreeAdapterSettings, treeControll
 		<div id="login" class="row">
 			<div class="col-sm-12">
 			 	<div class="logo">
-				Sling Resource Editor <span class="edition">node-edit version</span>
+				The Sling Resource Editor <span class="edition">node-edit version</span>
 				</div>			 	
 				<div class="tabbable tabs-below"> 
 				  <div id="login_tab_content" class="tab-content plate-background plate-box-shadow" style="display:none;">
diff --git a/src/test/javascript/e2e/spec/e2e_spec.js b/src/test/javascript/e2e/spec/e2e_spec.js
new file mode 100644
index 0000000..0513734
--- /dev/null
+++ b/src/test/javascript/e2e/spec/e2e_spec.js
@@ -0,0 +1,14 @@
+'use strict';
+
+var assert = require('assert');
+
+describe('The Apache Sling Resource Editor', function() {
+  it('should have a title', function(done) {
+	  browser
+      .url('http://juliemr.github.io/protractor-demo/')
+      .getTitle(function(err,title) {
+          assert(title.indexOf('Super Calculator') !== -1);
+      })
+      .call(done);
+  });
+});
\ No newline at end of file
diff --git a/src/test/javascript/spec/resource_editor_spec.js b/src/test/javascript/spec/resource_editor_spec.js
new file mode 100644
index 0000000..636d888
--- /dev/null
+++ b/src/test/javascript/spec/resource_editor_spec.js
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+describe('The Resource Editor', function() {
+
+	it('\'s MainController', function() {
+//		it('can encode a URL', function() {
+//			var ntManager = new de.sandroboehme.NodeTypeManager();
+			var mainControllerSettings = {
+					contextPath: "/",
+//					nodeTypes: ntManager.getNodeTypeNames() 
+			};
+			var mainController = new org.apache.sling.reseditor.MainController(mainControllerSettings, null);
+			var urlToEncode = "/reseditor/testnode/$&?äöß<> test.html";
+			expect(mainController.encodeURL(urlToEncode)).toEqual("/reseditor/testnode/%24%26%3F%C3%A4%C3%B6%C3%9F%3C%3E%20test.html");
+//		});
+	});
+});
\ No newline at end of file

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.