diff --git a/package.json b/package.json
index d9370a8e1d8a0a50df7853437c080f542ef717a4..287ab6dbc86dcb0a0affed2564f339570d1c8406 100644
--- a/package.json
+++ b/package.json
@@ -35,6 +35,7 @@
     "icheck": "^1.0.2",
     "imagemin": "^5.3.1",
     "jquery-slimscroll": "^1.3.8",
+    "jquery-ui": "^1.12.1",
     "jquery-ui-dist": "^1.12.1",
     "jquery.iframe-transport": "^1.0.0",
     "less": "less/less.js#efa6eb5306f28a7ef7e235d79ce854b780345591",
diff --git a/public/js/vendor.js b/public/js/vendor.js
index 4082f972d56aacaed80389822f8975c376a58e8e..713a2d6aa30b314adbe9dd53d29102d13ea6e143 100644
Binary files a/public/js/vendor.js and b/public/js/vendor.js differ
diff --git a/public/mix-manifest.json b/public/mix-manifest.json
index 0e4716c0c0a75280ef3b8f12ca1e527b6dbe543f..a9b8063425d18436639b0d878d604e9f647657c3 100644
--- a/public/mix-manifest.json
+++ b/public/mix-manifest.json
@@ -23,7 +23,7 @@
     "/css/overrides.css": "/css/overrides.css?id=6b828d7767ff152a582b",
     "/css/dist/all.css": "/css/dist/all.css?id=52eeb0ac804d01ab930e",
     "/css/build/all.css": "/css/build/all.css?id=52eeb0ac804d01ab930e",
-    "/js/vendor.js": "/js/vendor.js?id=712f037630011ba2d02c",
+    "/js/vendor.js": "/js/vendor.js?id=0b5b63ceb817e544cab2",
     "/js/html5shiv.min.js": "/js/html5shiv.min.js?id=ba846cb704dbfbc5f1b3",
     "/js/respond.min.js": "/js/respond.min.js?id=afc1984a3d17110449dc",
 >>>>>>> Cleaned up JS
diff --git a/resources/assets/js/admin-lte-options.js b/resources/assets/js/admin-lte-options.js
new file mode 100644
index 0000000000000000000000000000000000000000..885a9cec92de77fe24f734469c56b1ce16c2a846
--- /dev/null
+++ b/resources/assets/js/admin-lte-options.js
@@ -0,0 +1,696 @@
+/*! AdminLTE app.js
+ * ================
+ * Main JS application file for AdminLTE v2. This file
+ * should be included in all pages. It controls some layout
+ * options and implements exclusive AdminLTE plugins.
+ *
+ * @Author  Almsaeed Studio
+ * @Support <http://www.almsaeedstudio.com>
+ * @Email   <support@almsaeedstudio.com>
+ * @version 2.3.0
+ * @license MIT <http://opensource.org/licenses/MIT>
+ */
+
+//Make sure jQuery has been loaded before app.js
+if (typeof jQuery === "undefined") {
+    throw new Error("AdminLTE requires jQuery");
+  }
+  
+  
+  /* AdminLTE
+   *
+   * @type Object
+   * @description $.AdminLTE is the main object for the template's app.
+   *              It's used for implementing functions and options related
+   *              to the template. Keeping everything wrapped in an object
+   *              prevents conflict with other plugins and is a better
+   *              way to organize our code.
+   */
+  $.AdminLTE = {};
+  
+  /* --------------------
+   * - AdminLTE Options -
+   * --------------------
+   * Modify these options to suit your implementation
+   */
+  $.AdminLTE.options = {
+    //Add slimscroll to navbar menus
+    //This requires you to load the slimscroll plugin
+    //in every page before app.js
+    navbarMenuSlimscroll: true,
+    navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar
+    navbarMenuHeight: "200px", //The height of the inner menu
+    //General animation speed for JS animated elements such as box collapse/expand and
+    //sidebar treeview slide up/down. This options accepts an integer as milliseconds,
+    //'fast', 'normal', or 'slow'
+    animationSpeed: 500,
+    //Sidebar push menu toggle button selector
+    sidebarToggleSelector: "[data-toggle='offcanvas']",
+    //Activate sidebar push menu
+    sidebarPushMenu: true,
+    //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin)
+    sidebarSlimScroll: true,
+    //Enable sidebar expand on hover effect for sidebar mini
+    //This option is forced to true if both the fixed layout and sidebar mini
+    //are used together
+    sidebarExpandOnHover: false,
+    //BoxRefresh Plugin
+    enableBoxRefresh: true,
+    //Bootstrap.js tooltip
+    enableBSToppltip: true,
+    BSTooltipSelector: "[data-toggle='tooltip']",
+    //Enable Fast Click. Fastclick.js creates a more
+    //native touch experience with touch devices. If you
+    //choose to enable the plugin, make sure you load the script
+    //before AdminLTE's app.js
+    enableFastclick: false,
+    //Control Sidebar Options
+    enableControlSidebar: true,
+    controlSidebarOptions: {
+      //Which button should trigger the open/close event
+      toggleBtnSelector: "[data-toggle='control-sidebar']",
+      //The sidebar selector
+      selector: ".control-sidebar",
+      //Enable slide over content
+      slide: true
+    },
+    //Box Widget Plugin. Enable this plugin
+    //to allow boxes to be collapsed and/or removed
+    enableBoxWidget: true,
+    //Box Widget plugin options
+    boxWidgetOptions: {
+      boxWidgetIcons: {
+        //Collapse icon
+        collapse: 'fa-minus',
+        //Open icon
+        open: 'fa-plus',
+        //Remove icon
+        remove: 'fa-times'
+      },
+      boxWidgetSelectors: {
+        //Remove button selector
+        remove: '[data-widget="remove"]',
+        //Collapse button selector
+        collapse: '[data-widget="collapse"]'
+      }
+    },
+    //Direct Chat plugin options
+    directChat: {
+      //Enable direct chat by default
+      enable: true,
+      //The button to open and close the chat contacts pane
+      contactToggleSelector: '[data-widget="chat-pane-toggle"]'
+    },
+    //Define the set of colors to use globally around the website
+    colors: {
+      lightBlue: "#3c8dbc",
+      red: "#f56954",
+      green: "#00a65a",
+      aqua: "#00c0ef",
+      yellow: "#f39c12",
+      blue: "#0073b7",
+      navy: "#001F3F",
+      teal: "#39CCCC",
+      olive: "#3D9970",
+      lime: "#01FF70",
+      orange: "#FF851B",
+      fuchsia: "#F012BE",
+      purple: "#8E24AA",
+      maroon: "#D81B60",
+      black: "#222222",
+      gray: "#d2d6de"
+    },
+    //The standard screen sizes that bootstrap uses.
+    //If you change these in the variables.less file, change
+    //them here too.
+    screenSizes: {
+      xs: 480,
+      sm: 768,
+      md: 992,
+      lg: 1200
+    }
+  };
+  
+  /* ------------------
+   * - Implementation -
+   * ------------------
+   * The next block of code implements AdminLTE's
+   * functions and plugins as specified by the
+   * options above.
+   */
+  $(function () {
+    "use strict";
+  
+    //Fix for IE page transitions
+    $("body").removeClass("hold-transition");
+  
+    //Extend options if external options exist
+    if (typeof AdminLTEOptions !== "undefined") {
+      $.extend(true,
+              $.AdminLTE.options,
+              AdminLTEOptions);
+    }
+  
+    //Easy access to options
+    var o = $.AdminLTE.options;
+  
+    //Set up the object
+    _init();
+  
+    //Activate the layout maker
+    $.AdminLTE.layout.activate();
+  
+    //Enable sidebar tree view controls
+    $.AdminLTE.tree('.sidebar');
+  
+    //Enable control sidebar
+    if (o.enableControlSidebar) {
+      $.AdminLTE.controlSidebar.activate();
+    }
+  
+    //Add slimscroll to navbar dropdown
+    if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') {
+      $(".navbar .menu").slimscroll({
+        height: o.navbarMenuHeight,
+        alwaysVisible: false,
+        size: o.navbarMenuSlimscrollWidth
+      }).css("width", "100%");
+    }
+  
+    //Activate sidebar push menu
+    if (o.sidebarPushMenu) {
+      $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector);
+    }
+  
+    //Activate Bootstrap tooltip
+    if (o.enableBSToppltip) {
+        $.widget.bridge('uitooltip', $.ui.tooltip);
+      $('body').tooltip({
+        selector: o.BSTooltipSelector
+      });
+  
+    }
+  
+    //Activate box widget
+    if (o.enableBoxWidget) {
+      $.AdminLTE.boxWidget.activate();
+    }
+  
+    //Activate fast click
+    if (o.enableFastclick && typeof FastClick != 'undefined') {
+      FastClick.attach(document.body);
+    }
+  
+    //Activate direct chat widget
+    if (o.directChat.enable) {
+      $(document).on('click', o.directChat.contactToggleSelector, function () {
+        var box = $(this).parents('.direct-chat').first();
+        box.toggleClass('direct-chat-contacts-open');
+      });
+    }
+  
+    /*
+     * INITIALIZE BUTTON TOGGLE
+     * ------------------------
+     */
+    $('.btn-group[data-toggle="btn-toggle"]').each(function () {
+      var group = $(this);
+      $(this).find(".btn").on('click', function (e) {
+        group.find(".btn.active").removeClass("active");
+        $(this).addClass("active");
+        e.preventDefault();
+      });
+  
+    });
+  });
+  
+  /* ----------------------------------
+   * - Initialize the AdminLTE Object -
+   * ----------------------------------
+   * All AdminLTE functions are implemented below.
+   */
+  function _init() {
+    'use strict';
+    /* Layout
+     * ======
+     * Fixes the layout height in case min-height fails.
+     *
+     * @type Object
+     * @usage $.AdminLTE.layout.activate()
+     *        $.AdminLTE.layout.fix()
+     *        $.AdminLTE.layout.fixSidebar()
+     */
+    $.AdminLTE.layout = {
+      activate: function () {
+        var _this = this;
+        _this.fix();
+        _this.fixSidebar();
+        $(window, ".wrapper").resize(function () {
+          _this.fix();
+          _this.fixSidebar();
+        });
+      },
+      fix: function () {
+        //Get window height and the wrapper height
+        var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight();
+        var window_height = $(window).height();
+        var sidebar_height = $(".sidebar").height();
+        //Set the min-height of the content and sidebar based on the
+        //the height of the document.
+        if ($("body").hasClass("fixed")) {
+          $(".content-wrapper, .right-side").css('min-height', window_height - $('.main-footer').outerHeight());
+        } else {
+          var postSetWidth;
+          if (window_height >= sidebar_height) {
+            $(".content-wrapper, .right-side").css('min-height', window_height - neg);
+            postSetWidth = window_height - neg;
+          } else {
+            $(".content-wrapper, .right-side").css('min-height', sidebar_height);
+            postSetWidth = sidebar_height;
+          }
+  
+          //Fix for the control sidebar height
+          var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector);
+          if (typeof controlSidebar !== "undefined") {
+            if (controlSidebar.height() > postSetWidth)
+              $(".content-wrapper, .right-side").css('min-height', controlSidebar.height());
+          }
+  
+        }
+      },
+      fixSidebar: function () {
+        //Make sure the body tag has the .fixed class
+        if (!$("body").hasClass("fixed")) {
+          if (typeof $.fn.slimScroll != 'undefined') {
+            $(".sidebar").slimScroll({destroy: true}).height("auto");
+          }
+          return;
+        } else if (typeof $.fn.slimScroll == 'undefined' && window.console) {
+          window.console.error("Error: the fixed layout requires the slimscroll plugin!");
+        }
+        //Enable slimscroll for fixed layout
+        if ($.AdminLTE.options.sidebarSlimScroll) {
+          if (typeof $.fn.slimScroll != 'undefined') {
+            //Destroy if it exists
+            $(".sidebar").slimScroll({destroy: true}).height("auto");
+            //Add slimscroll
+            $(".sidebar").slimscroll({
+              height: ($(window).height() - $(".main-header").height()) + "px",
+              color: "rgba(0,0,0,0.2)",
+              size: "3px"
+            });
+          }
+        }
+      }
+    };
+  
+    /* PushMenu()
+     * ==========
+     * Adds the push menu functionality to the sidebar.
+     *
+     * @type Function
+     * @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']")
+     */
+    $.AdminLTE.pushMenu = {
+      activate: function (toggleBtn) {
+        //Get the screen sizes
+        var screenSizes = $.AdminLTE.options.screenSizes;
+  
+        //Enable sidebar toggle
+        $(toggleBtn).on('click', function (e) {
+          e.preventDefault();
+  
+          //Enable sidebar push menu
+          if ($(window).width() > (screenSizes.sm - 1)) {
+            if ($("body").hasClass('sidebar-collapse')) {
+              $("body").removeClass('sidebar-collapse').trigger('expanded.pushMenu');
+            } else {
+              $("body").addClass('sidebar-collapse').trigger('collapsed.pushMenu');
+            }
+          }
+          //Handle sidebar push menu for small screens
+          else {
+            if ($("body").hasClass('sidebar-open')) {
+              $("body").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu');
+            } else {
+              $("body").addClass('sidebar-open').trigger('expanded.pushMenu');
+            }
+          }
+        });
+  
+        $(".content-wrapper").click(function () {
+          //Enable hide menu when clicking on the content-wrapper on small screens
+          if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open")) {
+            $("body").removeClass('sidebar-open');
+          }
+        });
+  
+        //Enable expand on hover for sidebar mini
+        if ($.AdminLTE.options.sidebarExpandOnHover
+                || ($('body').hasClass('fixed')
+                        && $('body').hasClass('sidebar-mini'))) {
+          this.expandOnHover();
+        }
+      },
+      expandOnHover: function () {
+        var _this = this;
+        var screenWidth = $.AdminLTE.options.screenSizes.sm - 1;
+        //Expand sidebar on hover
+        $('.main-sidebar').hover(function () {
+          if ($('body').hasClass('sidebar-mini')
+                  && $("body").hasClass('sidebar-collapse')
+                  && $(window).width() > screenWidth) {
+            _this.expand();
+          }
+        }, function () {
+          if ($('body').hasClass('sidebar-mini')
+                  && $('body').hasClass('sidebar-expanded-on-hover')
+                  && $(window).width() > screenWidth) {
+            _this.collapse();
+          }
+        });
+      },
+      expand: function () {
+        $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover');
+      },
+      collapse: function () {
+        if ($('body').hasClass('sidebar-expanded-on-hover')) {
+          $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse');
+        }
+      }
+    };
+  
+    /* Tree()
+     * ======
+     * Converts the sidebar into a multilevel
+     * tree view menu.
+     *
+     * @type Function
+     * @Usage: $.AdminLTE.tree('.sidebar')
+     */
+    $.AdminLTE.tree = function (menu) {
+      var _this = this;
+      var animationSpeed = $.AdminLTE.options.animationSpeed;
+      $(document).on('click', menu + ' li a', function (e) {
+        //Get the clicked link and the next element
+        var $this = $(this);
+        var checkElement = $this.next();
+  
+        //Check if the next element is a menu and is visible
+        if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible'))) {
+          //Close the menu
+          checkElement.slideUp(animationSpeed, function () {
+            checkElement.removeClass('menu-open');
+            //Fix the layout in case the sidebar stretches over the height of the window
+            //_this.layout.fix();
+          });
+          checkElement.parent("li").removeClass("active");
+        }
+        //If the menu is not visible
+        else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) {
+          //Get the parent menu
+          var parent = $this.parents('ul').first();
+          //Close all open menus within the parent
+          var ul = parent.find('ul:visible').slideUp(animationSpeed);
+          //Remove the menu-open class from the parent
+          ul.removeClass('menu-open');
+          //Get the parent li
+          var parent_li = $this.parent("li");
+  
+          //Open the target menu and add the menu-open class
+          checkElement.slideDown(animationSpeed, function () {
+            //Add the class active to the parent li
+            checkElement.addClass('menu-open');
+            parent.find('li.active').removeClass('active');
+            parent_li.addClass('active');
+            //Fix the layout in case the sidebar stretches over the height of the window
+            _this.layout.fix();
+          });
+        }
+        //if this isn't a link, prevent the page from being redirected
+        if (checkElement.is('.treeview-menu')) {
+          e.preventDefault();
+        }
+      });
+    };
+  
+    /* ControlSidebar
+     * ==============
+     * Adds functionality to the right sidebar
+     *
+     * @type Object
+     * @usage $.AdminLTE.controlSidebar.activate(options)
+     */
+    $.AdminLTE.controlSidebar = {
+      //instantiate the object
+      activate: function () {
+        //Get the object
+        var _this = this;
+        //Update options
+        var o = $.AdminLTE.options.controlSidebarOptions;
+        //Get the sidebar
+        var sidebar = $(o.selector);
+        //The toggle button
+        var btn = $(o.toggleBtnSelector);
+  
+        //Listen to the click event
+        btn.on('click', function (e) {
+          e.preventDefault();
+          //If the sidebar is not open
+          if (!sidebar.hasClass('control-sidebar-open')
+                  && !$('body').hasClass('control-sidebar-open')) {
+            //Open the sidebar
+            _this.open(sidebar, o.slide);
+          } else {
+            _this.close(sidebar, o.slide);
+          }
+        });
+  
+        //If the body has a boxed layout, fix the sidebar bg position
+        var bg = $(".control-sidebar-bg");
+        _this._fix(bg);
+  
+        //If the body has a fixed layout, make the control sidebar fixed
+        if ($('body').hasClass('fixed')) {
+          _this._fixForFixed(sidebar);
+        } else {
+          //If the content height is less than the sidebar's height, force max height
+          if ($('.content-wrapper, .right-side').height() < sidebar.height()) {
+            _this._fixForContent(sidebar);
+          }
+        }
+      },
+      //Open the control sidebar
+      open: function (sidebar, slide) {
+        //Slide over content
+        if (slide) {
+          sidebar.addClass('control-sidebar-open');
+        } else {
+          //Push the content by adding the open class to the body instead
+          //of the sidebar itself
+          $('body').addClass('control-sidebar-open');
+        }
+      },
+      //Close the control sidebar
+      close: function (sidebar, slide) {
+        if (slide) {
+          sidebar.removeClass('control-sidebar-open');
+        } else {
+          $('body').removeClass('control-sidebar-open');
+        }
+      },
+      _fix: function (sidebar) {
+        var _this = this;
+        if ($("body").hasClass('layout-boxed')) {
+          sidebar.css('position', 'absolute');
+          sidebar.height($(".wrapper").height());
+          $(window).resize(function () {
+            _this._fix(sidebar);
+          });
+        } else {
+          sidebar.css({
+            'position': 'fixed',
+            'height': 'auto'
+          });
+        }
+      },
+      _fixForFixed: function (sidebar) {
+        sidebar.css({
+          'position': 'fixed',
+          'max-height': '100%',
+          'overflow': 'auto',
+          'padding-bottom': '50px'
+        });
+      },
+      _fixForContent: function (sidebar) {
+        $(".content-wrapper, .right-side").css('min-height', sidebar.height());
+      }
+    };
+  
+    /* BoxWidget
+     * =========
+     * BoxWidget is a plugin to handle collapsing and
+     * removing boxes from the screen.
+     *
+     * @type Object
+     * @usage $.AdminLTE.boxWidget.activate()
+     *        Set all your options in the main $.AdminLTE.options object
+     */
+    $.AdminLTE.boxWidget = {
+      selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,
+      icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,
+      animationSpeed: $.AdminLTE.options.animationSpeed,
+      activate: function (_box) {
+        var _this = this;
+        if (!_box) {
+          _box = document; // activate all boxes per default
+        }
+        //Listen for collapse event triggers
+        $(_box).on('click', _this.selectors.collapse, function (e) {
+          e.preventDefault();
+          _this.collapse($(this));
+        });
+  
+        //Listen for remove event triggers
+        $(_box).on('click', _this.selectors.remove, function (e) {
+          e.preventDefault();
+          _this.remove($(this));
+        });
+      },
+      collapse: function (element) {
+        var _this = this;
+        //Find the box parent
+        var box = element.parents(".box").first();
+        //Find the body and the footer
+        var box_content = box.find("> .box-body, > .box-footer, > form  >.box-body, > form > .box-footer");
+        if (!box.hasClass("collapsed-box")) {
+          //Convert minus into plus
+          element.children(":first")
+                  .removeClass(_this.icons.collapse)
+                  .addClass(_this.icons.open);
+          //Hide the content
+          box_content.slideUp(_this.animationSpeed, function () {
+            box.addClass("collapsed-box");
+          });
+        } else {
+          //Convert plus into minus
+          element.children(":first")
+                  .removeClass(_this.icons.open)
+                  .addClass(_this.icons.collapse);
+          //Show the content
+          box_content.slideDown(_this.animationSpeed, function () {
+            box.removeClass("collapsed-box");
+          });
+        }
+      },
+      remove: function (element) {
+        //Find the box parent
+        var box = element.parents(".box").first();
+        box.slideUp(this.animationSpeed);
+      }
+    };
+  }
+  
+  /* ------------------
+   * - Custom Plugins -
+   * ------------------
+   * All custom plugins are defined below.
+   */
+  
+  /*
+   * BOX REFRESH BUTTON
+   * ------------------
+   * This is a custom plugin to use with the component BOX. It allows you to add
+   * a refresh button to the box. It converts the box's state to a loading state.
+   *
+   * @type plugin
+   * @usage $("#box-widget").boxRefresh( options );
+   */
+  (function ($) {
+  
+    "use strict";
+  
+    $.fn.boxRefresh = function (options) {
+  
+      // Render options
+      var settings = $.extend({
+        //Refresh button selector
+        trigger: ".refresh-btn",
+        //File source to be loaded (e.g: ajax/src.php)
+        source: "",
+        //Callbacks
+        onLoadStart: function (box) {
+          return box;
+        }, //Right after the button has been clicked
+        onLoadDone: function (box) {
+          return box;
+        } //When the source has been loaded
+  
+      }, options);
+  
+      //The overlay
+      var overlay = $('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');
+  
+      return this.each(function () {
+        //if a source is specified
+        if (settings.source === "") {
+          if (window.console) {
+            window.console.log("Please specify a source first - boxRefresh()");
+          }
+          return;
+        }
+        //the box
+        var box = $(this);
+        //the button
+        var rBtn = box.find(settings.trigger).first();
+  
+        //On trigger click
+        rBtn.on('click', function (e) {
+          e.preventDefault();
+          //Add loading overlay
+          start(box);
+  
+          //Perform ajax call
+          box.find(".box-body").load(settings.source, function () {
+            done(box);
+          });
+        });
+      });
+  
+      function start(box) {
+        //Add overlay and loading img
+        box.append(overlay);
+  
+        settings.onLoadStart.call(box);
+      }
+  
+      function done(box) {
+        //Remove overlay and loading img
+        box.find(overlay).remove();
+  
+        settings.onLoadDone.call(box);
+      }
+  
+    };
+  
+  })(jQuery);
+  
+  /*
+   * EXPLICIT BOX ACTIVATION
+   * -----------------------
+   * This is a custom plugin to use with the component BOX. It allows you to activate
+   * a box inserted in the DOM after the app.js was loaded.
+   *
+   * @type plugin
+   * @usage $("#box-widget").activateBox();
+   */
+  (function ($) {
+  
+    'use strict';
+  
+    $.fn.activateBox = function () {
+      $.AdminLTE.boxWidget.activate(this);
+    };
+  
+  })(jQuery);
+  
\ No newline at end of file
diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js
deleted file mode 100755
index 6453fc734787bf5d814083b59787e174e9ec7d24..0000000000000000000000000000000000000000
--- a/resources/assets/js/app.js
+++ /dev/null
@@ -1,695 +0,0 @@
-/*! AdminLTE app.js
- * ================
- * Main JS application file for AdminLTE v2. This file
- * should be included in all pages. It controls some layout
- * options and implements exclusive AdminLTE plugins.
- *
- * @Author  Almsaeed Studio
- * @Support <http://www.almsaeedstudio.com>
- * @Email   <support@almsaeedstudio.com>
- * @version 2.3.0
- * @license MIT <http://opensource.org/licenses/MIT>
- */
-
-//Make sure jQuery has been loaded before app.js
-if (typeof jQuery === "undefined") {
-  throw new Error("AdminLTE requires jQuery");
-}
-
-
-/* AdminLTE
- *
- * @type Object
- * @description $.AdminLTE is the main object for the template's app.
- *              It's used for implementing functions and options related
- *              to the template. Keeping everything wrapped in an object
- *              prevents conflict with other plugins and is a better
- *              way to organize our code.
- */
-$.AdminLTE = {};
-
-/* --------------------
- * - AdminLTE Options -
- * --------------------
- * Modify these options to suit your implementation
- */
-$.AdminLTE.options = {
-  //Add slimscroll to navbar menus
-  //This requires you to load the slimscroll plugin
-  //in every page before app.js
-  navbarMenuSlimscroll: true,
-  navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar
-  navbarMenuHeight: "200px", //The height of the inner menu
-  //General animation speed for JS animated elements such as box collapse/expand and
-  //sidebar treeview slide up/down. This options accepts an integer as milliseconds,
-  //'fast', 'normal', or 'slow'
-  animationSpeed: 500,
-  //Sidebar push menu toggle button selector
-  sidebarToggleSelector: "[data-toggle='offcanvas']",
-  //Activate sidebar push menu
-  sidebarPushMenu: true,
-  //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin)
-  sidebarSlimScroll: true,
-  //Enable sidebar expand on hover effect for sidebar mini
-  //This option is forced to true if both the fixed layout and sidebar mini
-  //are used together
-  sidebarExpandOnHover: false,
-  //BoxRefresh Plugin
-  enableBoxRefresh: true,
-  //Bootstrap.js tooltip
-  enableBSToppltip: true,
-  BSTooltipSelector: "[data-toggle='tooltip']",
-  //Enable Fast Click. Fastclick.js creates a more
-  //native touch experience with touch devices. If you
-  //choose to enable the plugin, make sure you load the script
-  //before AdminLTE's app.js
-  enableFastclick: false,
-  //Control Sidebar Options
-  enableControlSidebar: true,
-  controlSidebarOptions: {
-    //Which button should trigger the open/close event
-    toggleBtnSelector: "[data-toggle='control-sidebar']",
-    //The sidebar selector
-    selector: ".control-sidebar",
-    //Enable slide over content
-    slide: true
-  },
-  //Box Widget Plugin. Enable this plugin
-  //to allow boxes to be collapsed and/or removed
-  enableBoxWidget: true,
-  //Box Widget plugin options
-  boxWidgetOptions: {
-    boxWidgetIcons: {
-      //Collapse icon
-      collapse: 'fa-minus',
-      //Open icon
-      open: 'fa-plus',
-      //Remove icon
-      remove: 'fa-times'
-    },
-    boxWidgetSelectors: {
-      //Remove button selector
-      remove: '[data-widget="remove"]',
-      //Collapse button selector
-      collapse: '[data-widget="collapse"]'
-    }
-  },
-  //Direct Chat plugin options
-  directChat: {
-    //Enable direct chat by default
-    enable: true,
-    //The button to open and close the chat contacts pane
-    contactToggleSelector: '[data-widget="chat-pane-toggle"]'
-  },
-  //Define the set of colors to use globally around the website
-  colors: {
-    lightBlue: "#3c8dbc",
-    red: "#f56954",
-    green: "#00a65a",
-    aqua: "#00c0ef",
-    yellow: "#f39c12",
-    blue: "#0073b7",
-    navy: "#001F3F",
-    teal: "#39CCCC",
-    olive: "#3D9970",
-    lime: "#01FF70",
-    orange: "#FF851B",
-    fuchsia: "#F012BE",
-    purple: "#8E24AA",
-    maroon: "#D81B60",
-    black: "#222222",
-    gray: "#d2d6de"
-  },
-  //The standard screen sizes that bootstrap uses.
-  //If you change these in the variables.less file, change
-  //them here too.
-  screenSizes: {
-    xs: 480,
-    sm: 768,
-    md: 992,
-    lg: 1200
-  }
-};
-
-/* ------------------
- * - Implementation -
- * ------------------
- * The next block of code implements AdminLTE's
- * functions and plugins as specified by the
- * options above.
- */
-$(function () {
-  "use strict";
-
-  //Fix for IE page transitions
-  $("body").removeClass("hold-transition");
-
-  //Extend options if external options exist
-  if (typeof AdminLTEOptions !== "undefined") {
-    $.extend(true,
-            $.AdminLTE.options,
-            AdminLTEOptions);
-  }
-
-  //Easy access to options
-  var o = $.AdminLTE.options;
-
-  //Set up the object
-  _init();
-
-  //Activate the layout maker
-  $.AdminLTE.layout.activate();
-
-  //Enable sidebar tree view controls
-  $.AdminLTE.tree('.sidebar');
-
-  //Enable control sidebar
-  if (o.enableControlSidebar) {
-    $.AdminLTE.controlSidebar.activate();
-  }
-
-  //Add slimscroll to navbar dropdown
-  if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') {
-    $(".navbar .menu").slimscroll({
-      height: o.navbarMenuHeight,
-      alwaysVisible: false,
-      size: o.navbarMenuSlimscrollWidth
-    }).css("width", "100%");
-  }
-
-  //Activate sidebar push menu
-  if (o.sidebarPushMenu) {
-    $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector);
-  }
-
-  //Activate Bootstrap tooltip
-  if (o.enableBSToppltip) {
-      $.widget.bridge('uitooltip', $.ui.tooltip);
-    $('body').tooltip({
-      selector: o.BSTooltipSelector
-    });
-
-  }
-
-  //Activate box widget
-  if (o.enableBoxWidget) {
-    $.AdminLTE.boxWidget.activate();
-  }
-
-  //Activate fast click
-  if (o.enableFastclick && typeof FastClick != 'undefined') {
-    FastClick.attach(document.body);
-  }
-
-  //Activate direct chat widget
-  if (o.directChat.enable) {
-    $(document).on('click', o.directChat.contactToggleSelector, function () {
-      var box = $(this).parents('.direct-chat').first();
-      box.toggleClass('direct-chat-contacts-open');
-    });
-  }
-
-  /*
-   * INITIALIZE BUTTON TOGGLE
-   * ------------------------
-   */
-  $('.btn-group[data-toggle="btn-toggle"]').each(function () {
-    var group = $(this);
-    $(this).find(".btn").on('click', function (e) {
-      group.find(".btn.active").removeClass("active");
-      $(this).addClass("active");
-      e.preventDefault();
-    });
-
-  });
-});
-
-/* ----------------------------------
- * - Initialize the AdminLTE Object -
- * ----------------------------------
- * All AdminLTE functions are implemented below.
- */
-function _init() {
-  'use strict';
-  /* Layout
-   * ======
-   * Fixes the layout height in case min-height fails.
-   *
-   * @type Object
-   * @usage $.AdminLTE.layout.activate()
-   *        $.AdminLTE.layout.fix()
-   *        $.AdminLTE.layout.fixSidebar()
-   */
-  $.AdminLTE.layout = {
-    activate: function () {
-      var _this = this;
-      _this.fix();
-      _this.fixSidebar();
-      $(window, ".wrapper").resize(function () {
-        _this.fix();
-        _this.fixSidebar();
-      });
-    },
-    fix: function () {
-      //Get window height and the wrapper height
-      var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight();
-      var window_height = $(window).height();
-      var sidebar_height = $(".sidebar").height();
-      //Set the min-height of the content and sidebar based on the
-      //the height of the document.
-      if ($("body").hasClass("fixed")) {
-        $(".content-wrapper, .right-side").css('min-height', window_height - $('.main-footer').outerHeight());
-      } else {
-        var postSetWidth;
-        if (window_height >= sidebar_height) {
-          $(".content-wrapper, .right-side").css('min-height', window_height - neg);
-          postSetWidth = window_height - neg;
-        } else {
-          $(".content-wrapper, .right-side").css('min-height', sidebar_height);
-          postSetWidth = sidebar_height;
-        }
-
-        //Fix for the control sidebar height
-        var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector);
-        if (typeof controlSidebar !== "undefined") {
-          if (controlSidebar.height() > postSetWidth)
-            $(".content-wrapper, .right-side").css('min-height', controlSidebar.height());
-        }
-
-      }
-    },
-    fixSidebar: function () {
-      //Make sure the body tag has the .fixed class
-      if (!$("body").hasClass("fixed")) {
-        if (typeof $.fn.slimScroll != 'undefined') {
-          $(".sidebar").slimScroll({destroy: true}).height("auto");
-        }
-        return;
-      } else if (typeof $.fn.slimScroll == 'undefined' && window.console) {
-        window.console.error("Error: the fixed layout requires the slimscroll plugin!");
-      }
-      //Enable slimscroll for fixed layout
-      if ($.AdminLTE.options.sidebarSlimScroll) {
-        if (typeof $.fn.slimScroll != 'undefined') {
-          //Destroy if it exists
-          $(".sidebar").slimScroll({destroy: true}).height("auto");
-          //Add slimscroll
-          $(".sidebar").slimscroll({
-            height: ($(window).height() - $(".main-header").height()) + "px",
-            color: "rgba(0,0,0,0.2)",
-            size: "3px"
-          });
-        }
-      }
-    }
-  };
-
-  /* PushMenu()
-   * ==========
-   * Adds the push menu functionality to the sidebar.
-   *
-   * @type Function
-   * @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']")
-   */
-  $.AdminLTE.pushMenu = {
-    activate: function (toggleBtn) {
-      //Get the screen sizes
-      var screenSizes = $.AdminLTE.options.screenSizes;
-
-      //Enable sidebar toggle
-      $(toggleBtn).on('click', function (e) {
-        e.preventDefault();
-
-        //Enable sidebar push menu
-        if ($(window).width() > (screenSizes.sm - 1)) {
-          if ($("body").hasClass('sidebar-collapse')) {
-            $("body").removeClass('sidebar-collapse').trigger('expanded.pushMenu');
-          } else {
-            $("body").addClass('sidebar-collapse').trigger('collapsed.pushMenu');
-          }
-        }
-        //Handle sidebar push menu for small screens
-        else {
-          if ($("body").hasClass('sidebar-open')) {
-            $("body").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu');
-          } else {
-            $("body").addClass('sidebar-open').trigger('expanded.pushMenu');
-          }
-        }
-      });
-
-      $(".content-wrapper").click(function () {
-        //Enable hide menu when clicking on the content-wrapper on small screens
-        if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open")) {
-          $("body").removeClass('sidebar-open');
-        }
-      });
-
-      //Enable expand on hover for sidebar mini
-      if ($.AdminLTE.options.sidebarExpandOnHover
-              || ($('body').hasClass('fixed')
-                      && $('body').hasClass('sidebar-mini'))) {
-        this.expandOnHover();
-      }
-    },
-    expandOnHover: function () {
-      var _this = this;
-      var screenWidth = $.AdminLTE.options.screenSizes.sm - 1;
-      //Expand sidebar on hover
-      $('.main-sidebar').hover(function () {
-        if ($('body').hasClass('sidebar-mini')
-                && $("body").hasClass('sidebar-collapse')
-                && $(window).width() > screenWidth) {
-          _this.expand();
-        }
-      }, function () {
-        if ($('body').hasClass('sidebar-mini')
-                && $('body').hasClass('sidebar-expanded-on-hover')
-                && $(window).width() > screenWidth) {
-          _this.collapse();
-        }
-      });
-    },
-    expand: function () {
-      $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover');
-    },
-    collapse: function () {
-      if ($('body').hasClass('sidebar-expanded-on-hover')) {
-        $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse');
-      }
-    }
-  };
-
-  /* Tree()
-   * ======
-   * Converts the sidebar into a multilevel
-   * tree view menu.
-   *
-   * @type Function
-   * @Usage: $.AdminLTE.tree('.sidebar')
-   */
-  $.AdminLTE.tree = function (menu) {
-    var _this = this;
-    var animationSpeed = $.AdminLTE.options.animationSpeed;
-    $(document).on('click', menu + ' li a', function (e) {
-      //Get the clicked link and the next element
-      var $this = $(this);
-      var checkElement = $this.next();
-
-      //Check if the next element is a menu and is visible
-      if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible'))) {
-        //Close the menu
-        checkElement.slideUp(animationSpeed, function () {
-          checkElement.removeClass('menu-open');
-          //Fix the layout in case the sidebar stretches over the height of the window
-          //_this.layout.fix();
-        });
-        checkElement.parent("li").removeClass("active");
-      }
-      //If the menu is not visible
-      else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) {
-        //Get the parent menu
-        var parent = $this.parents('ul').first();
-        //Close all open menus within the parent
-        var ul = parent.find('ul:visible').slideUp(animationSpeed);
-        //Remove the menu-open class from the parent
-        ul.removeClass('menu-open');
-        //Get the parent li
-        var parent_li = $this.parent("li");
-
-        //Open the target menu and add the menu-open class
-        checkElement.slideDown(animationSpeed, function () {
-          //Add the class active to the parent li
-          checkElement.addClass('menu-open');
-          parent.find('li.active').removeClass('active');
-          parent_li.addClass('active');
-          //Fix the layout in case the sidebar stretches over the height of the window
-          _this.layout.fix();
-        });
-      }
-      //if this isn't a link, prevent the page from being redirected
-      if (checkElement.is('.treeview-menu')) {
-        e.preventDefault();
-      }
-    });
-  };
-
-  /* ControlSidebar
-   * ==============
-   * Adds functionality to the right sidebar
-   *
-   * @type Object
-   * @usage $.AdminLTE.controlSidebar.activate(options)
-   */
-  $.AdminLTE.controlSidebar = {
-    //instantiate the object
-    activate: function () {
-      //Get the object
-      var _this = this;
-      //Update options
-      var o = $.AdminLTE.options.controlSidebarOptions;
-      //Get the sidebar
-      var sidebar = $(o.selector);
-      //The toggle button
-      var btn = $(o.toggleBtnSelector);
-
-      //Listen to the click event
-      btn.on('click', function (e) {
-        e.preventDefault();
-        //If the sidebar is not open
-        if (!sidebar.hasClass('control-sidebar-open')
-                && !$('body').hasClass('control-sidebar-open')) {
-          //Open the sidebar
-          _this.open(sidebar, o.slide);
-        } else {
-          _this.close(sidebar, o.slide);
-        }
-      });
-
-      //If the body has a boxed layout, fix the sidebar bg position
-      var bg = $(".control-sidebar-bg");
-      _this._fix(bg);
-
-      //If the body has a fixed layout, make the control sidebar fixed
-      if ($('body').hasClass('fixed')) {
-        _this._fixForFixed(sidebar);
-      } else {
-        //If the content height is less than the sidebar's height, force max height
-        if ($('.content-wrapper, .right-side').height() < sidebar.height()) {
-          _this._fixForContent(sidebar);
-        }
-      }
-    },
-    //Open the control sidebar
-    open: function (sidebar, slide) {
-      //Slide over content
-      if (slide) {
-        sidebar.addClass('control-sidebar-open');
-      } else {
-        //Push the content by adding the open class to the body instead
-        //of the sidebar itself
-        $('body').addClass('control-sidebar-open');
-      }
-    },
-    //Close the control sidebar
-    close: function (sidebar, slide) {
-      if (slide) {
-        sidebar.removeClass('control-sidebar-open');
-      } else {
-        $('body').removeClass('control-sidebar-open');
-      }
-    },
-    _fix: function (sidebar) {
-      var _this = this;
-      if ($("body").hasClass('layout-boxed')) {
-        sidebar.css('position', 'absolute');
-        sidebar.height($(".wrapper").height());
-        $(window).resize(function () {
-          _this._fix(sidebar);
-        });
-      } else {
-        sidebar.css({
-          'position': 'fixed',
-          'height': 'auto'
-        });
-      }
-    },
-    _fixForFixed: function (sidebar) {
-      sidebar.css({
-        'position': 'fixed',
-        'max-height': '100%',
-        'overflow': 'auto',
-        'padding-bottom': '50px'
-      });
-    },
-    _fixForContent: function (sidebar) {
-      $(".content-wrapper, .right-side").css('min-height', sidebar.height());
-    }
-  };
-
-  /* BoxWidget
-   * =========
-   * BoxWidget is a plugin to handle collapsing and
-   * removing boxes from the screen.
-   *
-   * @type Object
-   * @usage $.AdminLTE.boxWidget.activate()
-   *        Set all your options in the main $.AdminLTE.options object
-   */
-  $.AdminLTE.boxWidget = {
-    selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,
-    icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,
-    animationSpeed: $.AdminLTE.options.animationSpeed,
-    activate: function (_box) {
-      var _this = this;
-      if (!_box) {
-        _box = document; // activate all boxes per default
-      }
-      //Listen for collapse event triggers
-      $(_box).on('click', _this.selectors.collapse, function (e) {
-        e.preventDefault();
-        _this.collapse($(this));
-      });
-
-      //Listen for remove event triggers
-      $(_box).on('click', _this.selectors.remove, function (e) {
-        e.preventDefault();
-        _this.remove($(this));
-      });
-    },
-    collapse: function (element) {
-      var _this = this;
-      //Find the box parent
-      var box = element.parents(".box").first();
-      //Find the body and the footer
-      var box_content = box.find("> .box-body, > .box-footer, > form  >.box-body, > form > .box-footer");
-      if (!box.hasClass("collapsed-box")) {
-        //Convert minus into plus
-        element.children(":first")
-                .removeClass(_this.icons.collapse)
-                .addClass(_this.icons.open);
-        //Hide the content
-        box_content.slideUp(_this.animationSpeed, function () {
-          box.addClass("collapsed-box");
-        });
-      } else {
-        //Convert plus into minus
-        element.children(":first")
-                .removeClass(_this.icons.open)
-                .addClass(_this.icons.collapse);
-        //Show the content
-        box_content.slideDown(_this.animationSpeed, function () {
-          box.removeClass("collapsed-box");
-        });
-      }
-    },
-    remove: function (element) {
-      //Find the box parent
-      var box = element.parents(".box").first();
-      box.slideUp(this.animationSpeed);
-    }
-  };
-}
-
-/* ------------------
- * - Custom Plugins -
- * ------------------
- * All custom plugins are defined below.
- */
-
-/*
- * BOX REFRESH BUTTON
- * ------------------
- * This is a custom plugin to use with the component BOX. It allows you to add
- * a refresh button to the box. It converts the box's state to a loading state.
- *
- * @type plugin
- * @usage $("#box-widget").boxRefresh( options );
- */
-(function ($) {
-
-  "use strict";
-
-  $.fn.boxRefresh = function (options) {
-
-    // Render options
-    var settings = $.extend({
-      //Refresh button selector
-      trigger: ".refresh-btn",
-      //File source to be loaded (e.g: ajax/src.php)
-      source: "",
-      //Callbacks
-      onLoadStart: function (box) {
-        return box;
-      }, //Right after the button has been clicked
-      onLoadDone: function (box) {
-        return box;
-      } //When the source has been loaded
-
-    }, options);
-
-    //The overlay
-    var overlay = $('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');
-
-    return this.each(function () {
-      //if a source is specified
-      if (settings.source === "") {
-        if (window.console) {
-          window.console.log("Please specify a source first - boxRefresh()");
-        }
-        return;
-      }
-      //the box
-      var box = $(this);
-      //the button
-      var rBtn = box.find(settings.trigger).first();
-
-      //On trigger click
-      rBtn.on('click', function (e) {
-        e.preventDefault();
-        //Add loading overlay
-        start(box);
-
-        //Perform ajax call
-        box.find(".box-body").load(settings.source, function () {
-          done(box);
-        });
-      });
-    });
-
-    function start(box) {
-      //Add overlay and loading img
-      box.append(overlay);
-
-      settings.onLoadStart.call(box);
-    }
-
-    function done(box) {
-      //Remove overlay and loading img
-      box.find(overlay).remove();
-
-      settings.onLoadDone.call(box);
-    }
-
-  };
-
-})(jQuery);
-
-/*
- * EXPLICIT BOX ACTIVATION
- * -----------------------
- * This is a custom plugin to use with the component BOX. It allows you to activate
- * a box inserted in the DOM after the app.js was loaded.
- *
- * @type plugin
- * @usage $("#box-widget").activateBox();
- */
-(function ($) {
-
-  'use strict';
-
-  $.fn.activateBox = function () {
-    $.AdminLTE.boxWidget.activate(this);
-  };
-
-})(jQuery);
diff --git a/resources/assets/js/extensions/pGenerator.jquery.js b/resources/assets/js/extensions/pGenerator.jquery.js
new file mode 100755
index 0000000000000000000000000000000000000000..466cf22d1de4d556e13319a8cc81e2273e9ea161
--- /dev/null
+++ b/resources/assets/js/extensions/pGenerator.jquery.js
@@ -0,0 +1,146 @@
+/*!
+ * pGenerator jQuery Plugin v1.0.0
+ * http://accountspassword.com/password-generator-jquery-plugin
+ *
+ * Created by AccountsPassword.com
+ * Released under the GPL General Public License (Feel free to copy, modify or redistribute this plugin.)
+ *
+ */
+
+(function($){
+  	var numbers_array = new Array(),
+		upper_letters_array = new Array(),
+		lower_letters_array = new Array(),
+		special_chars_array = new Array(),
+		$pGeneratorElement = null;
+	var methods = {
+		init : function( options, callbacks) {
+
+			var settings = $.extend({
+				'bind': 'click',
+				'passwordElement': null,
+				'displayElement': null,
+				'passwordLength': 16,
+				'uppercase': true,
+				'lowercase': true,
+				'numbers':   true,
+				'specialChars': true,
+				'onPasswordGenerated': function(generatedPassword) { }
+			}, options);
+
+			for(var i = 48; i < 58; i++)
+				numbers_array.push(i);
+			for(i = 65; i < 91; i++)
+				upper_letters_array.push(i);
+			for(i = 97; i < 123; i++)
+				lower_letters_array.push(i);
+			special_chars_array = [33,35,64,36,38,42,91,93,123,125,92,47,63,58,59,95,45,53];
+
+			return this.each(function(){
+
+				$pGeneratorElement = $(this);
+
+				$pGeneratorElement.bind(settings.bind, function(e){
+					e.preventDefault();
+					methods.generatePassword(settings);
+				});
+
+			});
+		},
+		generatePassword: function(settings) {
+
+			var password = new Array(),
+				selOptions = settings.uppercase + settings.lowercase + settings.numbers + settings.specialChars,
+				selected = 0,
+				no_lower_letters = new Array();
+
+			var optionLength = Math.floor(settings.passwordLength / selOptions);
+
+			if(settings.uppercase) {
+				// uppercase letters
+				for(var i = 0; i < optionLength; i++) {
+					password.push(String.fromCharCode(upper_letters_array[randomFromInterval(0, upper_letters_array.length - 1)]));
+				}
+
+				no_lower_letters = no_lower_letters.concat(upper_letters_array);
+
+				selected++;
+			}
+
+			if(settings.numbers) {
+				// numbers letters
+				for(var i = 0; i < optionLength; i++) {
+					password.push(String.fromCharCode(numbers_array[randomFromInterval(0, numbers_array.length - 1)]));
+				}
+
+				no_lower_letters = no_lower_letters.concat(numbers_array);
+
+				selected++;
+			}
+
+			if(settings.specialChars) {
+				// numbers letters
+				for(var i = 0; i < optionLength; i++) {
+					password.push(String.fromCharCode(special_chars_array[randomFromInterval(0, special_chars_array.length - 1)]));
+				}
+
+				no_lower_letters = no_lower_letters.concat(special_chars_array);
+
+				selected++;
+			}
+
+			var remained = settings.passwordLength - (selected * optionLength);
+
+			if(settings.lowercase) {
+
+				for(var i = 0; i < remained; i++) {
+					password.push(String.fromCharCode(lower_letters_array[randomFromInterval(0, lower_letters_array.length - 1)]));
+				}
+
+			} else {
+
+				for(var i = 0; i < remained; i++) {
+					password.push(String.fromCharCode(no_lower_letters[randomFromInterval(0, no_lower_letters.length - 1)]));
+				}
+			}
+			password = shuffle(password);
+			passwordString = password.join('');
+
+			if(settings.passwordElement !== null) {
+				$(settings.passwordElement).val(passwordString);
+			}
+
+			if(settings.displayElement !== null) {
+                if($(settings.displayElement).is("input")) {
+                    $(settings.displayElement).val(passwordString);
+                } else {
+                    $(settings.displayElement).text(passwordString);
+                }
+			}
+
+			settings.onPasswordGenerated(passwordString);
+
+		}
+  	};
+
+	function shuffle(o){ //v1.0
+		for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
+		return o;
+	};
+
+	function randomFromInterval(from, to)
+	{
+		return Math.floor(Math.random()*(to-from+1)+from);
+	};
+
+	$.fn.pGenerator = function(method) {
+    	if ( methods[method] ) {
+      		return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
+    	} else if ( typeof method === 'object' || ! method ) {
+      		return methods.init.apply( this, arguments );
+    	} else {
+      		$.error( 'Method ' +  method + ' does not exist on jQuery.pGenerator' );
+    	}
+  	};
+
+})(jQuery);
diff --git a/resources/views/modals/user.blade.php b/resources/views/modals/user.blade.php
index 7aec3ee9dee82041f1aee2b8646e513f84d781fc..85db7d5d349560ec1de2816616e6f33aa6e68a5f 100644
--- a/resources/views/modals/user.blade.php
+++ b/resources/views/modals/user.blade.php
@@ -1,5 +1,4 @@
 {{-- See snipeit_modals.js for what powers this --}}
-<script src="/js/pGenerator.jquery.js"></script>
 
 <script nonce="{{ csrf_token() }}">
     $(document).ready(function () {
diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php
index 79f76b974563436d407d99770dd82f8c0959c163..6a4dd22a665d0759cdf12213f425e9b74a38849b 100755
--- a/resources/views/users/edit.blade.php
+++ b/resources/views/users/edit.blade.php
@@ -587,7 +587,6 @@
 @stop
 
 @section('moar_scripts')
-<script src="{{ asset('js/pGenerator.jquery.js') }}"></script>
 
 <script nonce="{{ csrf_token() }}">
 $(document).ready(function() {
diff --git a/webpack.mix.js b/webpack.mix.js
index 156b64955616685a15ca852244cf34cbebd74b28..871804c32e397a0d8bf0f18d8d267dff1add7831 100644
--- a/webpack.mix.js
+++ b/webpack.mix.js
@@ -87,17 +87,18 @@ mix.js([
  * Combine JS
  */
 mix.combine([
+    './node_modules/admin-lte/dist/js/adminlte.min.js',
+    './resources/assets/js/admin-lte-options.js',
     './node_modules/jquery-ui-dist/jquery-ui.js',
     './node_modules/tether/dist/js/tether.min.js',
     './node_modules/jquery-slimscroll/jquery.slimscroll.js',
     './node_modules/jquery.iframe-transport/jquery.iframe-transport.js',
     './node_modules/blueimp-file-upload/js/jquery.fileupload.js',
-    './node_modules/blueimp-file-upload/js/vendor/jquery.ui.widget.js',
     './node_modules/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js',
     './node_modules/bootstrap-datepicker/dist/js/bootstrap-datepicker.js',
     './node_modules/ekko-lightbox/dist/ekko-lightbox.js',
-    './node_modules/admin-lte/dist/js/adminlte.min.js',
     './node_modules/icheck/icheck.js',
+    './resources/assets/js/extensions/pGenerator.jquery.js'
 ], 'public/js/vendor.js')
 .version();