Browse Source

Remove unused libs, adding them with yarn

Julio Montoya 5 years ago
parent
commit
3b3f8234dc
42 changed files with 298 additions and 3916 deletions
  1. 2 1
      assets/css/app.scss
  2. 2 4
      assets/js/app.js
  3. 1 7
      assets/js/vendor.js
  4. 4 0
      package.json
  5. 0 29
      public/libs/js-cookie/.bower.json
  6. 0 79
      public/libs/js-cookie/CONTRIBUTING.md
  7. 0 20
      public/libs/js-cookie/MIT-LICENSE.txt
  8. 0 297
      public/libs/js-cookie/README.md
  9. 0 107
      public/libs/js-cookie/SERVER_SIDE.md
  10. 0 18
      public/libs/js-cookie/bower.json
  11. 0 165
      public/libs/js-cookie/src/js.cookie.js
  12. 0 976
      public/libs/pwstrength-bootstrap/dist/pwstrength-bootstrap.js
  13. 0 2
      public/libs/pwstrength-bootstrap/dist/pwstrength-bootstrap.min.js
  14. 0 0
      public/libs/pwstrength-bootstrap/dist/pwstrength-bootstrap.min.map
  15. 0 17
      public/libs/pwstrength-bootstrap/locales/de.json
  16. 0 17
      public/libs/pwstrength-bootstrap/locales/el.json
  17. 0 17
      public/libs/pwstrength-bootstrap/locales/en.json
  18. 0 17
      public/libs/pwstrength-bootstrap/locales/eo.json
  19. 0 17
      public/libs/pwstrength-bootstrap/locales/es.json
  20. 0 17
      public/libs/pwstrength-bootstrap/locales/fr.json
  21. 0 17
      public/libs/pwstrength-bootstrap/locales/it.json
  22. 0 17
      public/libs/pwstrength-bootstrap/locales/pl.json
  23. 0 17
      public/libs/pwstrength-bootstrap/locales/pt.json
  24. 0 17
      public/libs/pwstrength-bootstrap/locales/ru.json
  25. 0 17
      public/libs/pwstrength-bootstrap/locales/sk.json
  26. 0 17
      public/libs/pwstrength-bootstrap/locales/th.json
  27. 0 17
      public/libs/pwstrength-bootstrap/locales/tr.json
  28. 0 17
      public/libs/pwstrength-bootstrap/locales/zh-TW.json
  29. 0 36
      public/libs/readmore-js/CHANGELOG.md
  30. 0 22
      public/libs/readmore-js/LICENSE
  31. 0 183
      public/libs/readmore-js/README.md
  32. 0 25
      public/libs/readmore-js/ajax-demo.html
  33. 0 29
      public/libs/readmore-js/bower.json
  34. 0 243
      public/libs/readmore-js/demo.html
  35. 0 14
      public/libs/readmore-js/gulpfile.js
  36. 0 692
      public/libs/readmore-js/jquery.mockjax.js
  37. 0 35
      public/libs/readmore-js/package.json
  38. 0 342
      public/libs/readmore-js/readmore.js
  39. 0 10
      public/libs/readmore-js/readmore.min.js
  40. 1 1
      src/ThemeBundle/Resources/views/Layout/legacy_js.html.twig
  41. 21 0
      webpack.config.js
  42. 267 341
      yarn.lock

+ 2 - 1
assets/css/app.scss

@@ -2,12 +2,12 @@
     Theme Name: Chamilo Origins
     URL Project: http://www.chamilo.org
     Description: Styles main base of Chamilo LMS appearance, works with Bootstrap 4
+    Version: 3.0
     Author:
         alex.aragon@beeznest.com
         angel.quiroz@beeznest.com
         julio.montoya@beeznest.com
         yannick.warnier@beeznest.com
-    Version: 3.0
 */
 
 //@import "~bootstrap/scss/bootstrap";
@@ -26,3 +26,4 @@
 @import '~pretty-checkbox/src/pretty-checkbox.scss';
 @import '~jquery-ui/themes/base/all.css';
 @import "scss/index";
+@import "~jquery-ui-timepicker-addon/dist/jquery-ui-timepicker-addon.css";

+ 2 - 4
assets/js/app.js

@@ -29,8 +29,7 @@ var disconnect_lang = 'ChatDisconnected';
 // Import Vue and Components
 import Vue from 'vue';
 import {VueConfig} from './VueConfig';
-import Example from './components/Example'
-
+import Example from './components/Example';
 
 $(function() {
     // Create App Aplication Vue
@@ -84,6 +83,7 @@ $(function() {
         }
         addMainEvent(window, 'unload', courseLogout ,false);
     }
+
     $("#open-view-list").click(function(){
         $("#student-list-work").fadeIn(300);
     });
@@ -103,8 +103,6 @@ $(function() {
         });
     }
 
-
-
     // Start modals
     // class='ajax' loads a page in a modal
     $('body').on('click', 'a.ajax', function(e) {

+ 1 - 7
assets/js/vendor.js

@@ -25,20 +25,14 @@ require("select2");
 require("timeago");
 require("sweetalert/dist/sweetalert.min");
 require('bootstrap-select/dist/js/bootstrap-select.js');
-
 require("bootstrap-daterangepicker");
 require("fullcalendar/dist/fullcalendar.js");
 require("fullcalendar/dist/gcal.js");
 require("fullcalendar/dist/locale-all.js");
 require("easy-pie-chart/dist/jquery.easypiechart.min");
-
-//require("readmore-js");
+require("jquery-ui-timepicker-addon");
 
 // doesn't work with webpack added directly in /public/libs folder
 /*
-require("pwstrength-bootstrap");
-
-require("js-cookie");
-require("jquery-ui-timepicker-addon");
 require("ckeditor");
 */

+ 4 - 0
package.json

@@ -37,7 +37,9 @@
     "jquery-ui": "^1.12.1",
     "jquery-ui-timepicker-addon": "^1.6.3",
     "jquery.scrollbar": "^0.2.11",
+    "js-cookie": "^2.2.0",
     "jsplumb": "^2.6.9",
+    "linkifyjs": "^2.1.8",
     "mathjax": "^2.7.4",
     "mediaelement": "^4.2.9",
     "moment": "^2.22",
@@ -47,7 +49,9 @@
     "pace-js-amd-fix": "^1.0.5",
     "perfect-scrollbar": "^1.4.0",
     "pretty-checkbox": "^3.0.3",
+    "pwstrength-bootstrap": "^3.0.4",
     "qtip2": "^3.0.3",
+    "readmore-js": "^2.2.1",
     "select2": "^4.0.6-rc.1",
     "sweetalert": "^2.1.2",
     "timeago": "^1.6.7",

+ 0 - 29
public/libs/js-cookie/.bower.json

@@ -1,29 +0,0 @@
-{
-  "name": "js-cookie",
-  "license": "MIT",
-  "main": [
-    "src/js.cookie.js"
-  ],
-  "ignore": [
-    "travis.sh",
-    "test",
-    "Gruntfile.js",
-    "package.json",
-    ".gitignore",
-    ".jshintignore",
-    ".jshintrc",
-    ".tm_properties",
-    ".travis.yml"
-  ],
-  "homepage": "https://github.com/js-cookie/js-cookie",
-  "version": "2.1.4",
-  "_release": "2.1.4",
-  "_resolution": {
-    "type": "version",
-    "tag": "v2.1.4",
-    "commit": "8b70250875f7e07445b6a457f9c2474ead4cba44"
-  },
-  "_source": "https://github.com/js-cookie/js-cookie.git",
-  "_target": "2.1.*",
-  "_originalSource": "js-cookie"
-}

+ 0 - 79
public/libs/js-cookie/CONTRIBUTING.md

@@ -1,79 +0,0 @@
-## Issues
-
-- Report issues or feature requests on [GitHub Issues](https://github.com/js-cookie/js-cookie/issues).
-- If reporting a bug, please add a [simplified example](http://sscce.org/).
-
-## Pull requests
-- Create a new topic branch for every separate change you make.
-- Create a test case if you are fixing a bug or implementing an important feature.
-- Make sure the build runs successfully.
-
-## Development
-
-### Tools
-We use the following tools for development:
-
-- [Qunit](http://qunitjs.com/) for tests.
-- [NodeJS](http://nodejs.org/download/) required to run grunt.
-- [Grunt](http://gruntjs.com/getting-started) for task management.
-
-### Getting started 
-Install [NodeJS](http://nodejs.org/).  
-Install globally grunt-cli using the following command:
-
-    $ npm install -g grunt-cli
-
-Browse to the project root directory and install the dev dependencies:
-
-    $ npm install -d
-
-To execute the build and tests run the following command in the root of the project:
-
-    $ grunt
-
-You should see a green message in the console:
-
-    Done, without errors.
-
-### Tests
-You can also run the tests in the browser.  
-Start a test server from the project root:
-
-    $ grunt connect:tests
-
-This will automatically open the test suite at http://127.0.0.1:10000 in the default browser, with livereload enabled.
-
-_Note: we recommend cleaning all the browser cookies before running the tests, that can avoid false positive failures._
-
-### Automatic build
-You can build automatically after a file change using the following command:
-
-    $ grunt watch
-
-## Integration with server-side
-
-js-cookie allows integrating the encoding test suite with solutions written in other server-side languages. To integrate successfully, the server-side solution need to execute the `test/encoding.html` file in it's integration testing routine with a web automation tool, like [Selenium](http://www.seleniumhq.org/). js-cookie test suite exposes an API to make this happen.
-
-### ?integration_baseurl
-
-Specify the base url to pass the cookies into the server through a query string. If `integration_baseurl` query is not present, then js-cookie will assume there's no server.
-
-### window.global_test_results
-
-After the test suite has finished, js-cookie exposes the global `window.global_test_results` property containing an Object Literal that represents the [QUnit's details](http://api.qunitjs.com/QUnit.done/). js-cookie also adds an additional property representing an Array containing the tests data.
-
-### Handling requests
-
-When js-cookie encoding tests are executed, it will request a url in the server through an iframe representing each test being run. js-cookie expects the server to handle the input and return the proper `Set-Cookie` headers in the response. js-cookie will then read the response and verify if the encoding is consistent with js-cookie default encoding mechanism
-
-js-cookie will send some requests to the server from the baseurl in the format `/encoding?name=<cookie>`, where `<cookie>` represents the cookie-name to be read from the request.
-
-The server should handle those requests, internally parsing the cookie from the request and writing it again. It must set an `application/json` content type containing an object literal in the content body with `name` and `value` keys, each representing the cookie-name and cookie-value decoded by the server-side implementation.
-
-If the server fails to respond with this specification in any request, the related QUnit test will fail. This is to make sure the server-side implementation will always be in sync with js-cookie encoding tests for maximum compatibility.
-
-### Projects using it
-
-This hook is being used in the following projects:
-
-* [Java Cookie](https://github.com/js-cookie/java-cookie).

+ 0 - 20
public/libs/js-cookie/MIT-LICENSE.txt

@@ -1,20 +0,0 @@
-Copyright 2014 Klaus Hartl
-
-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.

+ 0 - 297
public/libs/js-cookie/README.md

@@ -1,297 +0,0 @@
-<p align="center">
-  <img src="https://cloud.githubusercontent.com/assets/835857/14581711/ba623018-0436-11e6-8fce-d2ccd4d379c9.gif">
-</p>
-
-# JavaScript Cookie [![Build Status](https://travis-ci.org/js-cookie/js-cookie.svg?branch=master)](https://travis-ci.org/js-cookie/js-cookie) [![Code Climate](https://codeclimate.com/github/js-cookie/js-cookie.svg)](https://codeclimate.com/github/js-cookie/js-cookie)
-
-A simple, lightweight JavaScript API for handling cookies
-
-* Works in [all](https://saucelabs.com/u/js-cookie) browsers
-* Accepts [any](#encoding) character
-* [Heavily](test) tested
-* No dependency
-* [Unobtrusive](#json) JSON support
-* Supports AMD/CommonJS
-* [RFC 6265](https://tools.ietf.org/html/rfc6265) compliant
-* Useful [Wiki](https://github.com/js-cookie/js-cookie/wiki)
-* Enable [custom encoding/decoding](#converters)
-* **~900 bytes** gzipped!
-
-**If you're viewing this at https://github.com/js-cookie/js-cookie, you're reading the documentation for the master branch.
-[View documentation for the latest release.](https://github.com/js-cookie/js-cookie/tree/latest#readme)**
-
-## Build Status Matrix
-
-[![Selenium Test Status](https://saucelabs.com/browser-matrix/js-cookie.svg)](https://saucelabs.com/u/js-cookie)
-
-## Installation
-
-### Direct download
-
-Download the script [here](https://github.com/js-cookie/js-cookie/blob/latest/src/js.cookie.js) and include it (unless you are packaging scripts somehow else):
-
-```html
-<script src="/path/to/js.cookie.js"></script>
-```
-
-**Do not include the script directly from GitHub (http://raw.github.com/...).** The file is being served as text/plain and as such being blocked
-in Internet Explorer on Windows 7 for instance (because of the wrong MIME type). Bottom line: GitHub is not a CDN.
-
-### Package Managers
-
-JavaScript Cookie supports [npm](https://www.npmjs.com/package/js-cookie) and [Bower](http://bower.io/search/?q=js-cookie) under the name `js-cookie`.
-
-### Module Loaders
-
-JavaScript Cookie can also be loaded as an AMD, CommonJS or [ES6](https://github.com/js-cookie/js-cookie/issues/233#issuecomment-233187386) module.
-
-## Basic Usage
-
-Create a cookie, valid across the entire site:
-
-```javascript
-Cookies.set('name', 'value');
-```
-
-Create a cookie that expires 7 days from now, valid across the entire site:
-
-```javascript
-Cookies.set('name', 'value', { expires: 7 });
-```
-
-Create an expiring cookie, valid to the path of the current page:
-
-```javascript
-Cookies.set('name', 'value', { expires: 7, path: '' });
-```
-
-Read cookie:
-
-```javascript
-Cookies.get('name'); // => 'value'
-Cookies.get('nothing'); // => undefined
-```
-
-Read all visible cookies:
-
-```javascript
-Cookies.get(); // => { name: 'value' }
-```
-
-Delete cookie:
-
-```javascript
-Cookies.remove('name');
-```
-
-Delete a cookie valid to the path of the current page:
-
-```javascript
-Cookies.set('name', 'value', { path: '' });
-Cookies.remove('name'); // fail!
-Cookies.remove('name', { path: '' }); // removed!
-```
-
-*IMPORTANT! when deleting a cookie, you must pass the exact same path and domain attributes that was used to set the cookie, unless you're relying on the [default attributes](#cookie-attributes).*
-
-*Note: Removing unexisting cookie does not raise any exception nor return any value*
-
-## Namespace conflicts
-
-If there is any danger of a conflict with the namespace `Cookies`, the `noConflict` method will allow you to define a new namespace and preserve the original one. This is especially useful when running the script on third party sites e.g. as part of a widget or SDK.
-
-```javascript
-// Assign the js-cookie api to a different variable and restore the original "window.Cookies"
-var Cookies2 = Cookies.noConflict();
-Cookies2.set('name', 'value');
-```
-
-*Note: The `.noConflict` method is not necessary when using AMD or CommonJS, thus it is not exposed in those environments.*
-
-## JSON
-
-js-cookie provides unobtrusive JSON storage for cookies.
-
-When creating a cookie you can pass an Array or Object Literal instead of a string in the value. If you do so, js-cookie will store the string representation of the object according to `JSON.stringify`:
-
-```javascript
-Cookies.set('name', { foo: 'bar' });
-```
-
-When reading a cookie with the default `Cookies.get` api, you receive the string representation stored in the cookie:
-
-```javascript
-Cookies.get('name'); // => '{"foo":"bar"}'
-```
-
-```javascript
-Cookies.get(); // => { name: '{"foo":"bar"}' }
-```
-
-When reading a cookie with the `Cookies.getJSON` api, you receive the parsed representation of the string stored in the cookie according to `JSON.parse`:
-
-```javascript
-Cookies.getJSON('name'); // => { foo: 'bar' }
-```
-
-```javascript
-Cookies.getJSON(); // => { name: { foo: 'bar' } }
-```
-
-*Note: To support IE6-7 ([and IE 8 compatibility mode](http://stackoverflow.com/questions/4715373/json-object-undefined-in-internet-explorer-8)) you need to include the JSON-js polyfill: https://github.com/douglascrockford/JSON-js*
-
-## Encoding
-
-This project is [RFC 6265](http://tools.ietf.org/html/rfc6265#section-4.1.1) compliant. All special characters that are not allowed in the cookie-name or cookie-value are encoded with each one's UTF-8 Hex equivalent using [percent-encoding](http://en.wikipedia.org/wiki/Percent-encoding).  
-The only character in cookie-name or cookie-value that is allowed and still encoded is the percent `%` character, it is escaped in order to interpret percent input as literal.  
-Please note that the default encoding/decoding strategy is meant to be interoperable [only between cookies that are read/written by js-cookie](https://github.com/js-cookie/js-cookie/pull/200#discussion_r63270778). To override the default encoding/decoding strategy you need to use a [converter](#converters).
-
-## Cookie Attributes
-
-Cookie attributes defaults can be set globally by setting properties of the `Cookies.defaults` object or individually for each call to `Cookies.set(...)` by passing a plain object in the last argument. Per-call attributes override the default attributes.
-
-### expires
-
-Define when the cookie will be removed. Value can be a [`Number`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number) which will be interpreted as days from time of creation or a [`Date`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) instance. If omitted, the cookie becomes a session cookie.
-
-To create a cookie that expires in less than a day, you can check the [FAQ on the Wiki](https://github.com/js-cookie/js-cookie/wiki/Frequently-Asked-Questions#expire-cookies-in-less-than-a-day).
-
-**Default:** Cookie is removed when the user closes the browser.
-
-**Examples:**
-
-```javascript
-Cookies.set('name', 'value', { expires: 365 });
-Cookies.get('name'); // => 'value'
-Cookies.remove('name');
-```
-
-### path
-
-A [`String`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) indicating the path where the cookie is visible.
-
-**Default:** `/`
-
-**Examples:**
-
-```javascript
-Cookies.set('name', 'value', { path: '' });
-Cookies.get('name'); // => 'value'
-Cookies.remove('name', { path: '' });
-```
-
-**Note regarding Internet Explorer:**
-
-> Due to an obscure bug in the underlying WinINET InternetGetCookie implementation, IE’s document.cookie will not return a cookie if it was set with a path attribute containing a filename.
-
-(From [Internet Explorer Cookie Internals (FAQ)](http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx))
-
-This means one cannot set a path using `path: window.location.pathname` in case such pathname contains a filename like so: `/check.html` (or at least, such cookie cannot be read correctly).
-
-### domain
-
-A [`String`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) indicating a valid domain where the cookie should be visible. The cookie will also be visible to all subdomains.
-
-**Default:** Cookie is visible only to the domain or subdomain of the page where the cookie was created, except for Internet Explorer (see below).
-
-**Examples:**
-
-Assuming a cookie that is being created on `site.com`:
-
-```javascript
-Cookies.set('name', 'value', { domain: 'subdomain.site.com' });
-Cookies.get('name'); // => undefined (need to read at 'subdomain.site.com')
-```
-
-**Note regarding Internet Explorer default behavior:**
-
-> Q3: If I don’t specify a DOMAIN attribute (for) a cookie, IE sends it to all nested subdomains anyway?  
-> A: Yes, a cookie set on example.com will be sent to sub2.sub1.example.com.  
-> Internet Explorer differs from other browsers in this regard.
-
-(From [Internet Explorer Cookie Internals (FAQ)](http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx))
-
-This means that if you omit the `domain` attribute, it will be visible for a subdomain in IE.
-
-### secure
-
-Either `true` or `false`, indicating if the cookie transmission requires a secure protocol (https).
-
-**Default:** No secure protocol requirement.
-
-**Examples:**
-
-```javascript
-Cookies.set('name', 'value', { secure: true });
-Cookies.get('name'); // => 'value'
-Cookies.remove('name', { secure: true });
-```
-
-## Converters
-
-### Read
-
-Create a new instance of the api that overrides the default decoding implementation.  
-All get methods that rely in a proper decoding to work, such as `Cookies.get()` and `Cookies.get('name')`, will run the converter first for each cookie.  
-The returning String will be used as the cookie value.
-
-Example from reading one of the cookies that can only be decoded using the `escape` function:
-
-```javascript
-document.cookie = 'escaped=%u5317';
-document.cookie = 'default=%E5%8C%97';
-var cookies = Cookies.withConverter(function (value, name) {
-    if ( name === 'escaped' ) {
-        return unescape(value);
-    }
-});
-cookies.get('escaped'); // 北
-cookies.get('default'); // 北
-cookies.get(); // { escaped: '北', default: '北' }
-```
-
-### Write
-
-Create a new instance of the api that overrides the default encoding implementation:
-
-```javascript
-Cookies.withConverter({
-    read: function (value, name) {
-        // Read converter
-    },
-    write: function (value, name) {
-        // Write converter
-    }
-});
-```
-
-## Server-side integration
-
-Check out the [Servers Docs](SERVER_SIDE.md)
-
-## Contributing
-
-Check out the [Contributing Guidelines](CONTRIBUTING.md)
-
-## Security
-
-For vulnerability reports, send an e-mail to `jscookie at gmail dot com`
-
-## Manual release steps
-
-* Increment the "version" attribute of `package.json`
-* Increment the version number in the `src/js.cookie.js` file
-* Commit with the message "Release version x.x.x"
-* Create version tag in git
-* Create a github release and upload the minified file
-* Change the `latest` tag pointer to the latest commit
-  * `git tag -f latest`
-  * `git push <remote> :refs/tags/latest`
-  * `git push origin master --tags`
-* Release on npm
-
-## Authors
-
-* [Klaus Hartl](https://github.com/carhartl)
-* [Fagner Brack](https://github.com/FagnerMartinsBrack)
-* And awesome [contributors](https://github.com/js-cookie/js-cookie/graphs/contributors)

+ 0 - 107
public/libs/js-cookie/SERVER_SIDE.md

@@ -1,107 +0,0 @@
-# Server-side integration
-
-There are some servers that are not compliant with the [RFC 6265](http://tools.ietf.org/html/rfc6265). For those, some characters that are not encoded by JavaScript Cookie might be treated differently.
-
-Here we document the most important server-side peculiarities and their workarounds. Feel free to send a [Pull Request](https://github.com/js-cookie/js-cookie/blob/master/CONTRIBUTING.md#pull-requests) if you see something that can be improved.
-
-*Disclaimer: This documentation is entirely based on community provided information. The examples below should be used only as a reference.*
-
-## PHP
-
-In PHP, `setcookie()` function encodes cookie values using `urlencode()` function, which applies `%`-encoding but also encodes spaces as `+` signs, [for historical reasons](http://php.net/manual/en/function.urlencode.php#function.urlencode). When cookies are read back via `$_COOKIE` or `filter_input(INPUT_COOKIE)`, they would go trough a decoding process which decodes `%`-encoded sequences and also converts `+` signs back to spaces. However, the plus (`+`) sign is valid cookie character by itself, which means that libraries that adhere to standards will interpret `+` signs differently to PHP.
-
-This presents two types of problems:
-
-1. PHP writes a cookie via `setcookie()` and all spaces get converted to `+` signs. JavaScript Cookie read `+` signs and uses them literally, since it is a valid cookie character.
-2. JavaScript Cookie writes a cookie with a value that contains `+` signs and stores it as is, since it is a valid cookie character. PHP read a cookie and converts `+` signs to spaces.
-
-To make both PHP and JavaScript Cookie play nicely together?
-
-**In PHP**, use `setrawcookie()` instead of `setcookie()`:
-
-```php
-setrawcookie($name, rawurlencode($value));
-```
-
-**In JavaScript**, use a custom converter.
-
-**Example**:
-
-```javascript
-var PHPCookies = Cookies.withConverter({
-    write: function (value) {
-        // Encode all characters according to the "encodeURIComponent" spec
-        return encodeURIComponent(value)
-            // Revert the characters that are unnecessarly encoded but are
-            // allowed in a cookie value, except for the plus sign (%2B)
-            .replace(/%(23|24|26|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
-    },
-    read: function (value) {
-        return value
-            // Decode the plus sign to spaces first, otherwise "legit" encoded pluses
-            // will be replaced incorrectly
-            .replace(/\+/g, ' ')
-            // Decode all characters according to the "encodeURIComponent" spec
-            .replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);
-    }
-});
-```
-
-Rack seems to have [a similar problem](https://github.com/js-cookie/js-cookie/issues/70#issuecomment-132503017).
-
-## Tomcat
-
-### Version >= 7.x
-
-It seems that there is a situation where Tomcat does not [read the parens correctly](https://github.com/js-cookie/js-cookie/issues/92#issue-107743407). To fix this you need to write a custom write converter.
-
-**Example**:
-
-```javascript
-var TomcatCookies = Cookies.withConverter({
-  write: function (value) {
-      // Encode all characters according to the "encodeURIComponent" spec
-      return encodeURIComponent(value)
-          // Revert the characters that are unnecessarly encoded but are
-          // allowed in a cookie value
-          .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent)
-          // Encode the parens that are interpreted incorrectly by Tomcat
-          .replace(/[\(\)]/g, escape);
-  }
-});
-```
-
-### Version >= 8.0.15
-
-Since Tomcat 8.0.15, it is possible to configure RFC 6265 compliance by changing your `conf/context.xml` file and adding the new [CookieProcessor](https://tomcat.apache.org/tomcat-8.0-doc/config/cookie-processor.html) nested inside the Context element. It would be like this:
-
-```xml
-<Context>
-  <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"/>
-</context>
-```
-And you're all done.
-
-Alternatively, you can check the [Java Cookie](https://github.com/js-cookie/java-cookie) project, which integrates nicely with JavaScript Cookie.
-
-## JBoss 7.1.1
-
-It seems that the servlet implementation of JBoss 7.1.1 [does not read some characters correctly](https://github.com/js-cookie/js-cookie/issues/70#issuecomment-148944674), even though they are allowed as per [RFC 6265](https://tools.ietf.org/html/rfc6265#section-4.1.1). To fix this you need to write a custom converter to send those characters correctly.
-
-**Example**:
-
-```javascript
-var JBossCookies = Cookies.withConverter({
-    write: function (value) {
-        // Encode all characters according to the "encodeURIComponent" spec
-        return encodeURIComponent(value)
-            // Revert the characters that are unnecessarly encoded but are
-            // allowed in a cookie value
-            .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent)
-            // Encode again the characters that are not allowed in JBoss 7.1.1, like "[" and "]":
-            .replace(/[\[\]]/g, encodeURIComponent);
-    }
-});
-```
-
-Alternatively, you can check the [Java Cookie](https://github.com/js-cookie/java-cookie) project, which integrates nicely with JavaScript Cookie.

+ 0 - 18
public/libs/js-cookie/bower.json

@@ -1,18 +0,0 @@
-{
-  "name": "js-cookie",
-  "license": "MIT",
-  "main": [
-    "src/js.cookie.js"
-  ],
-  "ignore": [
-    "travis.sh",
-    "test",
-    "Gruntfile.js",
-    "package.json",
-    ".gitignore",
-    ".jshintignore",
-    ".jshintrc",
-    ".tm_properties",
-    ".travis.yml"
-  ]
-}

+ 0 - 165
public/libs/js-cookie/src/js.cookie.js

@@ -1,165 +0,0 @@
-/*!
- * JavaScript Cookie v2.1.4
- * https://github.com/js-cookie/js-cookie
- *
- * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
- * Released under the MIT license
- */
-;(function (factory) {
-	var registeredInModuleLoader = false;
-	if (typeof define === 'function' && define.amd) {
-		define(factory);
-		registeredInModuleLoader = true;
-	}
-	if (typeof exports === 'object') {
-		module.exports = factory();
-		registeredInModuleLoader = true;
-	}
-	if (!registeredInModuleLoader) {
-		var OldCookies = window.Cookies;
-		var api = window.Cookies = factory();
-		api.noConflict = function () {
-			window.Cookies = OldCookies;
-			return api;
-		};
-	}
-}(function () {
-	function extend () {
-		var i = 0;
-		var result = {};
-		for (; i < arguments.length; i++) {
-			var attributes = arguments[ i ];
-			for (var key in attributes) {
-				result[key] = attributes[key];
-			}
-		}
-		return result;
-	}
-
-	function init (converter) {
-		function api (key, value, attributes) {
-			var result;
-			if (typeof document === 'undefined') {
-				return;
-			}
-
-			// Write
-
-			if (arguments.length > 1) {
-				attributes = extend({
-					path: '/'
-				}, api.defaults, attributes);
-
-				if (typeof attributes.expires === 'number') {
-					var expires = new Date();
-					expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
-					attributes.expires = expires;
-				}
-
-				// We're using "expires" because "max-age" is not supported by IE
-				attributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';
-
-				try {
-					result = JSON.stringify(value);
-					if (/^[\{\[]/.test(result)) {
-						value = result;
-					}
-				} catch (e) {}
-
-				if (!converter.write) {
-					value = encodeURIComponent(String(value))
-						.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
-				} else {
-					value = converter.write(value, key);
-				}
-
-				key = encodeURIComponent(String(key));
-				key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
-				key = key.replace(/[\(\)]/g, escape);
-
-				var stringifiedAttributes = '';
-
-				for (var attributeName in attributes) {
-					if (!attributes[attributeName]) {
-						continue;
-					}
-					stringifiedAttributes += '; ' + attributeName;
-					if (attributes[attributeName] === true) {
-						continue;
-					}
-					stringifiedAttributes += '=' + attributes[attributeName];
-				}
-				return (document.cookie = key + '=' + value + stringifiedAttributes);
-			}
-
-			// Read
-
-			if (!key) {
-				result = {};
-			}
-
-			// To prevent the for loop in the first place assign an empty array
-			// in case there are no cookies at all. Also prevents odd result when
-			// calling "get()"
-			var cookies = document.cookie ? document.cookie.split('; ') : [];
-			var rdecode = /(%[0-9A-Z]{2})+/g;
-			var i = 0;
-
-			for (; i < cookies.length; i++) {
-				var parts = cookies[i].split('=');
-				var cookie = parts.slice(1).join('=');
-
-				if (cookie.charAt(0) === '"') {
-					cookie = cookie.slice(1, -1);
-				}
-
-				try {
-					var name = parts[0].replace(rdecode, decodeURIComponent);
-					cookie = converter.read ?
-						converter.read(cookie, name) : converter(cookie, name) ||
-						cookie.replace(rdecode, decodeURIComponent);
-
-					if (this.json) {
-						try {
-							cookie = JSON.parse(cookie);
-						} catch (e) {}
-					}
-
-					if (key === name) {
-						result = cookie;
-						break;
-					}
-
-					if (!key) {
-						result[name] = cookie;
-					}
-				} catch (e) {}
-			}
-
-			return result;
-		}
-
-		api.set = api;
-		api.get = function (key) {
-			return api.call(api, key);
-		};
-		api.getJSON = function () {
-			return api.apply({
-				json: true
-			}, [].slice.call(arguments));
-		};
-		api.defaults = {};
-
-		api.remove = function (key, attributes) {
-			api(key, '', extend(attributes, {
-				expires: -1
-			}));
-		};
-
-		api.withConverter = init;
-
-		return api;
-	}
-
-	return init(function () {});
-}));

+ 0 - 976
public/libs/pwstrength-bootstrap/dist/pwstrength-bootstrap.js

@@ -1,976 +0,0 @@
-/*!
-* jQuery Password Strength plugin for Twitter Bootstrap
-* Version: 2.2.1
-*
-* Copyright (c) 2008-2013 Tane Piper
-* Copyright (c) 2013 Alejandro Blanco
-* Dual licensed under the MIT and GPL licenses.
-*/
-
-(function (jQuery) {
-// Source: src/i18n.js
-
-
-
-
-var i18n = {};
-
-(function (i18n, i18next) {
-    'use strict';
-
-    i18n.fallback = {
-        "wordMinLength": "Your password is too short",
-        "wordMaxLength": "Your password is too long",
-        "wordInvalidChar": "Your password contains an invalid character",
-        "wordNotEmail": "Do not use your email as your password",
-        "wordSimilarToUsername": "Your password cannot contain your username",
-        "wordTwoCharacterClasses": "Use different character classes",
-        "wordRepetitions": "Too many repetitions",
-        "wordSequences": "Your password contains sequences",
-        "errorList": "Errors:",
-        "veryWeak": "Very Weak",
-        "weak": "Weak",
-        "normal": "Normal",
-        "medium": "Medium",
-        "strong": "Strong",
-        "veryStrong": "Very Strong"
-    };
-
-    i18n.t = function (key) {
-        var result = '';
-
-        // Try to use i18next.com
-        if (i18next) {
-            result = i18next.t(key);
-        } else {
-            // Fallback to english
-            result = i18n.fallback[key];
-        }
-
-        return result === key ? '' : result;
-    };
-}(i18n, window.i18next));
-
-// Source: src/rules.js
-
-
-
-
-var rulesEngine = {};
-
-try {
-    if (!jQuery && module && module.exports) {
-        var jQuery = require("jquery"),
-            jsdom = require("jsdom").jsdom;
-        jQuery = jQuery(jsdom().defaultView);
-    }
-} catch (ignore) {}
-
-(function ($, rulesEngine) {
-    "use strict";
-    var validation = {};
-
-    rulesEngine.forbiddenSequences = [
-        "0123456789", "abcdefghijklmnopqrstuvwxyz", "qwertyuiop", "asdfghjkl",
-        "zxcvbnm", "!@#$%^&*()_+"
-    ];
-
-    validation.wordNotEmail = function (options, word, score) {
-        if (word.match(/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i)) {
-            return score;
-        }
-        return 0;
-    };
-
-    validation.wordMinLength = function (options, word, score) {
-        var wordlen = word.length,
-            lenScore = Math.pow(wordlen, options.rules.raisePower);
-        if (wordlen < options.common.minChar) {
-            lenScore = (lenScore + score);
-        }
-        return lenScore;
-    };
-
-    validation.wordMaxLength = function (options, word, score) {
-        var wordlen = word.length,
-            lenScore = Math.pow(wordlen, options.rules.raisePower);
-        if (wordlen > options.common.maxChar) {
-            return score;
-        }
-        return lenScore;
-    };
-
-    validation.wordInvalidChar = function (options, word, score) {
-        if (options.common.invalidCharsRegExp.test(word)) {
-            return score;
-        }
-        return 0;
-    };
-
-    validation.wordMinLengthStaticScore = function (options, word, score) {
-        return word.length < options.common.minChar ? 0 : score;
-    };
-
-    validation.wordMaxLengthStaticScore = function (options, word, score) {
-        return word.length > options.common.maxChar ? 0 : score;
-    };
-
-
-    validation.wordSimilarToUsername = function (options, word, score) {
-        var username = $(options.common.usernameField).val();
-        if (username && word.toLowerCase().match(username.replace(/[\-\[\]\/\{\}\(\)\*\+\=\?\:\.\\\^\$\|\!\,]/g, "\\$&").toLowerCase())) {
-            return score;
-        }
-        return 0;
-    };
-
-    validation.wordTwoCharacterClasses = function (options, word, score) {
-        if (word.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/) ||
-                (word.match(/([a-zA-Z])/) && word.match(/([0-9])/)) ||
-                (word.match(/(.[!,@,#,$,%,\^,&,*,?,_,~])/) && word.match(/[a-zA-Z0-9_]/))) {
-            return score;
-        }
-        return 0;
-    };
-
-    validation.wordRepetitions = function (options, word, score) {
-        if (word.match(/(.)\1\1/)) { return score; }
-        return 0;
-    };
-
-    validation.wordSequences = function (options, word, score) {
-        var found = false,
-            j;
-        if (word.length > 2) {
-            $.each(rulesEngine.forbiddenSequences, function (idx, seq) {
-                if (found) { return; }
-                var sequences = [seq, seq.split('').reverse().join('')];
-                $.each(sequences, function (idx, sequence) {
-                    for (j = 0; j < (word.length - 2); j += 1) { // iterate the word trough a sliding window of size 3:
-                        if (sequence.indexOf(word.toLowerCase().substring(j, j + 3)) > -1) {
-                            found = true;
-                        }
-                    }
-                });
-            });
-            if (found) { return score; }
-        }
-        return 0;
-    };
-
-    validation.wordLowercase = function (options, word, score) {
-        return word.match(/[a-z]/) && score;
-    };
-
-    validation.wordUppercase = function (options, word, score) {
-        return word.match(/[A-Z]/) && score;
-    };
-
-    validation.wordOneNumber = function (options, word, score) {
-        return word.match(/\d+/) && score;
-    };
-
-    validation.wordThreeNumbers = function (options, word, score) {
-        return word.match(/(.*[0-9].*[0-9].*[0-9])/) && score;
-    };
-
-    validation.wordOneSpecialChar = function (options, word, score) {
-        return word.match(/[!,@,#,$,%,\^,&,*,?,_,~]/) && score;
-    };
-
-    validation.wordTwoSpecialChar = function (options, word, score) {
-        return word.match(/(.*[!,@,#,$,%,\^,&,*,?,_,~].*[!,@,#,$,%,\^,&,*,?,_,~])/) && score;
-    };
-
-    validation.wordUpperLowerCombo = function (options, word, score) {
-        return word.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/) && score;
-    };
-
-    validation.wordLetterNumberCombo = function (options, word, score) {
-        return word.match(/([a-zA-Z])/) && word.match(/([0-9])/) && score;
-    };
-
-    validation.wordLetterNumberCharCombo = function (options, word, score) {
-        return word.match(/([a-zA-Z0-9].*[!,@,#,$,%,\^,&,*,?,_,~])|([!,@,#,$,%,\^,&,*,?,_,~].*[a-zA-Z0-9])/) && score;
-    };
-
-    validation.wordIsACommonPassword = function (options, word, score) {
-        if ($.inArray(word, options.rules.commonPasswords) >= 0) {
-            return score;
-        }
-        return 0;
-    };
-
-    rulesEngine.validation = validation;
-
-    rulesEngine.executeRules = function (options, word) {
-        var totalScore = 0;
-
-        $.each(options.rules.activated, function (rule, active) {
-            if (active) {
-                var score = options.rules.scores[rule],
-                    funct = rulesEngine.validation[rule],
-                    result,
-                    errorMessage;
-
-                if (!$.isFunction(funct)) {
-                    funct = options.rules.extra[rule];
-                }
-
-                if ($.isFunction(funct)) {
-                    result = funct(options, word, score);
-                    if (result) {
-                        totalScore += result;
-                    }
-                    if (result < 0 || (!$.isNumeric(result) && !result)) {
-                        errorMessage = options.ui.spanError(options, rule);
-                        if (errorMessage.length > 0) {
-                            options.instances.errors.push(errorMessage);
-                        }
-                    }
-                }
-            }
-        });
-
-        return totalScore;
-    };
-}(jQuery, rulesEngine));
-
-try {
-    if (module && module.exports) {
-        module.exports = rulesEngine;
-    }
-} catch (ignore) {}
-
-// Source: src/options.js
-
-
-
-
-var defaultOptions = {};
-
-defaultOptions.common = {};
-defaultOptions.common.minChar = 6;
-defaultOptions.common.maxChar = 20;
-defaultOptions.common.usernameField = "#username";
-defaultOptions.common.invalidCharsRegExp = new RegExp(/[\s,'"]/);
-defaultOptions.common.userInputs = [
-    // Selectors for input fields with user input
-];
-defaultOptions.common.onLoad = undefined;
-defaultOptions.common.onKeyUp = undefined;
-defaultOptions.common.onScore = undefined;
-defaultOptions.common.zxcvbn = false;
-defaultOptions.common.zxcvbnTerms = [
-    // List of disrecommended words
-];
-defaultOptions.common.events = ["keyup", "change", "paste"];
-defaultOptions.common.debug = false;
-
-defaultOptions.rules = {};
-defaultOptions.rules.extra = {};
-defaultOptions.rules.scores = {
-    wordNotEmail: -100,
-    wordMinLength: -50,
-    wordMaxLength: -50,
-    wordInvalidChar: -100,
-    wordSimilarToUsername: -100,
-    wordSequences: -20,
-    wordTwoCharacterClasses: 2,
-    wordRepetitions: -25,
-    wordLowercase: 1,
-    wordUppercase: 3,
-    wordOneNumber: 3,
-    wordThreeNumbers: 5,
-    wordOneSpecialChar: 3,
-    wordTwoSpecialChar: 5,
-    wordUpperLowerCombo: 2,
-    wordLetterNumberCombo: 2,
-    wordLetterNumberCharCombo: 2,
-    wordIsACommonPassword: -100
-};
-defaultOptions.rules.activated = {
-    wordNotEmail: true,
-    wordMinLength: true,
-    wordMaxLength: false,
-    wordInvalidChar: false,
-    wordSimilarToUsername: true,
-    wordSequences: true,
-    wordTwoCharacterClasses: true,
-    wordRepetitions: true,
-    wordLowercase: true,
-    wordUppercase: true,
-    wordOneNumber: true,
-    wordThreeNumbers: true,
-    wordOneSpecialChar: true,
-    wordTwoSpecialChar: true,
-    wordUpperLowerCombo: true,
-    wordLetterNumberCombo: true,
-    wordLetterNumberCharCombo: true,
-    wordIsACommonPassword: true
-};
-defaultOptions.rules.raisePower = 1.4;
-// List taken from https://github.com/danielmiessler/SecLists (MIT License)
-defaultOptions.rules.commonPasswords = [
-    '123456',
-    'password',
-    '12345678',
-    'qwerty',
-    '123456789',
-    '12345',
-    '1234',
-    '111111',
-    '1234567',
-    'dragon',
-    '123123',
-    'baseball',
-    'abc123',
-    'football',
-    'monkey',
-    'letmein',
-    '696969',
-    'shadow',
-    'master',
-    '666666',
-    'qwertyuiop',
-    '123321',
-    'mustang',
-    '1234567890',
-    'michael',
-    '654321',
-    'pussy',
-    'superman',
-    '1qaz2wsx',
-    '7777777',
-    'fuckyou',
-    '121212',
-    '000000',
-    'qazwsx',
-    '123qwe',
-    'killer',
-    'trustno1',
-    'jordan',
-    'jennifer',
-    'zxcvbnm',
-    'asdfgh',
-    'hunter',
-    'buster',
-    'soccer',
-    'harley',
-    'batman',
-    'andrew',
-    'tigger',
-    'sunshine',
-    'iloveyou',
-    'fuckme',
-    '2000',
-    'charlie',
-    'robert',
-    'thomas',
-    'hockey',
-    'ranger',
-    'daniel',
-    'starwars',
-    'klaster',
-    '112233',
-    'george',
-    'asshole',
-    'computer',
-    'michelle',
-    'jessica',
-    'pepper',
-    '1111',
-    'zxcvbn',
-    '555555',
-    '11111111',
-    '131313',
-    'freedom',
-    '777777',
-    'pass',
-    'fuck',
-    'maggie',
-    '159753',
-    'aaaaaa',
-    'ginger',
-    'princess',
-    'joshua',
-    'cheese',
-    'amanda',
-    'summer',
-    'love',
-    'ashley',
-    '6969',
-    'nicole',
-    'chelsea',
-    'biteme',
-    'matthew',
-    'access',
-    'yankees',
-    '987654321',
-    'dallas',
-    'austin',
-    'thunder',
-    'taylor',
-    'matrix'
-];
-
-defaultOptions.ui = {};
-defaultOptions.ui.bootstrap2 = false;
-defaultOptions.ui.bootstrap4 = false;
-defaultOptions.ui.colorClasses = [
-    "danger", "danger", "danger", "warning", "warning", "success"
-];
-defaultOptions.ui.showProgressBar = true;
-defaultOptions.ui.progressBarEmptyPercentage = 1;
-defaultOptions.ui.progressBarMinPercentage = 1;
-defaultOptions.ui.progressExtraCssClasses = '';
-defaultOptions.ui.progressBarExtraCssClasses = '';
-defaultOptions.ui.showPopover = false;
-defaultOptions.ui.popoverPlacement = "bottom";
-defaultOptions.ui.showStatus = false;
-defaultOptions.ui.spanError = function (options, key) {
-    "use strict";
-    var text = options.i18n.t(key);
-    if (!text) { return ''; }
-    return '<span style="color: #d52929">' + text + '</span>';
-};
-defaultOptions.ui.popoverError = function (options) {
-    "use strict";
-    var errors = options.instances.errors,
-        errorsTitle = options.i18n.t("errorList"),
-        message = "<div>" + errorsTitle + "<ul class='error-list' style='margin-bottom: 0;'>";
-
-    jQuery.each(errors, function (idx, err) {
-        message += "<li>" + err + "</li>";
-    });
-    message += "</ul></div>";
-    return message;
-};
-defaultOptions.ui.showVerdicts = true;
-defaultOptions.ui.showVerdictsInsideProgressBar = false;
-defaultOptions.ui.useVerdictCssClass = false;
-defaultOptions.ui.showErrors = false;
-defaultOptions.ui.showScore = false;
-defaultOptions.ui.container = undefined;
-defaultOptions.ui.viewports = {
-    progress: undefined,
-    verdict: undefined,
-    errors: undefined,
-    score: undefined
-};
-defaultOptions.ui.scores = [0, 14, 26, 38, 50];
-
-defaultOptions.i18n = {};
-defaultOptions.i18n.t = i18n.t;
-
-// Source: src/ui.js
-
-
-
-
-var ui = {};
-
-(function ($, ui) {
-    "use strict";
-
-    var statusClasses = ["error", "warning", "success"],
-        verdictKeys = [
-            "veryWeak", "weak", "normal", "medium", "strong", "veryStrong"
-        ];
-
-    ui.getContainer = function (options, $el) {
-        var $container;
-
-        $container = $(options.ui.container);
-        if (!($container && $container.length === 1)) {
-            $container = $el.parent();
-        }
-        return $container;
-    };
-
-    ui.findElement = function ($container, viewport, cssSelector) {
-        if (viewport) {
-            return $container.find(viewport).find(cssSelector);
-        }
-        return $container.find(cssSelector);
-    };
-
-    ui.getUIElements = function (options, $el) {
-        var $container, result;
-
-        if (options.instances.viewports) {
-            return options.instances.viewports;
-        }
-
-        $container = ui.getContainer(options, $el);
-
-        result = {};
-        result.$progressbar = ui.findElement($container, options.ui.viewports.progress, "div.progress");
-        if (options.ui.showVerdictsInsideProgressBar) {
-            result.$verdict = result.$progressbar.find("span.password-verdict");
-        }
-
-        if (!options.ui.showPopover) {
-            if (!options.ui.showVerdictsInsideProgressBar) {
-                result.$verdict = ui.findElement($container, options.ui.viewports.verdict, "span.password-verdict");
-            }
-            result.$errors = ui.findElement($container, options.ui.viewports.errors, "ul.error-list");
-        }
-        result.$score = ui.findElement($container, options.ui.viewports.score,
-                                       "span.password-score");
-
-        options.instances.viewports = result;
-        return result;
-    };
-
-    ui.initProgressBar = function (options, $el) {
-        var $container = ui.getContainer(options, $el),
-            progressbar = "<div class='progress ";
-
-        if (options.ui.bootstrap2) {
-            // Boostrap 2
-            progressbar += options.ui.progressBarExtraCssClasses +
-                "'><div class='";
-        } else {
-            // Bootstrap 3 & 4
-            progressbar += options.ui.progressExtraCssClasses + "'><div class='" +
-                options.ui.progressBarExtraCssClasses + " progress-";
-        }
-        progressbar += "bar'>";
-
-        if (options.ui.showVerdictsInsideProgressBar) {
-            progressbar += "<span class='password-verdict'></span>";
-        }
-
-        progressbar += "</div></div>";
-
-        if (options.ui.viewports.progress) {
-            $container.find(options.ui.viewports.progress).append(progressbar);
-        } else {
-            $(progressbar).insertAfter($el);
-        }
-    };
-
-    ui.initHelper = function (options, $el, html, viewport) {
-        var $container = ui.getContainer(options, $el);
-        if (viewport) {
-            $container.find(viewport).append(html);
-        } else {
-            $(html).insertAfter($el);
-        }
-    };
-
-    ui.initVerdict = function (options, $el) {
-        ui.initHelper(options, $el, "<span class='password-verdict'></span>",
-                      options.ui.viewports.verdict);
-    };
-
-    ui.initErrorList = function (options, $el) {
-        ui.initHelper(options, $el, "<ul class='error-list'></ul>",
-                      options.ui.viewports.errors);
-    };
-
-    ui.initScore = function (options, $el) {
-        ui.initHelper(options, $el, "<span class='password-score'></span>",
-                      options.ui.viewports.score);
-    };
-
-    ui.initPopover = function (options, $el) {
-        $el.popover("destroy");
-        $el.popover({
-            html: true,
-            placement: options.ui.popoverPlacement,
-            trigger: "manual",
-            content: " "
-        });
-    };
-
-    ui.initUI = function (options, $el) {
-        if (options.ui.showPopover) {
-            ui.initPopover(options, $el);
-        } else {
-            if (options.ui.showErrors) { ui.initErrorList(options, $el); }
-            if (options.ui.showVerdicts && !options.ui.showVerdictsInsideProgressBar) {
-                ui.initVerdict(options, $el);
-            }
-        }
-        if (options.ui.showProgressBar) {
-            ui.initProgressBar(options, $el);
-        }
-        if (options.ui.showScore) {
-            ui.initScore(options, $el);
-        }
-    };
-
-    ui.updateProgressBar = function (options, $el, cssClass, percentage) {
-        var $progressbar = ui.getUIElements(options, $el).$progressbar,
-            $bar = $progressbar.find(".progress-bar"),
-            cssPrefix = "progress-";
-
-        if (options.ui.bootstrap2) {
-            $bar = $progressbar.find(".bar");
-            cssPrefix = "";
-        }
-
-        $.each(options.ui.colorClasses, function (idx, value) {
-            if (options.ui.bootstrap4) {
-                $bar.removeClass("bg-" + value);
-            } else {
-                $bar.removeClass(cssPrefix + "bar-" + value);
-            }
-        });
-        if (options.ui.bootstrap4) {
-            $bar.addClass("bg-" + options.ui.colorClasses[cssClass]);
-        } else {
-            $bar.addClass(cssPrefix + "bar-" + options.ui.colorClasses[cssClass]);
-        }
-        $bar.css("width", percentage + '%');
-    };
-
-    ui.updateVerdict = function (options, $el, cssClass, text) {
-        var $verdict = ui.getUIElements(options, $el).$verdict;
-        $verdict.removeClass(options.ui.colorClasses.join(' '));
-        if (cssClass > -1) {
-            $verdict.addClass(options.ui.colorClasses[cssClass]);
-        }
-        if (options.ui.showVerdictsInsideProgressBar) {
-            $verdict.css('white-space', 'nowrap');
-        }
-        $verdict.html(text);
-    };
-
-    ui.updateErrors = function (options, $el, remove) {
-        var $errors = ui.getUIElements(options, $el).$errors,
-            html = "";
-
-        if (!remove) {
-            $.each(options.instances.errors, function (idx, err) {
-                html += "<li>" + err + "</li>";
-            });
-        }
-        $errors.html(html);
-    };
-
-    ui.updateScore = function (options, $el, score, remove) {
-        var $score = ui.getUIElements(options, $el).$score,
-            html = "";
-
-        if (!remove) { html = score.toFixed(2); }
-        $score.html(html);
-    };
-
-    ui.updatePopover = function (options, $el, verdictText, remove) {
-        var popover = $el.data("bs.popover"),
-            html = "",
-            hide = true;
-
-        if (options.ui.showVerdicts &&
-                !options.ui.showVerdictsInsideProgressBar &&
-                verdictText.length > 0) {
-            html = "<h5><span class='password-verdict'>" + verdictText +
-                "</span></h5>";
-            hide = false;
-        }
-        if (options.ui.showErrors) {
-            if (options.instances.errors.length > 0) {
-                hide = false;
-            }
-            html += options.ui.popoverError(options);
-        }
-
-        if (hide || remove) {
-            $el.popover("hide");
-            return;
-        }
-
-        if (options.ui.bootstrap2) { popover = $el.data("popover"); }
-
-        if (popover.$arrow && popover.$arrow.parents("body").length > 0) {
-            $el.find("+ .popover .popover-content").html(html);
-        } else {
-            // It's hidden
-            popover.options.content = html;
-            $el.popover("show");
-        }
-    };
-
-    ui.updateFieldStatus = function (options, $el, cssClass, remove) {
-        var targetClass = options.ui.bootstrap2 ? ".control-group" : ".form-group",
-            $container = $el.parents(targetClass).first();
-
-        $.each(statusClasses, function (idx, css) {
-            if (!options.ui.bootstrap2) { css = "has-" + css; }
-            $container.removeClass(css);
-        });
-
-        if (remove) { return; }
-
-        cssClass = statusClasses[Math.floor(cssClass / 2)];
-        if (!options.ui.bootstrap2) { cssClass = "has-" + cssClass; }
-        $container.addClass(cssClass);
-    };
-
-    ui.percentage = function (options, score, maximun) {
-        var result = Math.floor(100 * score / maximun),
-            min = options.ui.progressBarMinPercentage;
-
-        result = result <= min ? min : result;
-        result = result > 100 ? 100 : result;
-        return result;
-    };
-
-    ui.getVerdictAndCssClass = function (options, score) {
-        var level, verdict;
-
-        if (score === undefined) { return ['', 0]; }
-
-        if (score <= options.ui.scores[0]) {
-            level = 0;
-        } else if (score < options.ui.scores[1]) {
-            level = 1;
-        } else if (score < options.ui.scores[2]) {
-            level = 2;
-        } else if (score < options.ui.scores[3]) {
-            level = 3;
-        } else if (score < options.ui.scores[4]) {
-            level = 4;
-        } else {
-            level = 5;
-        }
-
-        verdict = verdictKeys[level];
-
-        return [options.i18n.t(verdict), level];
-    };
-
-    ui.updateUI = function (options, $el, score) {
-        var cssClass, barPercentage, verdictText, verdictCssClass;
-
-        cssClass = ui.getVerdictAndCssClass(options, score);
-        verdictText = score === 0 ? '' : cssClass[0];
-        cssClass = cssClass[1];
-        verdictCssClass = options.ui.useVerdictCssClass ? cssClass : -1;
-
-        if (options.ui.showProgressBar) {
-            if (score === undefined) {
-                barPercentage = options.ui.progressBarEmptyPercentage;
-            } else {
-                barPercentage = ui.percentage(options, score, options.ui.scores[4]);
-            }
-            ui.updateProgressBar(options, $el, cssClass, barPercentage);
-            if (options.ui.showVerdictsInsideProgressBar) {
-                ui.updateVerdict(options, $el, verdictCssClass, verdictText);
-            }
-        }
-
-        if (options.ui.showStatus) {
-            ui.updateFieldStatus(options, $el, cssClass, score === undefined);
-        }
-
-        if (options.ui.showPopover) {
-            ui.updatePopover(options, $el, verdictText, score === undefined);
-        } else {
-            if (options.ui.showVerdicts && !options.ui.showVerdictsInsideProgressBar) {
-                ui.updateVerdict(options, $el, verdictCssClass, verdictText);
-            }
-            if (options.ui.showErrors) {
-                ui.updateErrors(options, $el, score === undefined);
-            }
-        }
-
-        if (options.ui.showScore) {
-            ui.updateScore(options, $el, score, score === undefined);
-        }
-    };
-}(jQuery, ui));
-
-// Source: src/methods.js
-
-
-
-
-var methods = {};
-
-(function ($, methods) {
-    "use strict";
-    var onKeyUp, onPaste, applyToAll;
-
-    onKeyUp = function (event) {
-        var $el = $(event.target),
-            options = $el.data("pwstrength-bootstrap"),
-            word = $el.val(),
-            userInputs,
-            verdictText,
-            verdictLevel,
-            score;
-
-        if (options === undefined) { return; }
-
-        options.instances.errors = [];
-        if (word.length === 0) {
-            score = undefined;
-        } else {
-            if (options.common.zxcvbn) {
-                userInputs = [];
-                $.each(options.common.userInputs.concat([options.common.usernameField]), function (idx, selector) {
-                    var value = $(selector).val();
-                    if (value) { userInputs.push(value); }
-                });
-                userInputs = userInputs.concat(options.common.zxcvbnTerms);
-                score = zxcvbn(word, userInputs).guesses;
-                score = Math.log(score) * Math.LOG2E;
-            } else {
-                score = rulesEngine.executeRules(options, word);
-            }
-            if ($.isFunction(options.common.onScore)) {
-                score = options.common.onScore(options, word, score);
-            }
-        }
-        ui.updateUI(options, $el, score);
-        verdictText = ui.getVerdictAndCssClass(options, score);
-        verdictLevel = verdictText[1];
-        verdictText = verdictText[0];
-
-        if (options.common.debug) {
-            console.log(score + ' - ' + verdictText);
-        }
-
-        if ($.isFunction(options.common.onKeyUp)) {
-            options.common.onKeyUp(event, {
-                score: score,
-                verdictText: verdictText,
-                verdictLevel: verdictLevel
-            });
-        }
-    };
-
-    onPaste = function (event) {
-        // This handler is necessary because the paste event fires before the
-        // content is actually in the input, so we cannot read its value right
-        // away. Therefore, the timeouts.
-        var $el = $(event.target),
-            word = $el.val(),
-            tries = 0,
-            callback;
-
-        callback = function () {
-            var newWord = $el.val();
-
-            if (newWord !== word) {
-                onKeyUp(event);
-            } else if (tries < 3) {
-                tries += 1;
-                setTimeout(callback, 100);
-            }
-        };
-
-        setTimeout(callback, 100);
-    };
-
-    methods.init = function (settings) {
-        this.each(function (idx, el) {
-            // Make it deep extend (first param) so it extends also the
-            // rules and other inside objects
-            var clonedDefaults = $.extend(true, {}, defaultOptions),
-                localOptions = $.extend(true, clonedDefaults, settings),
-                $el = $(el);
-
-            localOptions.instances = {};
-            $el.data("pwstrength-bootstrap", localOptions);
-
-            $.each(localOptions.common.events, function (idx, eventName) {
-                var handler = eventName === "paste" ? onPaste : onKeyUp;
-                $el.on(eventName, handler);
-            });
-
-            ui.initUI(localOptions, $el);
-            $el.trigger("keyup");
-
-            if ($.isFunction(localOptions.common.onLoad)) {
-                localOptions.common.onLoad();
-            }
-        });
-
-        return this;
-    };
-
-    methods.destroy = function () {
-        this.each(function (idx, el) {
-            var $el = $(el),
-                options = $el.data("pwstrength-bootstrap"),
-                elements = ui.getUIElements(options, $el);
-            elements.$progressbar.remove();
-            elements.$verdict.remove();
-            elements.$errors.remove();
-            $el.removeData("pwstrength-bootstrap");
-        });
-    };
-
-    methods.forceUpdate = function () {
-        this.each(function (idx, el) {
-            var event = { target: el };
-            onKeyUp(event);
-        });
-    };
-
-    methods.addRule = function (name, method, score, active) {
-        this.each(function (idx, el) {
-            var options = $(el).data("pwstrength-bootstrap");
-
-            options.rules.activated[name] = active;
-            options.rules.scores[name] = score;
-            options.rules.extra[name] = method;
-        });
-    };
-
-    applyToAll = function (rule, prop, value) {
-        this.each(function (idx, el) {
-            $(el).data("pwstrength-bootstrap").rules[prop][rule] = value;
-        });
-    };
-
-    methods.changeScore = function (rule, score) {
-        applyToAll.call(this, rule, "scores", score);
-    };
-
-    methods.ruleActive = function (rule, active) {
-        applyToAll.call(this, rule, "activated", active);
-    };
-
-    methods.ruleIsMet = function (rule) {
-        if ($.isFunction(rulesEngine.validation[rule])) {
-            if (rule === "wordMinLength") {
-                rule = "wordMinLengthStaticScore";
-            } else if (rule === "wordMaxLength") {
-                rule = "wordMaxLengthStaticScore";
-            }
-
-            var rulesMetCnt = 0;
-
-            this.each(function (idx, el) {
-                var options = $(el).data("pwstrength-bootstrap");
-
-                rulesMetCnt += rulesEngine.validation[rule](options, $(el).val(), 1);
-            });
-
-            return (rulesMetCnt === this.length);
-        }
-
-        $.error("Rule " + rule + " does not exist on jQuery.pwstrength-bootstrap.validation");
-    };
-
-    $.fn.pwstrength = function (method) {
-        var result;
-
-        if (methods[method]) {
-            result = methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
-        } else if (typeof method === "object" || !method) {
-            result = methods.init.apply(this, arguments);
-        } else {
-            $.error("Method " +  method + " does not exist on jQuery.pwstrength-bootstrap");
-        }
-
-        return result;
-    };
-}(jQuery, methods));
-}(jQuery));

File diff suppressed because it is too large
+ 0 - 2
public/libs/pwstrength-bootstrap/dist/pwstrength-bootstrap.min.js


File diff suppressed because it is too large
+ 0 - 0
public/libs/pwstrength-bootstrap/dist/pwstrength-bootstrap.min.map


+ 0 - 17
public/libs/pwstrength-bootstrap/locales/de.json

@@ -1,17 +0,0 @@
-{
-    "wordMinLength": "Das Passwort ist zu kurz",
-    "wordMaxLength": "Das Passwort ist zu lang",
-    "wordInvalidChar": "Das Passwort enthält ein ungültiges Zeichen",
-    "wordNotEmail": "Das Passwort darf die E-Mail Adresse nicht enthalten",
-    "wordSimilarToUsername": "Das Passwort darf den Benutzernamen nicht enthalten",
-    "wordTwoCharacterClasses": "Bitte Buchstaben und Ziffern verwenden",
-    "wordRepetitions": "Zu viele Wiederholungen",
-    "wordSequences": "Das Passwort enthält Buchstabensequenzen",
-    "errorList": "Fehler:",
-    "veryWeak": "Sehr schwach",
-    "weak": "Schwach",
-    "normal": "Normal",
-    "medium": "Mittel",
-    "strong": "Stark",
-    "veryStrong": "Sehr stark"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/el.json

@@ -1,17 +0,0 @@
-{
-    "wordMinLength": "Ο κωδικός πρόσβασης δεν έχει τον ελάχιστο αριθμό χαρακτήρων",
-    "wordMaxLength": "Ο κωδικός πρόσβασής σας είναι πολύ μεγάλος",
-    "wordInvalidChar": "Ο κωδικός πρόσβασής σας περιέχει έναν μη έγκυρο χαρακτήρα",
-    "wordNotEmail": "Μη χρησιμοποιείτε το email ως κωδικό",
-    "wordSimilarToUsername": "Ο κωδικός πρόσβασης δεν πρέπει να περιέχει το username",
-    "wordTwoCharacterClasses": "Χρησιμοποιήστε διαφορετικές κλάσεις χαρακτήρων",
-    "wordRepetitions": "Πολλές επαναλήψεις",
-    "wordSequences": "Ο κωδικός πρόσβασης περιέχει επαναλήψεις",
-    "errorList": "Σφάλματα:",
-    "veryWeak": "Πολύ Αδύνατος",
-    "weak": "Αδύνατος",
-    "normal": "Κανονικός",
-    "medium": "Μέτριος",
-    "strong": "Δυνατός",
-    "veryStrong": "Πολύ Δυνατός"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/en.json

@@ -1,17 +0,0 @@
-{
-    "wordMinLength": "Your password is too short",
-    "wordMaxLength": "Your password is too long",
-    "wordInvalidChar": "Your password contains an invalid character",
-    "wordNotEmail": "Do not use your email as your password",
-    "wordSimilarToUsername": "Your password cannot contain your username",
-    "wordTwoCharacterClasses": "Use different character classes",
-    "wordRepetitions": "Too many repetitions",
-    "wordSequences": "Your password contains sequences",
-    "errorList": "Errors:",
-    "veryWeak": "Very Weak",
-    "weak": "Weak",
-    "normal": "Normal",
-    "medium": "Medium",
-    "strong": "Strong",
-    "veryStrong": "Very Strong"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/eo.json

@@ -1,17 +0,0 @@
-{
-    "wordMinLength": "Via pasvorto estas tro mallonga",
-    "wordMaxLength": "Via pasvorto estas tro longa",
-    "wordInvalidChar": "Via pasvorto enhavas nevalidan karaktero",
-    "wordNotEmail": "Ne uzu vian retpoŝtadreson kiel la pasvorton",
-    "wordSimilarToUsername": "Via pasvorto enhavas vian uzanto-nomon",
-    "wordTwoCharacterClasses": "Uzu signojn de diversaj tipoj (ekz., literoj kaj ciferoj)",
-    "wordRepetitions": "Tro multaj ripetiĝantaj signoj",
-    "wordSequences": "Via pasvorto enhavas simplan sinsekvon de signoj",
-    "errorList": "Eraroj:",
-    "veryWeak": "Trosimpla",
-    "weak": "Malforta",
-    "normal": "Mezforta",
-    "medium": "Akceptebla",
-    "strong": "Forta",
-    "veryStrong": "Elstare Forta"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/es.json

@@ -1,17 +0,0 @@
-{
-    "wordMinLength": "Tu contraseña es demasiado corta",
-    "wordMaxLength": "Tu contraseña es muy larga",
-    "wordInvalidChar": "Tu contraseña contiene un carácter no válido",
-    "wordNotEmail": "No uses tu email como tu contraseña",
-    "wordSimilarToUsername": "Tu contraseña no puede contener tu nombre de usuario",
-    "wordTwoCharacterClasses": "Mezcla diferentes clases de caracteres",
-    "wordRepetitions": "Demasiadas repeticiones",
-    "wordSequences": "Tu contraseña contiene secuencias",
-    "errorList": "Errores:",
-    "veryWeak": "Muy Débil",
-    "weak": "Débil",
-    "normal": "Normal",
-    "medium": "Media",
-    "strong": "Fuerte",
-    "veryStrong": "Muy Fuerte"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/fr.json

@@ -1,17 +0,0 @@
-{
-    "wordMinLength": "Votre mot de passe est trop court",
-    "wordMaxLength": "Votre mot de passe est trop long",
-    "wordInvalidChar": "Votre mot de passe contient un caractère invalide",
-    "wordNotEmail": "Ne pas utiliser votre adresse e-mail comme mot de passe",
-    "wordSimilarToUsername": "Votre mot de passe ne peut pas contenir votre nom d'utilisateur",
-    "wordTwoCharacterClasses": "Utilisez différents type de caractères",
-    "wordRepetitions": "Trop de répétitions",
-    "wordSequences": "Votre mot de passe contient des séquences",
-    "errorList": "Erreurs:",
-    "veryWeak": "Très Faible",
-    "weak": "Faible",
-    "normal": "Normal",
-    "medium": "Moyen",
-    "strong": "Fort",
-    "veryStrong": "Très Fort"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/it.json

@@ -1,17 +0,0 @@
-{
-	"wordMinLength": "La tua password è troppo corta",
-	"wordMaxLength": "La tua password è troppo lunga",
-	"wordInvalidChar": "La tua password contiene un carattere non valido",
-	"wordNotEmail": "Non usare la tua e-mail come password",
-	"wordSimilarToUsername": "La tua password non può contenere il tuo nome",
-	"wordTwoCharacterClasses": "Usa classi di caratteri diversi",
-	"wordRepetitions": "Troppe ripetizioni",
-	"wordSequences": "La tua password contiene sequenze",
-	"errorList": "Errori:",
-	"veryWeak": "Molto debole",
-	"weak": "Debole",
-	"normal": "Normale",
-	"medium": "Media",
-	"strong": "Forte",
-	"veryStrong": "Molto forte"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/pl.json

@@ -1,17 +0,0 @@
-{
-    "wordMinLength": "Hasło jest zbyt krótkie",
-    "wordMaxLength": "Hasło jest za długie",
-    "wordInvalidChar": "Hasło zawiera nieprawidłowy znak",
-    "wordNotEmail": "Hasło nie może być Twoim emailem",
-    "wordSimilarToUsername": "Hasło nie może zawierać nazwy użytkownika",
-    "wordTwoCharacterClasses": "Użyj innych klas znaków",
-    "wordRepetitions": "Zbyt wiele powtórzeń",
-    "wordSequences": "Hasło zawiera sekwencje",
-    "errorList": "Błędy:",
-    "veryWeak": "Bardzo słabe",
-    "weak": "Słabe",
-    "normal": "Normalne",
-    "medium": "Średnie",
-    "strong": "Silne",
-    "veryStrong": "Bardzo silne"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/pt.json

@@ -1,17 +0,0 @@
-{
-    "wordMinLength": "Sua senha é muito curta",
-    "wordMaxLength": "Sua senha é muito longa",
-    "wordInvalidChar": "Sua senha contém um caractere inválido",
-    "wordNotEmail": "Não use seu e-mail como senha",
-    "wordSimilarToUsername": "Sua senha não pode conter o seu nome de usuário",
-    "wordTwoCharacterClasses": "Use diferentes classes de caracteres",
-    "wordRepetitions": "Muitas repetições",
-    "wordSequences": "Sua senha contém sequências",
-    "errorList": "Erros:",
-    "veryWeak": "Muito Fraca",
-    "weak": "Fraca",
-    "normal": "Normal",
-    "medium": "Média",
-    "strong": "Forte",
-    "veryStrong": "Muito Forte"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/ru.json

@@ -1,17 +0,0 @@
-{
-    "wordMinLength": "Слишком короткий пароль",
-    "wordMaxLength": "Ваш пароль слишком длинный",
-    "wordInvalidChar": "Ваш пароль содержит недопустимый символ",
-    "wordNotEmail": "Не используйте e-mail в качестве пароля",
-    "wordSimilarToUsername": "Пароль не должен содержать логин",
-    "wordTwoCharacterClasses": "Используйте разные классы символов",
-    "wordRepetitions": "Слишком много повторений",
-    "wordSequences": "Пароль содержит последовательности",
-    "errorList": "Ошибки:",
-    "veryWeak": "Очень слабый",
-    "weak": "Слабый",
-    "normal": "Нормальный",
-    "medium": "Средний",
-    "strong": "Сильный",
-    "veryStrong": "Очень сильный"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/sk.json

@@ -1,17 +0,0 @@
-{
-    "wordMinLength": "Vaše heslo je príliž krátke",
-    "wordMaxLength": "Vaše heslo je príliš dlhé",
-    "wordInvalidChar": "Vaše heslo obsahuje neplatný znak",
-    "wordNotEmail": "Nepoužívajte Váš email ako Vaše heslo",
-    "wordSimilarToUsername": "Vaše heslo nesmie obsahovať prihlasovacie meno",
-    "wordTwoCharacterClasses": "Použite rôzne druhy znakov",
-    "wordRepetitions": "Príliš veľa opakovaní",
-    "wordSequences": "Vaše heslo obsahuje postupnosť",
-    "errorList": "Chyby:",
-    "veryWeak": "Veľmi slabé",
-    "weak": "Slabé",
-    "normal": "Normálne",
-    "medium": "Stredne silné",
-    "strong": "Silné",
-    "veryStrong": "Veľmi silné"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/th.json

@@ -1,17 +0,0 @@
-{
-    "wordMinLength": "รหัสผ่านของคุณสั้นเกินไป",
-    "wordMaxLength": "รหัสผ่านของคุณยาวเกินไป",
-    "wordInvalidChar": "รหัสผ่านของคุณมีอักษรที่ไม่ถูกต้อง",
-    "wordNotEmail": "คุณไม่สามารถใช้รหัสผ่านเหมือนกับอีเมล์ของคุณได้",
-    "wordSimilarToUsername": "รหัสผ่านไม่ควรประกอบด้วยคำที่เป็น username",
-    "wordTwoCharacterClasses": "ลองเป็นกลุ่มคำใหม่",
-    "wordRepetitions": "มีอักษรซ้ำเยอะเกินไป",
-    "wordSequences": "รหัสผ่านของคุณเดาง่ายเกินไป",
-    "errorList": "Errors:",
-    "veryWeak": "เดาง่ายมาก",
-    "weak": "เดาง่าย",
-    "normal": "พอใช้",
-    "medium": "กำลังดี",
-    "strong": "ค่อนข้างดี",
-    "veryStrong": "ดีมาก"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/tr.json

@@ -1,17 +0,0 @@
-{
-    "wordMinLength": "Girdiğiniz şifre çok Kısa",
-    "wordMaxLength": "Parolanız çok uzun",
-    "wordInvalidChar": "Şifreniz geçersiz bir karakter içeriyor",
-    "wordNotEmail": "E-mail adresinizi şifreniz içerisinde kullanmayınız",
-    "wordSimilarToUsername": "Kullanıcı Adınızı şifreniz içerisinde kullanmayınız",
-    "wordTwoCharacterClasses": "Başka karakter sınıfı kullanınız",
-    "wordRepetitions": "Çok fazla tekrar var",
-    "wordSequences": "Şifreniz Dizi içermektedir",
-    "errorList": "Hatalar:",
-    "veryWeak": "Çok Zayıf",
-    "weak": "Zayıf",
-    "normal": "Normal",
-    "medium": "Orta",
-    "strong": "Güçlü",
-    "veryStrong": "Çok Güçlü"
-}

+ 0 - 17
public/libs/pwstrength-bootstrap/locales/zh-TW.json

@@ -1,17 +0,0 @@
-{
-	"wordMinLength": "您的密碼太短",
-	"wordMaxLength": "您的密碼太長",
-	"wordInvalidChar": "您的密碼包含無效字符",
-	"wordNotEmail": "不要使用電子郵件作為密碼",
-	"wordSimilarToUsername": "您的密碼不能包含您的用戶名",
-	"wordTwoCharacterClasses": "使用不同的字元類型 例如: 大小寫混合",
-	"wordRepetitions": "太多的重複。例如:1111",
-	"wordSequences": "你的密碼包含連續英/數字 例如:123 or abc",
-	"errorList": "錯誤:",
-	"veryWeak": "非常弱",
-	"weak": "弱",
-	"normal": "普通",
-	"medium": "中等",
-	"strong": "強",
-	"veryStrong": "非常強"
-}

+ 0 - 36
public/libs/readmore-js/CHANGELOG.md

@@ -1,36 +0,0 @@
-# 2.0.0
-
-## New features
-
-- Install with Bower: `bower install readmore`
-- Blocks can now be toggled programmatically: `$('article:nth-of-type(3)').readmore('toggle')`
-- ARIA semantics describe expanded state and relationship between blocks and their toggles
-- Blocks are now assigned an ID if they don't already have one
-- Install development dependencies with NPM
-- Gulp task to minifiy with UglifyJS 
-
-## Improvements
-
-- Height calculations on window resize are "debounced", resulting in more efficient rendering
-- Height calculation in general has been improved
-- The value of the `expanded` argument passed to the `beforeToggle` callback now correctly reflects the _pre-toggle_ state
-- Multiple instances are now fully supported: e.g. `$('article').readmore({speed: 200})` and `$('fieldset').readmore({speed: 900})` will work on the same page
-- Fully responsive, plugin now prefers max-heights set in CSS, even inside media queries
-
-## Potentially breaking changes
-
-- `maxHeight` option is now `collapsedHeight`
-- `sectionCSS` option is now `blockCSS`
-- `toggleSlider()` method is now just `toggle()`
-- Animation is now performed with CSS3 transitions, rather than `jQuery.animate()`
-- IE 8 and 9 are no longer supported, because those browsers hate kittens
-- `init()` is now called within a `window.onload` event handler, which can briefly delay collapsing content
-- `setBoxHeight()` is now a "private" method called `setBoxHeights()`
-- `resizeBoxes()` is also now private
-- Readmore.js now uses attribute selectors, rather than classes
-    - The `.readmore-js-section` and `.readmore-js-toggle` classes are gone
-    - The `expandedClass` and `collapsedClass` options are also gone
-    - Every Readmore.js block needs an ID, if one is not already present, one will be generated 
-
-
-

+ 0 - 22
public/libs/readmore-js/LICENSE

@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Jed Foster
-
-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.
-

+ 0 - 183
public/libs/readmore-js/README.md

@@ -1,183 +0,0 @@
-# Readmore.js
-
-A smooth, responsive jQuery plugin for collapsing and expanding long blocks of text with "Read more" and "Close" links.
-
-The markup Readmore.js requires is so simple, you can probably use it with your existing HTML—there's no need for complicated sets of `div`'s or hardcoded classes, just call `.readmore()` on the element containing your block of text and Readmore.js takes care of the rest. Readmore.js plays well in a responsive environment, too.
-
-Readmore.js is tested with—and supported on—all versions of jQuery greater than 1.9.1. All the "good" browsers are supported, as well as IE10+; IE8 & 9 _should_ work, but are not supported and the experience will not be ideal.
-
-
-## Install
-
-Install Readmore.js with npm:
-
-```
-$ npm install readmore-js
-```
-
-Then include it in your HTML:
-
-```html
-<script src="/node_modules/readmore-js/readmore.min.js"></script>
-```
-
-Or, using Webpack or Browserify:
-
-```javascript
-require('readmore-js');
-```
-
-
-## Use
-
-```javascript
-$('article').readmore();
-```
-
-It's that simple. You can change the speed of the animation, the height of the collapsed block, and the open and close elements.
-
-```javascript
-$('article').readmore({
-  speed: 75,
-  lessLink: '<a href="#">Read less</a>'
-});
-```
-
-### The options:
-
-* `speed: 100` in milliseconds
-* `collapsedHeight: 200` in pixels
-* `heightMargin: 16` in pixels, avoids collapsing blocks that are only slightly larger than `collapsedHeight`
-* `moreLink: '<a href="#">Read more</a>'`
-* `lessLink: '<a href="#">Close</a>'`
-* `embedCSS: true` insert required CSS dynamically, set this to `false` if you include the necessary CSS in a stylesheet
-* `blockCSS: 'display: block; width: 100%;'` sets the styling of the blocks, ignored if `embedCSS` is `false`
-* `startOpen: false` do not immediately truncate, start in the fully opened position
-* `beforeToggle: function() {}` called after a more or less link is clicked, but *before* the block is collapsed or expanded
-* `afterToggle: function() {}` called *after* the block is collapsed or expanded
-* `blockProcessed: function() {}` called once per block during initilization after Readmore.js has processed the block.
-
-If the element has a `max-height` CSS property, Readmore.js will use that value rather than the value of the `collapsedHeight` option.
-
-### The callbacks:
-
-The `beforeToggle` and `afterToggle` callbacks both receive the same arguments: `trigger`, `element`, and `expanded`.
-
-* `trigger`: the "Read more" or "Close" element that was clicked
-* `element`: the block that is being collapsed or expanded
-* `expanded`: Boolean; `true` means the block is expanded
-
-The `blockProcessed` callback receives `element` and `collapsable`.
-
-* `element`: the block that has just been processed
-* `collapsable`: Boolean; `false` means the block was shorter than the specified minimum `collapsedHeight`--the block will not have a "Read more" link
-
-#### Callback example:
-
-Here's an example of how you could use the `afterToggle` callback to scroll back to the top of a block when the "Close" link is clicked.
-
-```javascript
-$('article').readmore({
-  afterToggle: function(trigger, element, expanded) {
-    if(! expanded) { // The "Close" link was clicked
-      $('html, body').animate( { scrollTop: element.offset().top }, {duration: 100 } );
-    }
-  }
-});
-```
-
-### Removing Readmore:
-
-You can remove the Readmore.js functionality like so:
-
-```javascript
-$('article').readmore('destroy');
-```
-
-Or, you can be more surgical by specifying a particular element:
-
-```javascript
-$('article:first').readmore('destroy');
-```
-
-### Toggling blocks programmatically:
-
-You can toggle a block from code:
-
-```javascript
-$('article:nth-of-type(3)').readmore('toggle');
-```
-
-
-## CSS:
-
-Readmore.js is designed to use CSS for as much functionality as possible: collapsed height can be set in CSS with the `max-height` property; "collapsing" is achieved by setting `overflow: hidden` on the containing block and changing the `height` property; and, finally, the expanding/collapsing animation is done with CSS3 transitions.
-
-By default, Readmore.js inserts the following CSS, in addition to some transition-related rules:
-
-```css
-selector + [data-readmore-toggle], selector[data-readmore] {
-  display: block;
-  width: 100%;
-}
-```
-
-_`selector` would be the element you invoked `readmore()` on, e.g.: `$('selector').readmore()`_
-
-You can override the base rules when you set up Readmore.js like so:
-
-```javascript
-$('article').readmore({blockCSS: 'display: inline-block; width: 50%;'});
-```
-
-If you want to include the necessary styling in your site's stylesheet, you can disable the dynamic embedding by setting `embedCSS` to `false`:
-
-```javascript
-$('article').readmore({embedCSS: false});
-```
-
-### Media queries and other CSS tricks:
-
-If you wanted to set a `maxHeight` based on lines, you could do so in CSS with something like:
-
-```css
-body {
-  font: 16px/1.5 sans-serif;
-}
-
-/* Show only 4 lines in smaller screens */
-article {
-  max-height: 6em; /* (4 * 1.5 = 6) */
-}
-```
-
-Then, with a media query you could change the number of lines shown, like so:
-
-```css
-/* Show 8 lines on larger screens */
-@media screen and (min-width: 640px) {
-  article {
-    max-height: 12em;
-  }
-}
-```
-
-
-## Contributing
-
-Pull requests are always welcome, but not all suggested features will get merged. Feel free to contact me if you have an idea for a feature.
-
-Pull requests should include the minified script and this readme and the demo HTML should be updated with descriptions of your new feature. 
-
-You'll need NPM:
-
-```
-$ npm install
-```
-
-Which will install the necessary development dependencies. Then, to build the minified script:
-
-```
-$ npm run build
-```
-

File diff suppressed because it is too large
+ 0 - 25
public/libs/readmore-js/ajax-demo.html


+ 0 - 29
public/libs/readmore-js/bower.json

@@ -1,29 +0,0 @@
-{
-  "name": "readmore-js",
-  "main": "readmore.js",
-  "version": "2.1.0",
-  "homepage": "http://jedfoster.com/Readmore.js/",
-  "authors": [
-    "Jed Foster <jed@jedfoster.com>"
-  ],
-  "description": "A lightweight jQuery plugin for collapsing and expanding long blocks of text with \"Read more\" and \"Close\" links.",
-  "keywords": [
-    "css",
-    "jquery",
-    "readmore",
-    "expand",
-    "collapse"
-  ],
-  "license": "MIT",
-  "ignore": [
-    "**/.*",
-    "node_modules",
-    "bower_components",
-    "test",
-    "tests",
-    "gulpfile.js"
-  ],
-  "dependencies": {
-    "jquery": ">=2.1.4"
-  }
-}

+ 0 - 243
public/libs/readmore-js/demo.html

@@ -1,243 +0,0 @@
-<!DOCTYPE html>
-
-<html lang="en" class="no-js">
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-
-  <title>Readmore.js: jQuery plugin for long blocks of text</title>
-  <meta name="description" content="A smooth, lightweight jQuery plugin for collapsing and expanding long blocks of text with &#8220;Read more&#8221; and &#8220;Close&#8221; links.">
-  <meta name="author" content="Jed Foster">
-
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-  <!--[if lt IE 9]>
-    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7/html5shiv.min.js"></script>
-  <![endif]-->
-
-  <style media="screen">
-    body { font: 16px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; color: #444; }
-    code { color: #777; font-family: "Source Code Pro", "Menlo", "Courier New", monospace;}
-    a { color: #178DB1; }
-    .container { margin: 0 auto; max-width: 960px; }
-    #info + .readmore-js-toggle { padding-bottom: 1.5em; border-bottom: 1px solid #999; font-weight: bold;}
-    #demo { padding: 0 10%; }
-  </style>
-</head>
-
-<body>
-
-  <div class="container">
-    <header>
-      <h1>Readmore.js</h1>
-
-      <p>A smooth, responsive jQuery plugin for collapsing and expanding long blocks of text with &#8220;Read more&#8221; and &#8220;Close&#8221; links.</p>
-    </header>
-
-    <section id="info">
-      <p>The markup Readmore.js requires is so simple, you can probably use it with your existing HTML—there&#8217;s no need for complicated sets of <code>div</code>&#8217;s or hardcoded classes, just call <code>.readmore()</code> on the element containing your block of text and Readmore.js takes care of the rest. Readmore.js plays well in a responsive environment, too.</p>
-
-      <p>Readmore.js is tested with—and supported on—all versions of jQuery greater than 1.9.1. All the &#8220;good&#8221; browsers are supported, as well as IE10+; IE8 &amp; 9 <em>should</em> work, but are not supported and the experience will not be ideal.</p>
-
-      <h2 id="install">Install</h2>
-
-      <p>Install Readmore.js with npm:</p>
-
-      <pre><code>$ npm install readmore-js</code></pre>
-
-      <p>Then include it in your HTML:</p>
-
-      <pre><code class="html">&lt;script src=&quot;/node_modules/readmore-js/readmore.min.js&quot;&gt;&lt;/script&gt;</code></pre>
-
-      <p>Or, using Webpack or Browserify:</p>
-
-      <pre><code class="javascript">require('readmore-js');</code></pre>
-
-      <h2 id="use">Use</h2>
-
-      <pre><code class="javascript">$(&apos;article&apos;).readmore();</code></pre>
-
-      <p>It&#8217;s that simple. You can change the speed of the animation, the height of the collapsed block, and the open and close elements.</p>
-
-      <pre><code class="javascript">$(&apos;article&apos;).readmore({
-  speed: 75,
-  lessLink: &apos;&lt;a href=&quot;#&quot;&gt;Read less&lt;/a&gt;&apos;
-});</code></pre>
-
-      <h3 id="theoptions">The options:</h3>
-
-      <ul>
-        <li><code>speed: 100</code> in milliseconds</li>
-        <li><code>collapsedHeight: 200</code> in pixels</li>
-        <li><code>heightMargin: 16</code> in pixels, avoids collapsing blocks that are only slightly larger than <code>collapsedHeight</code></li>
-        <li><code>moreLink: '&lt;a href=&quot;#&quot;&gt;Read more&lt;/a&gt;'</code></li>
-        <li><code>lessLink: '&lt;a href=&quot;#&quot;&gt;Close&lt;/a&gt;'</code></li>
-        <li><code>embedCSS: true</code> insert required CSS dynamically, set this to <code>false</code> if you include the necessary CSS in a stylesheet</li>
-        <li><code>blockCSS: 'display: block; width: 100%;'</code> sets the styling of the blocks, ignored if <code>embedCSS</code> is <code>false</code></li>
-        <li><code>startOpen: false</code> do not immediately truncate, start in the fully opened position</li>
-        <li><code>beforeToggle: function() {}</code> called after a more or less link is clicked, but <em>before</em> the block is collapsed or expanded</li>
-        <li><code>afterToggle: function() {}</code> called <em>after</em> the block is collapsed or expanded</li>
-        <li><code>blockProcessed: function() {}</code> called once per block during initilization after Readmore.js has processed the block.</li>
-      </ul>
-
-      <p>If the element has a <code>max-height</code> CSS property, Readmore.js will use that value rather than the value of the <code>collapsedHeight</code> option.</p>
-
-      <h3 id="thecallbacks">The callbacks:</h3>
-
-      <p>The <code>beforeToggle</code> and <code>afterToggle</code> callbacks both receive the same arguments: <code>trigger</code>, <code>element</code>, and <code>expanded</code>.</p>
-
-      <ul>
-        <li><code>trigger</code>: the &#8220;Read more&#8221; or &#8220;Close&#8221; element that was clicked</li>
-        <li><code>element</code>: the block that is being collapsed or expanded</li>
-        <li><code>expanded</code>: Boolean; <code>true</code> means the block is expanded</li>
-      </ul>
-
-      <p>The <code>blockProcessed</code> callback receives <code>element</code> and <code>collapsable</code>.</p>
-
-      <ul>
-        <li><code>element</code>: the block that has just been processed</li>
-        <li><code>collapsable</code>: Boolean; <code>false</code> means the block was shorter than the specified minimum <code>collapsedHeight</code>—the block will not have a "Read more" link</li>
-      </ul>
-
-      <h4 id="callbackexample">Callback example:</h4>
-
-      <p>Here&#8217;s an example of how you could use the <code>afterToggle</code> callback to scroll back to the top of a block when the &#8220;Close&#8221; link is clicked.</p>
-
-      <pre><code class="javascript">$(&apos;article&apos;).readmore({
-  afterToggle: function(trigger, element, expanded) {
-    if(! expanded) { // The &quot;Close&quot; link was clicked
-      $(&apos;html, body&apos;).animate( { scrollTop: element.offset().top }, {duration: 100 } );
-    }
-  }
-});</code></pre>
-
-      <h3 id="removingreadmore">Removing Readmore:</h3>
-
-      <p>You can remove the Readmore.js functionality like so:</p>
-
-      <pre><code class="javascript">$(&apos;article&apos;).readmore(&apos;destroy&apos;);</code></pre>
-
-      <p>Or, you can be more surgical by specifying a particular element:</p>
-
-      <pre><code class="javascript">$(&apos;article:first&apos;).readmore(&apos;destroy&apos;);</code></pre>
-
-      <h3 id="togglingblocksprogrammatically">Toggling blocks programmatically:</h3>
-
-      <p>You can toggle a block from code:</p>
-
-      <pre><code class="javascript">$(&apos;article:nth-of-type(3)&apos;).readmore(&apos;toggle&apos;);</code></pre>
-
-      <h2 id="css">CSS:</h2>
-
-      <p>Readmore.js is designed to use CSS for as much functionality as possible: collapsed height can be set in CSS with the <code>max-height</code> property; &#8220;collapsing&#8221; is achieved by setting <code>overflow: hidden</code> on the containing block and changing the <code>height</code> property; and, finally, the expanding/collapsing animation is done with CSS3 transitions.</p>
-
-      <p>By default, Readmore.js inserts the following CSS, in addition to some transition-related rules:</p>
-
-      <pre><code class="css">selector + [data-readmore-toggle], selector[data-readmore] {
-  display: block;
-  width: 100%;
-}</code></pre>
-
-      <p><em><code>selector</code> would be the element you invoked <code>readmore()</code> on, e.g.: <code>$('selector').readmore()</code></em></p>
-
-      <p>You can override the base rules when you set up Readmore.js like so:</p>
-
-      <pre><code class="javascript">$(&apos;article&apos;).readmore({blockCSS: &apos;display: inline-block; width: 50%;&apos;});</code></pre>
-
-      <p>If you want to include the necessary styling in your site&#8217;s stylesheet, you can disable the dynamic embedding by setting <code>embedCSS</code> to <code>false</code>:</p>
-
-      <pre><code class="javascript">$(&apos;article&apos;).readmore({embedCSS: false});</code></pre>
-
-      <h3 id="mediaqueriesandothercsstricks">Media queries and other CSS tricks:</h3>
-
-      <p>If you wanted to set a <code>maxHeight</code> based on lines, you could do so in CSS with something like:</p>
-
-      <pre><code class="css">body {
-  font: 16px/1.5 sans-serif;
-}
-
-/* Show only 4 lines in smaller screens */
-article {
-  max-height: 6em; /* (4 * 1.5 = 6) */
-}</code></pre>
-
-      <p>Then, with a media query you could change the number of lines shown, like so:</p>
-
-      <pre><code class="css">/* Show 8 lines on larger screens */
-@media screen and (min-width: 640px) {
-  article {
-    max-height: 12em;
-  }
-}</code></pre>
-
-      <h2 id="contributing">Contributing</h2>
-
-      <p>Pull requests are always welcome, but not all suggested features will get merged. Feel free to contact me if you have an idea for a feature.</p>
-
-      <p>Pull requests should include the minified script and this readme and the demo HTML should be updated with descriptions of your new feature. </p>
-
-      <p>You&#8217;ll need NPM:</p>
-
-      <pre><code>$ npm install</code></pre>
-
-      <p>Which will install the necessary development dependencies. Then, to build the minified script:</p>
-
-      <pre><code>$ gulp compress</code></pre>
-    </section>
-
-    <h1>Demo</h1>
-
-    <section id="demo">
-
-      <article>
-        <h2>Artisanal Narwahls</h2>
-
-        <p>From this distant vantage point, the Earth might not seem of any particular interest. But for us, it's different. Consider again that dot. That's here. That's home. That's us. On it everyone you love, everyone you know, everyone you ever heard of, every human being who ever was, lived out their lives. The aggregate of our joy and suffering, thousands of confident religions, ideologies, and economic doctrines, every hunter and forager, every hero and coward, every creator and destroyer of civilization, every king and peasant, every young couple in love, every mother and father, hopeful child, inventor and explorer, every teacher of morals, every corrupt politician, every "superstar," every "supreme leader," every saint and sinner in the history of our species lived there – on a mote of dust suspended in a sunbeam.</p>
-
-        <p>Space, the final frontier. These are the voyages of the starship Enterprise. Its five year mission: to explore strange new worlds, to seek out new life and new civilizations, to boldly go where no man has gone before!</p>
-
-        <p>Here's how it is: Earth got used up, so we terraformed a whole new galaxy of Earths, some rich and flush with the new technologies, some not so much. Central Planets, them was formed the Alliance, waged war to bring everyone under their rule; a few idiots tried to fight it, among them myself. I'm Malcolm Reynolds, captain of Serenity. Got a good crew: fighters, pilot, mechanic. We even picked up a preacher, and a bona fide companion. There's a doctor, too, took his genius sister out of some Alliance camp, so they're keeping a low profile. You got a job, we can do it, don't much care what it is.</p>
-
-        <p>Space, the final frontier. These are the voyages of the starship Enterprise. Its five year mission: to explore strange new worlds, to seek out new life and new civilizations, to boldly go where no man has gone before!</p>
-      </article>
-
-      <article>
-        <h2>Portland Leggings</h2>
-
-        <p>Here's how it is: Earth got used up, so we terraformed a whole new galaxy of Earths, some rich and flush with the new technologies, some not so much. Central Planets, them was formed the Alliance, waged war to bring everyone under their rule; a few idiots tried to fight it, among them myself. I'm Malcolm Reynolds, captain of Serenity. Got a good crew: fighters, pilot, mechanic. We even picked up a preacher, and a bona fide companion. There's a doctor, too, took his genius sister out of some Alliance camp, so they're keeping a low profile. You got a job, we can do it, don't much care what it is.</p>
-
-        <p>I am Duncan Macleod, born 400 years ago in the Highlands of Scotland. I am Immortal, and I am not alone. For centuries, we have waited for the time of the Gathering when the stroke of a sword and the fall of a head will release the power of the Quickening. In the end, there can be only one.</p>
-
-        <p>From this distant vantage point, the Earth might not seem of any particular interest. But for us, it's different. Consider again that dot. That's here. That's home. That's us. On it everyone you love, everyone you know, everyone you ever heard of, every human being who ever was, lived out their lives. The aggregate of our joy and suffering, thousands of confident religions, ideologies, and economic doctrines, every hunter and forager, every hero and coward, every creator and destroyer of civilization, every king and peasant, every young couple in love, every mother and father, hopeful child, inventor and explorer, every teacher of morals, every corrupt politician, every "superstar," every "supreme leader," every saint and sinner in the history of our species lived there – on a mote of dust suspended in a sunbeam.</p>
-
-        <p>Space, the final frontier. These are the voyages of the starship Enterprise. Its five year mission: to explore strange new worlds, to seek out new life and new civilizations, to boldly go where no man has gone before!</p>
-      </article>
-
-      <article>
-        <h2>This section is shorter than the Readmore minimum</h2>
-
-        <p>Space, the final frontier. These are the voyages of the starship Enterprise. Its five year mission: to explore strange new worlds, to seek out new life and new civilizations, to boldly go where no man has gone before!</p>
-      </article>
-    </section>
-  </div>
-
-  <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
-
-  <script src="readmore.js"></script>
-
-  <script>
-    $('#info').readmore({
-      moreLink: '<a href="#">Usage, examples, and options</a>',
-      collapsedHeight: 384,
-      afterToggle: function(trigger, element, expanded) {
-        if(! expanded) { // The "Close" link was clicked
-          $('html, body').animate({scrollTop: element.offset().top}, {duration: 100});
-        }
-      }
-    });
-
-    $('article').readmore({speed: 500});
-  </script>
-</body>
-</html>
-

+ 0 - 14
public/libs/readmore-js/gulpfile.js

@@ -1,14 +0,0 @@
-var gulp = require('gulp'),
-    uglify = require('gulp-uglify'),
-    rename = require('gulp-rename');
-
-gulp.task('compress', function() {
-  gulp.src('readmore.js')
-    .pipe(uglify({
-      mangle: true,
-      compress: true,
-      preserveComments: 'some'
-    }))
-    .pipe(rename('readmore.min.js'))
-    .pipe(gulp.dest('./'));
-});

+ 0 - 692
public/libs/readmore-js/jquery.mockjax.js

@@ -1,692 +0,0 @@
-/*!
- * MockJax - jQuery Plugin to Mock Ajax requests
- *
- * Version:  1.6.1
- * Released:
- * Home:   https://github.com/jakerella/jquery-mockjax
- * Author:   Jonathan Sharp (http://jdsharp.com)
- * License:  MIT,GPL
- *
- * Copyright (c) 2014 appendTo, Jordan Kasper
- * NOTE: This repository was taken over by Jordan Kasper (@jakerella) October, 2014
- * 
- * Dual licensed under the MIT or GPL licenses.
- * http://opensource.org/licenses/MIT OR http://www.gnu.org/licenses/gpl-2.0.html
- */
-(function($) {
-	var _ajax = $.ajax,
-		mockHandlers = [],
-		mockedAjaxCalls = [],
-		unmockedAjaxCalls = [],
-		CALLBACK_REGEX = /=\?(&|$)/,
-		jsc = (new Date()).getTime();
-
-
-	// Parse the given XML string.
-	function parseXML(xml) {
-		if ( window.DOMParser == undefined && window.ActiveXObject ) {
-			DOMParser = function() { };
-			DOMParser.prototype.parseFromString = function( xmlString ) {
-				var doc = new ActiveXObject('Microsoft.XMLDOM');
-				doc.async = 'false';
-				doc.loadXML( xmlString );
-				return doc;
-			};
-		}
-
-		try {
-			var xmlDoc = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
-			if ( $.isXMLDoc( xmlDoc ) ) {
-				var err = $('parsererror', xmlDoc);
-				if ( err.length == 1 ) {
-					throw new Error('Error: ' + $(xmlDoc).text() );
-				}
-			} else {
-				throw new Error('Unable to parse XML');
-			}
-			return xmlDoc;
-		} catch( e ) {
-			var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
-			$(document).trigger('xmlParseError', [ msg ]);
-			return undefined;
-		}
-	}
-
-	// Check if the data field on the mock handler and the request match. This
-	// can be used to restrict a mock handler to being used only when a certain
-	// set of data is passed to it.
-	function isMockDataEqual( mock, live ) {
-		var identical = true;
-		// Test for situations where the data is a querystring (not an object)
-		if (typeof live === 'string') {
-			// Querystring may be a regex
-			return $.isFunction( mock.test ) ? mock.test(live) : mock == live;
-		}
-		$.each(mock, function(k) {
-			if ( live[k] === undefined ) {
-				identical = false;
-				return identical;
-			} else {
-				if ( typeof live[k] === 'object' && live[k] !== null ) {
-					if ( identical && $.isArray( live[k] ) ) {
-						identical = $.isArray( mock[k] ) && live[k].length === mock[k].length;
-					}
-					identical = identical && isMockDataEqual(mock[k], live[k]);
-				} else {
-					if ( mock[k] && $.isFunction( mock[k].test ) ) {
-						identical = identical && mock[k].test(live[k]);
-					} else {
-						identical = identical && ( mock[k] == live[k] );
-					}
-				}
-			}
-		});
-
-		return identical;
-	}
-
-    // See if a mock handler property matches the default settings
-    function isDefaultSetting(handler, property) {
-        return handler[property] === $.mockjaxSettings[property];
-    }
-
-	// Check the given handler should mock the given request
-	function getMockForRequest( handler, requestSettings ) {
-		// If the mock was registered with a function, let the function decide if we
-		// want to mock this request
-		if ( $.isFunction(handler) ) {
-			return handler( requestSettings );
-		}
-
-		// Inspect the URL of the request and check if the mock handler's url
-		// matches the url for this ajax request
-		if ( $.isFunction(handler.url.test) ) {
-			// The user provided a regex for the url, test it
-			if ( !handler.url.test( requestSettings.url ) ) {
-				return null;
-			}
-		} else {
-			// Look for a simple wildcard '*' or a direct URL match
-			var star = handler.url.indexOf('*');
-			if (handler.url !== requestSettings.url && star === -1 ||
-					!new RegExp(handler.url.replace(/[-[\]{}()+?.,\\^$|#\s]/g, "\\$&").replace(/\*/g, '.+')).test(requestSettings.url)) {
-				return null;
-			}
-		}
-
-		// Inspect the data submitted in the request (either POST body or GET query string)
-		if ( handler.data ) {
-			if ( ! requestSettings.data || !isMockDataEqual(handler.data, requestSettings.data) ) {
-				// They're not identical, do not mock this request
-				return null;
-			}
-		}
-		// Inspect the request type
-		if ( handler && handler.type &&
-				handler.type.toLowerCase() != requestSettings.type.toLowerCase() ) {
-			// The request type doesn't match (GET vs. POST)
-			return null;
-		}
-
-		return handler;
-	}
-
-	function parseResponseTimeOpt(responseTime) {
-		if ($.isArray(responseTime)) {
-			var min = responseTime[0];
-			var max = responseTime[1];
-			return (typeof min === 'number' && typeof max === 'number') ? Math.floor(Math.random() * (max - min)) + min : null;
-		} else {
-			return (typeof responseTime === 'number') ? responseTime: null;
-		}
-	}
-
-	// Process the xhr objects send operation
-	function _xhrSend(mockHandler, requestSettings, origSettings) {
-
-		// This is a substitute for < 1.4 which lacks $.proxy
-		var process = (function(that) {
-			return function() {
-				return (function() {
-					// The request has returned
-					this.status     = mockHandler.status;
-					this.statusText = mockHandler.statusText;
-					this.readyState	= 1;
-
-					var finishRequest = function () {
-						this.readyState	= 4;
-
-						var onReady;
-						// Copy over our mock to our xhr object before passing control back to
-						// jQuery's onreadystatechange callback
-						if ( requestSettings.dataType == 'json' && ( typeof mockHandler.responseText == 'object' ) ) {
-							this.responseText = JSON.stringify(mockHandler.responseText);
-						} else if ( requestSettings.dataType == 'xml' ) {
-							if ( typeof mockHandler.responseXML == 'string' ) {
-								this.responseXML = parseXML(mockHandler.responseXML);
-								//in jQuery 1.9.1+, responseXML is processed differently and relies on responseText
-								this.responseText = mockHandler.responseXML;
-							} else {
-								this.responseXML = mockHandler.responseXML;
-							}
-						} else if (typeof mockHandler.responseText === 'object' && mockHandler.responseText !== null) {
-							// since jQuery 1.9 responseText type has to match contentType
-							mockHandler.contentType = 'application/json';
-							this.responseText = JSON.stringify(mockHandler.responseText);
-						} else {
-							this.responseText = mockHandler.responseText;
-						}
-						if( typeof mockHandler.status == 'number' || typeof mockHandler.status == 'string' ) {
-							this.status = mockHandler.status;
-						}
-						if( typeof mockHandler.statusText === "string") {
-							this.statusText = mockHandler.statusText;
-						}
-						// jQuery 2.0 renamed onreadystatechange to onload
-						onReady = this.onreadystatechange || this.onload;
-
-						// jQuery < 1.4 doesn't have onreadystate change for xhr
-						if ( $.isFunction( onReady ) ) {
-							if( mockHandler.isTimeout) {
-								this.status = -1;
-							}
-							onReady.call( this, mockHandler.isTimeout ? 'timeout' : undefined );
-						} else if ( mockHandler.isTimeout ) {
-							// Fix for 1.3.2 timeout to keep success from firing.
-							this.status = -1;
-						}
-					};
-
-					// We have an executable function, call it to give
-					// the mock handler a chance to update it's data
-					if ( $.isFunction(mockHandler.response) ) {
-						// Wait for it to finish
-						if ( mockHandler.response.length === 2 ) {
-							mockHandler.response(origSettings, function () {
-								finishRequest.call(that);
-							});
-							return;
-						} else {
-							mockHandler.response(origSettings);
-						}
-					}
-
-					finishRequest.call(that);
-				}).apply(that);
-			};
-		})(this);
-
-		if ( mockHandler.proxy ) {
-			// We're proxying this request and loading in an external file instead
-			_ajax({
-				global: false,
-				url: mockHandler.proxy,
-				type: mockHandler.proxyType,
-				data: mockHandler.data,
-				dataType: requestSettings.dataType === "script" ? "text/plain" : requestSettings.dataType,
-				complete: function(xhr) {
-					mockHandler.responseXML = xhr.responseXML;
-					mockHandler.responseText = xhr.responseText;
-                    // Don't override the handler status/statusText if it's specified by the config
-                    if (isDefaultSetting(mockHandler, 'status')) {
-					    mockHandler.status = xhr.status;
-                    }
-                    if (isDefaultSetting(mockHandler, 'statusText')) {
-					    mockHandler.statusText = xhr.statusText;
-                    }
-					this.responseTimer = setTimeout(process, parseResponseTimeOpt(mockHandler.responseTime) || 0);
-				}
-			});
-		} else {
-			// type == 'POST' || 'GET' || 'DELETE'
-			if ( requestSettings.async === false ) {
-				// TODO: Blocking delay
-				process();
-			} else {
-				this.responseTimer = setTimeout(process, parseResponseTimeOpt(mockHandler.responseTime) || 50);
-			}
-		}
-	}
-
-	// Construct a mocked XHR Object
-	function xhr(mockHandler, requestSettings, origSettings, origHandler) {
-		// Extend with our default mockjax settings
-		mockHandler = $.extend(true, {}, $.mockjaxSettings, mockHandler);
-
-		if (typeof mockHandler.headers === 'undefined') {
-			mockHandler.headers = {};
-		}
-		if (typeof requestSettings.headers === 'undefined') {
-			requestSettings.headers = {};
-		}
-		if ( mockHandler.contentType ) {
-			mockHandler.headers['content-type'] = mockHandler.contentType;
-		}
-
-		return {
-			status: mockHandler.status,
-			statusText: mockHandler.statusText,
-			readyState: 1,
-			open: function() { },
-			send: function() {
-				origHandler.fired = true;
-				_xhrSend.call(this, mockHandler, requestSettings, origSettings);
-			},
-			abort: function() {
-				clearTimeout(this.responseTimer);
-			},
-			setRequestHeader: function(header, value) {
-				requestSettings.headers[header] = value;
-			},
-			getResponseHeader: function(header) {
-				// 'Last-modified', 'Etag', 'content-type' are all checked by jQuery
-				if ( mockHandler.headers && mockHandler.headers[header] ) {
-					// Return arbitrary headers
-					return mockHandler.headers[header];
-				} else if ( header.toLowerCase() == 'last-modified' ) {
-					return mockHandler.lastModified || (new Date()).toString();
-				} else if ( header.toLowerCase() == 'etag' ) {
-					return mockHandler.etag || '';
-				} else if ( header.toLowerCase() == 'content-type' ) {
-					return mockHandler.contentType || 'text/plain';
-				}
-			},
-			getAllResponseHeaders: function() {
-				var headers = '';
-				// since jQuery 1.9 responseText type has to match contentType
-				if (mockHandler.contentType) {
-					mockHandler.headers['Content-Type'] = mockHandler.contentType;
-				}
-				$.each(mockHandler.headers, function(k, v) {
-					headers += k + ': ' + v + "\n";
-				});
-				return headers;
-			}
-		};
-	}
-
-	// Process a JSONP mock request.
-	function processJsonpMock( requestSettings, mockHandler, origSettings ) {
-		// Handle JSONP Parameter Callbacks, we need to replicate some of the jQuery core here
-		// because there isn't an easy hook for the cross domain script tag of jsonp
-
-		processJsonpUrl( requestSettings );
-
-		requestSettings.dataType = "json";
-		if(requestSettings.data && CALLBACK_REGEX.test(requestSettings.data) || CALLBACK_REGEX.test(requestSettings.url)) {
-			createJsonpCallback(requestSettings, mockHandler, origSettings);
-
-			// We need to make sure
-			// that a JSONP style response is executed properly
-
-			var rurl = /^(\w+:)?\/\/([^\/?#]+)/,
-				parts = rurl.exec( requestSettings.url ),
-				remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
-
-			requestSettings.dataType = "script";
-			if(requestSettings.type.toUpperCase() === "GET" && remote ) {
-				var newMockReturn = processJsonpRequest( requestSettings, mockHandler, origSettings );
-
-				// Check if we are supposed to return a Deferred back to the mock call, or just
-				// signal success
-				if(newMockReturn) {
-					return newMockReturn;
-				} else {
-					return true;
-				}
-			}
-		}
-		return null;
-	}
-
-	// Append the required callback parameter to the end of the request URL, for a JSONP request
-	function processJsonpUrl( requestSettings ) {
-		if ( requestSettings.type.toUpperCase() === "GET" ) {
-			if ( !CALLBACK_REGEX.test( requestSettings.url ) ) {
-				requestSettings.url += (/\?/.test( requestSettings.url ) ? "&" : "?") +
-					(requestSettings.jsonp || "callback") + "=?";
-			}
-		} else if ( !requestSettings.data || !CALLBACK_REGEX.test(requestSettings.data) ) {
-			requestSettings.data = (requestSettings.data ? requestSettings.data + "&" : "") + (requestSettings.jsonp || "callback") + "=?";
-		}
-	}
-
-	// Process a JSONP request by evaluating the mocked response text
-	function processJsonpRequest( requestSettings, mockHandler, origSettings ) {
-		// Synthesize the mock request for adding a script tag
-		var callbackContext = origSettings && origSettings.context || requestSettings,
-			newMock = null;
-
-
-		// If the response handler on the moock is a function, call it
-		if ( mockHandler.response && $.isFunction(mockHandler.response) ) {
-			mockHandler.response(origSettings);
-		} else {
-
-			// Evaluate the responseText javascript in a global context
-			if( typeof mockHandler.responseText === 'object' ) {
-				$.globalEval( '(' + JSON.stringify( mockHandler.responseText ) + ')');
-			} else {
-				$.globalEval( '(' + mockHandler.responseText + ')');
-			}
-		}
-
-		// Successful response
-		setTimeout(function() {
-			jsonpSuccess( requestSettings, callbackContext, mockHandler );
-			jsonpComplete( requestSettings, callbackContext, mockHandler );
-		}, parseResponseTimeOpt(mockHandler.responseTime) || 0);
-
-		// If we are running under jQuery 1.5+, return a deferred object
-		if($.Deferred){
-			newMock = new $.Deferred();
-			if(typeof mockHandler.responseText == "object"){
-				newMock.resolveWith( callbackContext, [mockHandler.responseText] );
-			}
-			else{
-				newMock.resolveWith( callbackContext, [$.parseJSON( mockHandler.responseText )] );
-			}
-		}
-		return newMock;
-	}
-
-
-	// Create the required JSONP callback function for the request
-	function createJsonpCallback( requestSettings, mockHandler, origSettings ) {
-		var callbackContext = origSettings && origSettings.context || requestSettings;
-		var jsonp = requestSettings.jsonpCallback || ("jsonp" + jsc++);
-
-		// Replace the =? sequence both in the query string and the data
-		if ( requestSettings.data ) {
-			requestSettings.data = (requestSettings.data + "").replace(CALLBACK_REGEX, "=" + jsonp + "$1");
-		}
-
-		requestSettings.url = requestSettings.url.replace(CALLBACK_REGEX, "=" + jsonp + "$1");
-
-
-		// Handle JSONP-style loading
-		window[ jsonp ] = window[ jsonp ] || function( tmp ) {
-			data = tmp;
-			jsonpSuccess( requestSettings, callbackContext, mockHandler );
-			jsonpComplete( requestSettings, callbackContext, mockHandler );
-			// Garbage collect
-			window[ jsonp ] = undefined;
-
-			try {
-				delete window[ jsonp ];
-			} catch(e) {}
-
-			if ( head ) {
-				head.removeChild( script );
-			}
-		};
-	}
-
-	// The JSONP request was successful
-	function jsonpSuccess(requestSettings, callbackContext, mockHandler) {
-		// If a local callback was specified, fire it and pass it the data
-		if ( requestSettings.success ) {
-			requestSettings.success.call( callbackContext, mockHandler.responseText || "", status, {} );
-		}
-
-		// Fire the global callback
-		if ( requestSettings.global ) {
-			(requestSettings.context ? $(requestSettings.context) : $.event).trigger("ajaxSuccess", [{}, requestSettings]);
-		}
-	}
-
-	// The JSONP request was completed
-	function jsonpComplete(requestSettings, callbackContext) {
-		// Process result
-		if ( requestSettings.complete ) {
-			requestSettings.complete.call( callbackContext, {} , status );
-		}
-
-		// The request was completed
-		if ( requestSettings.global ) {
-			(requestSettings.context ? $(requestSettings.context) : $.event).trigger("ajaxComplete", [{}, requestSettings]);
-		}
-
-		// Handle the global AJAX counter
-		if ( requestSettings.global && ! --$.active ) {
-			$.event.trigger( "ajaxStop" );
-		}
-	}
-
-
-	// The core $.ajax replacement.
-	function handleAjax( url, origSettings ) {
-		var mockRequest, requestSettings, mockHandler, overrideCallback;
-
-		// If url is an object, simulate pre-1.5 signature
-		if ( typeof url === "object" ) {
-			origSettings = url;
-			url = undefined;
-		} else {
-			// work around to support 1.5 signature
-			origSettings = origSettings || {};
-			origSettings.url = url;
-		}
-
-		// Extend the original settings for the request
-		requestSettings = $.extend(true, {}, $.ajaxSettings, origSettings);
-
-		// Generic function to override callback methods for use with
-		// callback options (onAfterSuccess, onAfterError, onAfterComplete)
-		overrideCallback = function(action, mockHandler) {
-			var origHandler = origSettings[action.toLowerCase()];
-			return function() {
-				if ( $.isFunction(origHandler) ) {
-					origHandler.apply(this, [].slice.call(arguments));
-				}
-				mockHandler['onAfter' + action]();
-			};
-		};
-
-		// Iterate over our mock handlers (in registration order) until we find
-		// one that is willing to intercept the request
-		for(var k = 0; k < mockHandlers.length; k++) {
-			if ( !mockHandlers[k] ) {
-				continue;
-			}
-
-			mockHandler = getMockForRequest( mockHandlers[k], requestSettings );
-			if(!mockHandler) {
-				// No valid mock found for this request
-				continue;
-			}
-
-			mockedAjaxCalls.push(requestSettings);
-
-			// If logging is enabled, log the mock to the console
-			$.mockjaxSettings.log( mockHandler, requestSettings );
-
-
-			if ( requestSettings.dataType && requestSettings.dataType.toUpperCase() === 'JSONP' ) {
-				if ((mockRequest = processJsonpMock( requestSettings, mockHandler, origSettings ))) {
-					// This mock will handle the JSONP request
-					return mockRequest;
-				}
-			}
-
-
-			// Removed to fix #54 - keep the mocking data object intact
-			//mockHandler.data = requestSettings.data;
-
-			mockHandler.cache = requestSettings.cache;
-			mockHandler.timeout = requestSettings.timeout;
-			mockHandler.global = requestSettings.global;
-
-			// In the case of a timeout, we just need to ensure
-			// an actual jQuery timeout (That is, our reponse won't)
-			// return faster than the timeout setting.
-			if ( mockHandler.isTimeout ) {
-				if ( mockHandler.responseTime > 1 ) {
-					origSettings.timeout = mockHandler.responseTime - 1;
-				} else {
-					mockHandler.responseTime = 2;
-					origSettings.timeout = 1;
-				}
-				mockHandler.isTimeout = false;
-			}
-
-			// Set up onAfter[X] callback functions
-			if ( $.isFunction( mockHandler.onAfterSuccess ) ) {
-				origSettings.success = overrideCallback('Success', mockHandler);
-			}
-			if ( $.isFunction( mockHandler.onAfterError ) ) {
-				origSettings.error = overrideCallback('Error', mockHandler);
-			}
-			if ( $.isFunction( mockHandler.onAfterComplete ) ) {
-				origSettings.complete = overrideCallback('Complete', mockHandler);
-			}
-
-			copyUrlParameters(mockHandler, origSettings);
-
-			(function(mockHandler, requestSettings, origSettings, origHandler) {
-
-				mockRequest = _ajax.call($, $.extend(true, {}, origSettings, {
-					// Mock the XHR object
-					xhr: function() { return xhr( mockHandler, requestSettings, origSettings, origHandler ); }
-				}));
-			})(mockHandler, requestSettings, origSettings, mockHandlers[k]);
-
-			return mockRequest;
-		}
-
-		// We don't have a mock request
-		unmockedAjaxCalls.push(origSettings);
-		if($.mockjaxSettings.throwUnmocked === true) {
-			throw new Error('AJAX not mocked: ' + origSettings.url);
-		}
-		else { // trigger a normal request
-			return _ajax.apply($, [origSettings]);
-		}
-	}
-
-	/**
-	* Copies URL parameter values if they were captured by a regular expression
-	* @param {Object} mockHandler
-	* @param {Object} origSettings
-	*/
-	function copyUrlParameters(mockHandler, origSettings) {
-		//parameters aren't captured if the URL isn't a RegExp
-		if (!(mockHandler.url instanceof RegExp)) {
-			return;
-		}
-		//if no URL params were defined on the handler, don't attempt a capture
-		if (!mockHandler.hasOwnProperty('urlParams')) {
-			return;
-		}
-		var captures = mockHandler.url.exec(origSettings.url);
-		//the whole RegExp match is always the first value in the capture results
-		if (captures.length === 1) {
-			return;
-		}
-		captures.shift();
-		//use handler params as keys and capture resuts as values
-		var i = 0,
-		capturesLength = captures.length,
-		paramsLength = mockHandler.urlParams.length,
-		//in case the number of params specified is less than actual captures
-		maxIterations = Math.min(capturesLength, paramsLength),
-		paramValues = {};
-		for (i; i < maxIterations; i++) {
-			var key = mockHandler.urlParams[i];
-			paramValues[key] = captures[i];
-		}
-		origSettings.urlParams = paramValues;
-	}
-
-
-	// Public
-
-	$.extend({
-		ajax: handleAjax
-	});
-
-	$.mockjaxSettings = {
-		//url:        null,
-		//type:       'GET',
-		log:          function( mockHandler, requestSettings ) {
-			if ( mockHandler.logging === false ||
-				 ( typeof mockHandler.logging === 'undefined' && $.mockjaxSettings.logging === false ) ) {
-				return;
-			}
-			if ( window.console && console.log ) {
-				var message = 'MOCK ' + requestSettings.type.toUpperCase() + ': ' + requestSettings.url;
-				var request = $.extend({}, requestSettings);
-
-				if (typeof console.log === 'function') {
-					console.log(message, request);
-				} else {
-					try {
-						console.log( message + ' ' + JSON.stringify(request) );
-					} catch (e) {
-						console.log(message);
-					}
-				}
-			}
-		},
-		logging:       true,
-		status:        200,
-		statusText:    "OK",
-		responseTime:  500,
-		isTimeout:     false,
-		throwUnmocked: false,
-		contentType:   'text/plain',
-		response:      '',
-		responseText:  '',
-		responseXML:   '',
-		proxy:         '',
-		proxyType:     'GET',
-
-		lastModified:  null,
-		etag:          '',
-		headers: {
-			etag: 'IJF@H#@923uf8023hFO@I#H#',
-			'content-type' : 'text/plain'
-		}
-	};
-
-	$.mockjax = function(settings) {
-		var i = mockHandlers.length;
-		mockHandlers[i] = settings;
-		return i;
-	};
-	$.mockjax.clear = function(i) {
-		if ( arguments.length == 1 ) {
-			mockHandlers[i] = null;
-		} else {
-			mockHandlers = [];
-		}
-		mockedAjaxCalls = [];
-		unmockedAjaxCalls = [];
-	};
-	// support older, deprecated version
-	$.mockjaxClear = function(i) {
-		window.console && window.console.warn && window.console.warn( 'DEPRECATED: The $.mockjaxClear() method has been deprecated in 1.6.0. Please use $.mockjax.clear() as the older function will be removed soon!' );
-		$.mockjax.clear();
-	};
-	$.mockjax.handler = function(i) {
-		if ( arguments.length == 1 ) {
-			return mockHandlers[i];
-		}
-	};
-	$.mockjax.mockedAjaxCalls = function() {
-		return mockedAjaxCalls;
-	};
-	$.mockjax.unfiredHandlers = function() {
-		var results = [];
-		for (var i=0, len=mockHandlers.length; i<len; i++) {
-			var handler = mockHandlers[i];
-            if (handler !== null && !handler.fired) {
-				results.push(handler);
-			}
-		}
-		return results;
-	};
-	$.mockjax.unmockedAjaxCalls = function() {
-		return unmockedAjaxCalls;
-	};
-})(jQuery);

+ 0 - 35
public/libs/readmore-js/package.json

@@ -1,35 +0,0 @@
-{
-  "name": "readmore-js",
-  "version": "2.1.0",
-  "description": "A lightweight jQuery plugin for collapsing and expanding long blocks of text with \"Read more\" and \"Close\" links.",
-  "main": "readmore.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1",
-    "build": "./node_modules/gulp/bin/gulp.js compress"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/jedfoster/Readmore.js.git"
-  },
-  "keywords": [
-    "css",
-    "jquery",
-    "readmore",
-    "expand",
-    "collapse"
-  ],
-  "author": "Jed Foster <jed@jedfoster.com>",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/jedfoster/Readmore.js/issues"
-  },
-  "homepage": "https://github.com/jedfoster/Readmore.js",
-  "dependencies": {
-    "jquery": ">2.1.4"
-  },
-  "devDependencies": {
-    "gulp": "^3.9.0",
-    "gulp-rename": "^1.2.0",
-    "gulp-uglify": "^1.0.2"
-  }
-}

+ 0 - 342
public/libs/readmore-js/readmore.js

@@ -1,342 +0,0 @@
-/*!
- * @preserve
- *
- * Readmore.js jQuery plugin
- * Author: @jed_foster
- * Project home: http://jedfoster.github.io/Readmore.js
- * Licensed under the MIT license
- *
- * Debounce function from http://davidwalsh.name/javascript-debounce-function
- */
-
-/* global jQuery */
-
-(function(factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD
-    define(['jquery'], factory);
-  } else if (typeof exports === 'object') {
-    // CommonJS
-    module.exports = factory(require('jquery'));
-  } else {
-    // Browser globals
-    factory(jQuery);
-  }
-}(function($) {
-  'use strict';
-
-  var readmore = 'readmore',
-      defaults = {
-        speed: 100,
-        collapsedHeight: 200,
-        heightMargin: 16,
-        moreLink: '<a href="#">Read More</a>',
-        lessLink: '<a href="#">Close</a>',
-        embedCSS: true,
-        blockCSS: 'display: block; width: 100%;',
-        startOpen: false,
-
-        // callbacks
-        blockProcessed: function() {},
-        beforeToggle: function() {},
-        afterToggle: function() {}
-      },
-      cssEmbedded = {},
-      uniqueIdCounter = 0;
-
-  function debounce(func, wait, immediate) {
-    var timeout;
-
-    return function() {
-      var context = this, args = arguments;
-      var later = function() {
-        timeout = null;
-        if (! immediate) {
-          func.apply(context, args);
-        }
-      };
-      var callNow = immediate && !timeout;
-
-      clearTimeout(timeout);
-      timeout = setTimeout(later, wait);
-
-      if (callNow) {
-        func.apply(context, args);
-      }
-    };
-  }
-
-  function uniqueId(prefix) {
-    var id = ++uniqueIdCounter;
-
-    return String(prefix == null ? 'rmjs-' : prefix) + id;
-  }
-
-  function setBoxHeights(element) {
-    var el = element.clone().css({
-          height: 'auto',
-          width: element.width(),
-          maxHeight: 'none',
-          overflow: 'hidden'
-        }).insertAfter(element),
-        expandedHeight = el.outerHeight(),
-        cssMaxHeight = parseInt(el.css({maxHeight: ''}).css('max-height').replace(/[^-\d\.]/g, ''), 10),
-        defaultHeight = element.data('defaultHeight');
-
-    el.remove();
-
-    var collapsedHeight = cssMaxHeight || element.data('collapsedHeight') || defaultHeight;
-
-    // Store our measurements.
-    element.data({
-      expandedHeight: expandedHeight,
-      maxHeight: cssMaxHeight,
-      collapsedHeight: collapsedHeight
-    })
-    // and disable any `max-height` property set in CSS
-    .css({
-      maxHeight: 'none'
-    });
-  }
-
-  var resizeBoxes = debounce(function() {
-    $('[data-readmore]').each(function() {
-      var current = $(this),
-          isExpanded = (current.attr('aria-expanded') === 'true');
-
-      setBoxHeights(current);
-
-      current.css({
-        height: current.data( (isExpanded ? 'expandedHeight' : 'collapsedHeight') )
-      });
-    });
-  }, 100);
-
-  function embedCSS(options) {
-    if (! cssEmbedded[options.selector]) {
-      var styles = ' ';
-
-      if (options.embedCSS && options.blockCSS !== '') {
-        styles += options.selector + ' + [data-readmore-toggle], ' +
-          options.selector + '[data-readmore]{' +
-            options.blockCSS +
-          '}';
-      }
-
-      // Include the transition CSS even if embedCSS is false
-      styles += options.selector + '[data-readmore]{' +
-        'transition: height ' + options.speed + 'ms;' +
-        'overflow: hidden;' +
-      '}';
-
-      (function(d, u) {
-        var css = d.createElement('style');
-        css.type = 'text/css';
-
-        if (css.styleSheet) {
-          css.styleSheet.cssText = u;
-        }
-        else {
-          css.appendChild(d.createTextNode(u));
-        }
-
-        d.getElementsByTagName('head')[0].appendChild(css);
-      }(document, styles));
-
-      cssEmbedded[options.selector] = true;
-    }
-  }
-
-  function Readmore(element, options) {
-    this.element = element;
-
-    this.options = $.extend({}, defaults, options);
-
-    embedCSS(this.options);
-
-    this._defaults = defaults;
-    this._name = readmore;
-
-    this.init();
-
-    // IE8 chokes on `window.addEventListener`, so need to test for support.
-    if (window.addEventListener) {
-      // Need to resize boxes when the page has fully loaded.
-      window.addEventListener('load', resizeBoxes);
-      window.addEventListener('resize', resizeBoxes);
-    }
-    else {
-      window.attachEvent('load', resizeBoxes);
-      window.attachEvent('resize', resizeBoxes);
-    }
-  }
-
-
-  Readmore.prototype = {
-    init: function() {
-      var current = $(this.element);
-
-      current.data({
-        defaultHeight: this.options.collapsedHeight,
-        heightMargin: this.options.heightMargin
-      });
-
-      setBoxHeights(current);
-
-      var collapsedHeight = current.data('collapsedHeight'),
-          heightMargin = current.data('heightMargin');
-
-      if (current.outerHeight(true) <= collapsedHeight + heightMargin) {
-        // The block is shorter than the limit, so there's no need to truncate it.
-        if (this.options.blockProcessed && typeof this.options.blockProcessed === 'function') {
-          this.options.blockProcessed(current, false);
-        }
-        return true;
-      }
-      else {
-        var id = current.attr('id') || uniqueId(),
-            useLink = this.options.startOpen ? this.options.lessLink : this.options.moreLink;
-
-        current.attr({
-          'data-readmore': '',
-          'aria-expanded': this.options.startOpen,
-          'id': id
-        });
-
-        current.after($(useLink)
-          .on('click', (function(_this) {
-            return function(event) {
-              _this.toggle(this, current[0], event);
-            };
-          })(this))
-          .attr({
-            'data-readmore-toggle': id,
-            'aria-controls': id
-          }));
-
-        if (! this.options.startOpen) {
-          current.css({
-            height: collapsedHeight
-          });
-        }
-
-        if (this.options.blockProcessed && typeof this.options.blockProcessed === 'function') {
-          this.options.blockProcessed(current, true);
-        }
-      }
-    },
-
-    toggle: function(trigger, element, event) {
-      if (event) {
-        event.preventDefault();
-      }
-
-      if (! trigger) {
-        trigger = $('[aria-controls="' + this.element.id + '"]')[0];
-      }
-
-      if (! element) {
-        element = this.element;
-      }
-
-      var $element = $(element),
-          newHeight = '',
-          newLink = '',
-          expanded = false,
-          collapsedHeight = $element.data('collapsedHeight');
-
-      if ($element.height() <= collapsedHeight) {
-        newHeight = $element.data('expandedHeight') + 'px';
-        newLink = 'lessLink';
-        expanded = true;
-      }
-      else {
-        newHeight = collapsedHeight;
-        newLink = 'moreLink';
-      }
-
-      // Fire beforeToggle callback
-      // Since we determined the new "expanded" state above we're now out of sync
-      // with our true current state, so we need to flip the value of `expanded`
-      if (this.options.beforeToggle && typeof this.options.beforeToggle === 'function') {
-        this.options.beforeToggle(trigger, $element, ! expanded);
-      }
-
-      $element.css({'height': newHeight});
-
-      // Fire afterToggle callback
-      $element.on('transitionend', (function(_this) {
-        return function() {
-          if (_this.options.afterToggle && typeof _this.options.afterToggle === 'function') {
-            _this.options.afterToggle(trigger, $element, expanded);
-          }
-
-          $(this).attr({
-            'aria-expanded': expanded
-          }).off('transitionend');
-        }
-      })(this));
-
-      $(trigger).replaceWith($(this.options[newLink])
-        .on('click', (function(_this) {
-            return function(event) {
-              _this.toggle(this, element, event);
-            };
-          })(this))
-        .attr({
-          'data-readmore-toggle': $element.attr('id'),
-          'aria-controls': $element.attr('id')
-        }));
-    },
-
-    destroy: function() {
-      $(this.element).each(function() {
-        var current = $(this);
-
-        current.attr({
-          'data-readmore': null,
-          'aria-expanded': null
-        })
-          .css({
-            maxHeight: '',
-            height: ''
-          })
-          .next('[data-readmore-toggle]')
-          .remove();
-
-        current.removeData();
-      });
-    }
-  };
-
-
-  $.fn.readmore = function(options) {
-    var args = arguments,
-        selector = this.selector;
-
-    options = options || {};
-
-    if (typeof options === 'object') {
-      return this.each(function() {
-        if ($.data(this, 'plugin_' + readmore)) {
-          var instance = $.data(this, 'plugin_' + readmore);
-          instance.destroy.apply(instance);
-        }
-
-        options.selector = selector;
-
-        $.data(this, 'plugin_' + readmore, new Readmore(this, options));
-      });
-    }
-    else if (typeof options === 'string' && options[0] !== '_' && options !== 'init') {
-      return this.each(function () {
-        var instance = $.data(this, 'plugin_' + readmore);
-        if (instance instanceof Readmore && typeof instance[options] === 'function') {
-          instance[options].apply(instance, Array.prototype.slice.call(args, 1));
-        }
-      });
-    }
-  };
-
-}));
-

File diff suppressed because it is too large
+ 0 - 10
public/libs/readmore-js/readmore.min.js


+ 1 - 1
src/ThemeBundle/Resources/views/Layout/legacy_js.html.twig

@@ -2,4 +2,4 @@
 
 <script src="{{ url('legacy_public') ~ 'libs/ckeditor/ckeditor.js' }}"></script>
 {#<script src="{{ asset('libs/readmore-js/readmore.js') }}"></script>#}
-<script src="{{ url('legacy_public') ~ 'libs/js-cookie/src/js.cookie.js' }}"></script>
+{#<script src="{{ url('legacy_public') ~ 'js.cookie.js' }}"></script>#}

+ 21 - 0
webpack.config.js

@@ -33,8 +33,29 @@ Encore
     .enableSassLoader()
     .enableVueLoader()
     .autoProvidejQuery()
+    .copyFiles([
+        {
+            from: './node_modules/multiselect-two-sides/dist/js',
+            to: 'libs/multiselect-two-sides/dist/js/multiselect.js'
+        },
+        {
+            from: './node_modules/pwstrength-bootstrap/dist/',
+            pattern: /\.(js)$/,
+            to: 'libs/pwstrength-bootstrap/dist/pwstrength-bootstrap.js'
+        },
+        {
+            from: './node_modules/readmore-js',
+            pattern: /(readmore.js)$/,
+            to: 'libs/readmore-js/readmore.js'
+        },
+    ])
 ;
 
+// Encore.addPlugin(new copyWebpackPlugin([{
+//     from: 'assets/css/themes/' + theme + '/images',
+//     to: 'css/themes/' + theme + '/images'
+// };
+
 var themes = [
     'chamilo'
 ];

File diff suppressed because it is too large
+ 267 - 341
yarn.lock


Some files were not shown because too many files changed in this diff