text: /*! 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 Colorlib
   * @support <https://github.com/ColorlibHQ/AdminLTE/issues>
   * @version 2.4.15
   * @repository git://github.com/ColorlibHQ/AdminLTE.git
   * @license MIT <http://opensource.org/licenses/MIT>
   */
  
  // Make sure jQuery has been loaded
  if (typeof jQuery === 'undefined') {
      throw new Error('AdminLTE requires jQuery')
  }
  
  /* BoxRefresh()
   * =========
   * Adds AJAX content control to a box.
   *
   * @Usage: $('#my-box').boxRefresh(options)
   *         or add [data-widget="box-refresh"] to the box element
   *         Pass any option as data-option="value"
   */
  +function ($) {
      'use strict';
  
      var DataKey = 'lte.boxrefresh';
  
      var Default = {
          source: '',
          params: {},
          trigger: '.refresh-btn',
          content: '.box-body',
          loadInContent: true,
          responseType: '',
          overlayTemplate: '<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>',
          onLoadStart: function () {
          },
          onLoadDone: function (response) {
              return response;
          }
      };
  
      var Selector = {
          data: '[data-widget="box-refresh"]'
      };
  
      // BoxRefresh Class Definition
      // =========================
      var BoxRefresh = function (element, options) {
          this.element = element;
          this.options = options;
          this.$overlay = $(options.overlayTemplate);
  
          if (options.source === '') {
              throw new Error('Source url was not defined. Please specify a url in your BoxRefresh source option.');
          }
  
          this._setUpListeners();
          this.load();
      };
  
      BoxRefresh.prototype.load = function () {
          this._addOverlay();
          this.options.onLoadStart.call($(this));
  
          $.get(this.options.source, this.options.params, function (response) {
              if (this.options.loadInContent) {
                  $(this.element).find(this.options.content).html(response);
              }
              this.options.onLoadDone.call($(this), response);
              this._removeOverlay();
          }.bind(this), this.options.responseType !== '' && this.options.responseType);
      };
  
      // Private
  
      BoxRefresh.prototype._setUpListeners = function () {
          $(this.element).on('click', this.options.trigger, function (event) {
              if (event)
                  event.preventDefault();
              this.load();
          }.bind(this));
      };
  
      BoxRefresh.prototype._addOverlay = function () {
          $(this.element).append(this.$overlay);
      };
  
      BoxRefresh.prototype._removeOverlay = function () {
          $(this.$overlay).remove();
      };
  
      // Plugin Definition
      // =================
      function Plugin(option) {
          return this.each(function () {
              var $this = $(this);
              var data = $this.data(DataKey);
  
              if (!data) {
                  var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);
                  $this.data(DataKey, (data = new BoxRefresh($this, options)));
              }
  
              if (typeof data == 'string') {
                  if (typeof data[option] == 'undefined') {
                      throw new Error('No method named ' + option);
                  }
                  data[option]();
              }
          });
      }
  
      var old = $.fn.boxRefresh;
  
      $.fn.boxRefresh = Plugin;
      $.fn.boxRefresh.Constructor = BoxRefresh;
  
      // No Conflict Mode
      // ================
      $.fn.boxRefresh.noConflict = function () {
          $.fn.boxRefresh = old;
          return this;
      };
  
      // BoxRefresh Data API
      // =================
      $(window).on('load', function () {
          $(Selector.data).each(function () {
              Plugin.call($(this));
          });
      });
  
  }(jQuery);
  
  
  /* BoxWidget()
   * ======
   * Adds box widget functions to boxes.
   *
   * @Usage: $('.my-box').boxWidget(options)
   *         This plugin auto activates on any element using the `.box` class
   *         Pass any option as data-option="value"
   */
  +function ($) {
      'use strict';
  
      var DataKey = 'lte.boxwidget';
  
      var Default = {
          animationSpeed: 500,
          collapseTrigger: '[data-widget="collapse"]',
          removeTrigger: '[data-widget="remove"]',
          collapseIcon: 'fa-minus',
          expandIcon: 'fa-plus',
          removeIcon: 'fa-times'
      };
  
      var Selector = {
          data: '.box',
          collapsed: '.collapsed-box',
          header: '.box-header',
          body: '.box-body',
          footer: '.box-footer',
          tools: '.box-tools'
      };
  
      var ClassName = {
          collapsed: 'collapsed-box'
      };
  
      var Event = {
          collapsing: 'collapsing.boxwidget',
          collapsed: 'collapsed.boxwidget',
          expanding: 'expanding.boxwidget',
          expanded: 'expanded.boxwidget',
          removing: 'removing.boxwidget',
          removed: 'removed.boxwidget'
      };
  
      // BoxWidget Class Definition
      // =====================
      var BoxWidget = function (element, options) {
          this.element = element;
          this.options = options;
  
          this._setUpListeners();
      };
  
      BoxWidget.prototype.toggle = function () {
          var isOpen = !$(this.element).is(Selector.collapsed);
  
          if (isOpen) {
              this.collapse();
          } else {
              this.expand();
          }
      };
  
      BoxWidget.prototype.expand = function () {
          var expandedEvent = $.Event(Event.expanded);
          var expandingEvent = $.Event(Event.expanding);
          var collapseIcon = this.options.collapseIcon;
          var expandIcon = this.options.expandIcon;
  
          $(this.element).removeClass(ClassName.collapsed);
  
          $(this.element)
                  .children(Selector.header + ', ' + Selector.body + ', ' + Selector.footer)
                  .children(Selector.tools)
                  .find('.' + expandIcon)
                  .removeClass(expandIcon)
                  .addClass(collapseIcon);
  
          $(this.element).children(Selector.body + ', ' + Selector.footer)
                  .slideDown(this.options.animationSpeed, function () {
                      $(this.element).trigger(expandedEvent);
                  }.bind(this))
                  .trigger(expandingEvent);
      };
  
      BoxWidget.prototype.collapse = function () {
          var collapsedEvent = $.Event(Event.collapsed);
          var collapsingEvent = $.Event(Event.collapsing);
          var collapseIcon = this.options.collapseIcon;
          var expandIcon = this.options.expandIcon;
  
          $(this.element)
                  .children(Selector.header + ', ' + Selector.body + ', ' + Selector.footer)
                  .children(Selector.tools)
                  .find('.' + collapseIcon)
                  .removeClass(collapseIcon)
                  .addClass(expandIcon);
  
          $(this.element).children(Selector.body + ', ' + Selector.footer)
                  .slideUp(this.options.animationSpeed, function () {
                      $(this.element).addClass(ClassName.collapsed);
                      $(this.element).trigger(collapsedEvent);
                  }.bind(this))
                  .trigger(collapsingEvent);
      };
  
      BoxWidget.prototype.remove = function () {
          var removedEvent = $.Event(Event.removed);
          var removingEvent = $.Event(Event.removing);
  
          $(this.element).slideUp(this.options.animationSpeed, function () {
              $(this.element).trigger(removedEvent);
              $(this.element).remove();
          }.bind(this))
                  .trigger(removingEvent);
      };
  
      // Private
  
      BoxWidget.prototype._setUpListeners = function () {
          var that = this;
  
          $(this.element).on('click', this.options.collapseTrigger, function (event) {
              if (event)
                  event.preventDefault();
              that.toggle($(this));
              return false;
          });
  
          $(this.element).on('click', this.options.removeTrigger, function (event) {
              if (event)
                  event.preventDefault();
              that.remove($(this));
              return false;
          });
      };
  
      // Plugin Definition
      // =================
      function Plugin(option) {
          return this.each(function () {
              var $this = $(this);
              var data = $this.data(DataKey);
  
              if (!data) {
                  var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);
                  $this.data(DataKey, (data = new BoxWidget($this, options)));
              }
  
              if (typeof option == 'string') {
                  if (typeof data[option] == 'undefined') {
                      throw new Error('No method named ' + option);
                  }
                  data[option]();
              }
          });
      }
  
      var old = $.fn.boxWidget;
  
      $.fn.boxWidget = Plugin;
      $.fn.boxWidget.Constructor = BoxWidget;
  
      // No Conflict Mode
      // ================
      $.fn.boxWidget.noConflict = function () {
          $.fn.boxWidget = old;
          return this;
      };
  
      // BoxWidget Data API
      // ==================
      $(window).on('load', function () {
          $(Selector.data).each(function () {
              Plugin.call($(this));
          });
      });
  }(jQuery);
  
  
  /* ControlSidebar()
   * ===============
   * Toggles the state of the control sidebar
   *
   * @Usage: $('#control-sidebar-trigger').controlSidebar(options)
   *         or add [data-toggle="control-sidebar"] to the trigger
   *         Pass any option as data-option="value"
   */
  +function ($) {
      'use strict';
  
      var DataKey = 'lte.controlsidebar';
  
      var Default = {
          slide: true
      };
  
      var Selector = {
          sidebar: '.control-sidebar',
          data: '[data-toggle="control-sidebar"]',
          open: '.control-sidebar-open',
          bg: '.control-sidebar-bg',
          wrapper: '.wrapper',
          content: '.content-wrapper',
          boxed: '.layout-boxed'
      };
  
      var ClassName = {
          open: 'control-sidebar-open',
          fixed: 'fixed'
      };
  
      var Event = {
          collapsed: 'collapsed.controlsidebar',
          expanded: 'expanded.controlsidebar'
      };
  
      // ControlSidebar Class Definition
      // ===============================
      var ControlSidebar = function (element, options) {
          this.element = element;
          this.options = options;
          this.hasBindedResize = false;
  
          this.init();
      };
  
      ControlSidebar.prototype.init = function () {
          // Add click listener if the element hasn't been
          // initialized using the data API
          if (!$(this.element).is(Selector.data)) {
              $(this).on('click', this.toggle);
          }
  
          this.fix();
          $(window).resize(function () {
              this.fix();
          }.bind(this));
      };
  
      ControlSidebar.prototype.toggle = function (event) {
          if (event)
              event.preventDefault();
  
          this.fix();
  
          if (!$(Selector.sidebar).is(Selector.open) && !$('body').is(Selector.open)) {
              this.expand();
          } else {
              this.collapse();
          }
      };
  
      ControlSidebar.prototype.expand = function () {
          $(Selector.sidebar).show();
          if (!this.options.slide) {
              $('body').addClass(ClassName.open);
          } else {
              $(Selector.sidebar).addClass(ClassName.open);
          }
  
  
          $(this.element).trigger($.Event(Event.expanded));
      };
  
      ControlSidebar.prototype.collapse = function () {
          $('body, ' + Selector.sidebar).removeClass(ClassName.open);
          $(Selector.sidebar).fadeOut();
          $(this.element).trigger($.Event(Event.collapsed));
      };
  
      ControlSidebar.prototype.fix = function () {
          if ($('body').is(Selector.boxed)) {
              this._fixForBoxed($(Selector.bg));
          }
      };
  
      // Private
  
      ControlSidebar.prototype._fixForBoxed = function (bg) {
          bg.css({
              position: 'absolute',
              height: $(Selector.wrapper).height()
          });
      };
  
      // Plugin Definition
      // =================
      function Plugin(option) {
          return this.each(function () {
              var $this = $(this);
              var data = $this.data(DataKey);
  
              if (!data) {
                  var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);
                  $this.data(DataKey, (data = new ControlSidebar($this, options)));
              }
  
              if (typeof option == 'string')
                  data.toggle();
          });
      }
  
      var old = $.fn.controlSidebar;
  
      $.fn.controlSidebar = Plugin;
      $.fn.controlSidebar.Constructor = ControlSidebar;
  
      // No Conflict Mode
      // ================
      $.fn.controlSidebar.noConflict = function () {
          $.fn.controlSidebar = old;
          return this;
      };
  
      // ControlSidebar Data API
      // =======================
      $(document).on('click', Selector.data, function (event) {
          if (event)
              event.preventDefault();
          Plugin.call($(this), 'toggle');
      });
  
  }(jQuery);
  
  
  /* DirectChat()
   * ===============
   * Toggles the state of the control sidebar
   *
   * @Usage: $('#my-chat-box').directChat()
   *         or add [data-widget="direct-chat"] to the trigger
   */
  +function ($) {
      'use strict';
  
      var DataKey = 'lte.directchat';
  
      var Selector = {
          data: '[data-widget="chat-pane-toggle"]',
          box: '.direct-chat'
      };
  
      var ClassName = {
          open: 'direct-chat-contacts-open'
      };
  
      // DirectChat Class Definition
      // ===========================
      var DirectChat = function (element) {
          this.element = element;
      };
  
      DirectChat.prototype.toggle = function ($trigger) {
          $trigger.parents(Selector.box).first().toggleClass(ClassName.open);
      };
  
      // Plugin Definition
      // =================
      function Plugin(option) {
          return this.each(function () {
              var $this = $(this);
              var data = $this.data(DataKey);
  
              if (!data) {
                  $this.data(DataKey, (data = new DirectChat($this)));
              }
  
              if (typeof option == 'string')
                  data.toggle($this);
          });
      }
  
      var old = $.fn.directChat;
  
      $.fn.directChat = Plugin;
      $.fn.directChat.Constructor = DirectChat;
  
      // No Conflict Mode
      // ================
      $.fn.directChat.noConflict = function () {
          $.fn.directChat = old;
          return this;
      };
  
      // DirectChat Data API
      // ===================
      $(document).on('click', Selector.data, function (event) {
          if (event)
              event.preventDefault();
          Plugin.call($(this), 'toggle');
      });
  
  }(jQuery);
  
  
  /* PushMenu()
   * ==========
   * Adds the push menu functionality to the sidebar.
   *
   * @usage: $('.btn').pushMenu(options)
   *          or add [data-toggle="push-menu"] to any button
   *          Pass any option as data-option="value"
   */
  +function ($) {
      'use strict';
  
      var DataKey = 'lte.pushmenu';
  
      var Default = {
          collapseScreenSize: 767,
          expandOnHover: false,
          expandTransitionDelay: 200
      };
  
      var Selector = {
          collapsed: '.sidebar-collapse',
          open: '.sidebar-open',
          mainSidebar: '.main-sidebar',
          contentWrapper: '.content-wrapper',
          searchInput: '.sidebar-form .form-control',
          button: '[data-toggle="push-menu"]',
          mini: '.sidebar-mini',
          expanded: '.sidebar-expanded-on-hover',
          layoutFixed: '.fixed'
      };
  
      var ClassName = {
          collapsed: 'sidebar-collapse',
          open: 'sidebar-open',
          mini: 'sidebar-mini',
          expanded: 'sidebar-expanded-on-hover',
          expandFeature: 'sidebar-mini-expand-feature',
          layoutFixed: 'fixed'
      };
  
      var Event = {
          expanded: 'expanded.pushMenu',
          collapsed: 'collapsed.pushMenu'
      };
  
      // PushMenu Class Definition
      // =========================
      var PushMenu = function (options) {
          this.options = options;
          this.init();
      };
  
      PushMenu.prototype.init = function () {
          if (this.options.expandOnHover
                  || ($('body').is(Selector.mini + Selector.layoutFixed))) {
              this.expandOnHover();
              $('body').addClass(ClassName.expandFeature);
          }
  
          $(Selector.contentWrapper).click(function () {
              // Enable hide menu when clicking on the content-wrapper on small screens
              if ($(window).width() <= this.options.collapseScreenSize && $('body').hasClass(ClassName.open)) {
                  this.close();
              }
          }.bind(this));
  
          // __Fix for android devices
          $(Selector.searchInput).click(function (e) {
              e.stopPropagation();
          });
      };
  
      PushMenu.prototype.toggle = function () {
          var windowWidth = $(window).width();
          var isOpen = !$('body').hasClass(ClassName.collapsed);
  
          if (windowWidth <= this.options.collapseScreenSize) {
              isOpen = $('body').hasClass(ClassName.open);
          }
  
          if (!isOpen) {
              this.open();
          } else {
              this.close();
          }
      };
  
      PushMenu.prototype.open = function () {
          var windowWidth = $(window).width();
  
          if (windowWidth > this.options.collapseScreenSize) {
              $('body').removeClass(ClassName.collapsed)
                      .trigger($.Event(Event.expanded));
          } else {
              $('body').addClass(ClassName.open)
                      .trigger($.Event(Event.expanded));
          }
      };
  
      PushMenu.prototype.close = function () {
          var windowWidth = $(window).width();
          if (windowWidth > this.options.collapseScreenSize) {
              $('body').addClass(ClassName.collapsed)
                      .trigger($.Event(Event.collapsed));
          } else {
              $('body').removeClass(ClassName.open + ' ' + ClassName.collapsed)
                      .trigger($.Event(Event.collapsed));
          }
      };
  
      PushMenu.prototype.expandOnHover = function () {
          $(Selector.mainSidebar).hover(function () {
              if ($('body').is(Selector.mini + Selector.collapsed)
                      && $(window).width() > this.options.collapseScreenSize) {
                  this.expand();
              }
          }.bind(this), function () {
              if ($('body').is(Selector.expanded)) {
                  this.collapse();
              }
          }.bind(this));
      };
  
      PushMenu.prototype.expand = function () {
          setTimeout(function () {
              $('body').removeClass(ClassName.collapsed)
                      .addClass(ClassName.expanded);
          }, this.options.expandTransitionDelay);
      };
  
      PushMenu.prototype.collapse = function () {
          setTimeout(function () {
              $('body').removeClass(ClassName.expanded)
                      .addClass(ClassName.collapsed);
          }, this.options.expandTransitionDelay);
      };
  
      // PushMenu Plugin Definition
      // ==========================
      function Plugin(option) {
          return this.each(function () {
              var $this = $(this);
              var data = $this.data(DataKey);
  
              if (!data) {
                  var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);
                  $this.data(DataKey, (data = new PushMenu(options)));
              }
  
              if (option === 'toggle')
                  data.toggle();
          });
      }
  
      var old = $.fn.pushMenu;
  
      $.fn.pushMenu = Plugin;
      $.fn.pushMenu.Constructor = PushMenu;
  
      // No Conflict Mode
      // ================
      $.fn.pushMenu.noConflict = function () {
          $.fn.pushMenu = old;
          return this;
      };
  
      // Data API
      // ========
      $(document).on('click', Selector.button, function (e) {
          e.preventDefault();
          Plugin.call($(this), 'toggle');
      });
      $(window).on('load', function () {
          Plugin.call($(Selector.button));
      });
  }(jQuery);
  
  
  /* TodoList()
   * =========
   * Converts a list into a todoList.
   *
   * @Usage: $('.my-list').todoList(options)
   *         or add [data-widget="todo-list"] to the ul element
   *         Pass any option as data-option="value"
   */
  +function ($) {
      'use strict';
  
      var DataKey = 'lte.todolist';
  
      var Default = {
          onCheck: function (item) {
              return item;
          },
          onUnCheck: function (item) {
              return item;
          }
      };
  
      var Selector = {
          data: '[data-widget="todo-list"]'
      };
  
      var ClassName = {
          done: 'done'
      };
  
      // TodoList Class Definition
      // =========================
      var TodoList = function (element, options) {
          this.element = element;
          this.options = options;
  
          this._setUpListeners();
      };
  
      TodoList.prototype.toggle = function (item) {
          item.parents(Selector.li).first().toggleClass(ClassName.done);
          if (!item.prop('checked')) {
              this.unCheck(item);
              return;
          }
  
          this.check(item);
      };
  
      TodoList.prototype.check = function (item) {
          this.options.onCheck.call(item);
      };
  
      TodoList.prototype.unCheck = function (item) {
          this.options.onUnCheck.call(item);
      };
  
      // Private
  
      TodoList.prototype._setUpListeners = function () {
          var that = this;
          $(this.element).on('change ifChanged', 'input:checkbox', function () {
              that.toggle($(this));
          });
      };
  
      // Plugin Definition
      // =================
      function Plugin(option) {
          return this.each(function () {
              var $this = $(this);
              var data = $this.data(DataKey);
  
              if (!data) {
                  var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);
                  $this.data(DataKey, (data = new TodoList($this, options)));
              }
  
              if (typeof data == 'string') {
                  if (typeof data[option] == 'undefined') {
                      throw new Error('No method named ' + option);
                  }
                  data[option]();
              }
          });
      }
  
      var old = $.fn.todoList;
  
      $.fn.todoList = Plugin;
      $.fn.todoList.Constructor = TodoList;
  
      // No Conflict Mode
      // ================
      $.fn.todoList.noConflict = function () {
          $.fn.todoList = old;
          return this;
      };
  
      // TodoList Data API
      // =================
      $(window).on('load', function () {
          $(Selector.data).each(function () {
              Plugin.call($(this));
          });
      });
  
  }(jQuery);
  
  
  /* Tree()
   * ======
   * Converts a nested list into a multilevel
   * tree view menu.
   *
   * @Usage: $('.my-menu').tree(options)
   *         or add [data-widget="tree"] to the ul element
   *         Pass any option as data-option="value"
   */
  +function ($) {
      'use strict';
  
      var DataKey = 'lte.tree';
  
      var Default = {
          animationSpeed: 500,
          accordion: true,
          followLink: false,
          trigger: '.treeview a'
      };
  
      var Selector = {
          tree: '.tree',
          treeview: '.treeview',
          treeviewMenu: '.treeview-menu',
          open: '.menu-open, .active',
          li: 'li',
          data: '[data-widget="tree"]',
          active: '.active'
      };
  
      var ClassName = {
          open: 'menu-open',
          tree: 'tree'
      };
  
      var Event = {
          collapsed: 'collapsed.tree',
          expanded: 'expanded.tree'
      };
  
      // Tree Class Definition
      // =====================
      var Tree = function (element, options) {
          this.element = element;
          this.options = options;
  
          $(this.element).addClass(ClassName.tree);
  
          $(Selector.treeview + Selector.active, this.element).addClass(ClassName.open);
  
          this._setUpListeners();
      };
  
      Tree.prototype.toggle = function (link, event) {
          var treeviewMenu = link.next(Selector.treeviewMenu);
          var parentLi = link.parent();
          var isOpen = parentLi.hasClass(ClassName.open);
  
          if (!parentLi.is(Selector.treeview)) {
              return;
          }
  
          if (!this.options.followLink || link.attr('href') === '#') {
              event.preventDefault();
          }
  
          if (isOpen) {
              this.collapse(treeviewMenu, parentLi);
          } else {
              this.expand(treeviewMenu, parentLi);
          }
      };
  
      Tree.prototype.expand = function (tree, parent) {
          var expandedEvent = $.Event(Event.expanded);
  
          if (this.options.accordion) {
              var openMenuLi = parent.siblings(Selector.open);
              var openTree = openMenuLi.children(Selector.treeviewMenu);
              this.collapse(openTree, openMenuLi);
          }
  
          parent.addClass(ClassName.open);
          tree.slideDown(this.options.animationSpeed, function () {
              $(this.element).trigger(expandedEvent);
              parent.height('auto');
          }.bind(this));
      };
  
      Tree.prototype.collapse = function (tree, parentLi) {
          var collapsedEvent = $.Event(Event.collapsed);
  
          //tree.find(Selector.open).removeClass(ClassName.open);
          parentLi.removeClass(ClassName.open);
          tree.slideUp(this.options.animationSpeed, function () {
              //tree.find(Selector.open + ' > ' + Selector.treeview).slideUp();
              $(this.element).trigger(collapsedEvent);
  
              // Collapse child items
              parentLi.find(Selector.treeview).removeClass(ClassName.open).find(Selector.treeviewMenu).hide();
          }.bind(this));
      };
  
      // Private
  
      Tree.prototype._setUpListeners = function () {
          var that = this;
  
          $(this.element).on('click', this.options.trigger, function (event) {
              that.toggle($(this), event);
          });
      };
  
      // Plugin Definition
      // =================
      function Plugin(option) {
          return this.each(function () {
              var $this = $(this);
              var data = $this.data(DataKey);
  
              if (!data) {
                  var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);
                  $this.data(DataKey, new Tree($this, options));
              }
          });
      }
  
      var old = $.fn.tree;
  
      $.fn.tree = Plugin;
      $.fn.tree.Constructor = Tree;
  
      // No Conflict Mode
      // ================
      $.fn.tree.noConflict = function () {
          $.fn.tree = old;
          return this;
      };
  
      // Tree Data API
      // =============
      $(window).on('load', function () {
          $(Selector.data).each(function () {
              Plugin.call($(this));
          });
      });
  
  }(jQuery);
  
  
  /* Layout()
   * ========
   * Implements AdminLTE layout.
   * Fixes the layout height in case min-height fails.
   *
   * @usage activated automatically upon window load.
   *        Configure any options by passing data-option="value"
   *        to the body tag.
   */
  +function ($) {
      'use strict';
  
      var DataKey = 'lte.layout';
  
      var Default = {
          slimscroll: true,
          resetHeight: true
      };
  
      var Selector = {
          wrapper: '.wrapper',
          contentWrapper: '.content-wrapper',
          layoutBoxed: '.layout-boxed',
          mainFooter: '.main-footer',
          mainHeader: '.main-header',
          mainSidebar: '.main-sidebar',
          slimScrollDiv: 'slimScrollDiv',
          sidebar: '.sidebar',
          controlSidebar: '.control-sidebar',
          fixed: '.fixed',
          sidebarMenu: '.sidebar-menu',
          logo: '.main-header .logo'
      };
  
      var ClassName = {
          fixed: 'fixed',
          holdTransition: 'hold-transition'
      };
  
      var Layout = function (options) {
          this.options = options;
          this.bindedResize = false;
          this.activate();
      };
  
      Layout.prototype.activate = function () {
          this.fix();
          this.fixSidebar();
  
          $('body').removeClass(ClassName.holdTransition);
  
          if (this.options.resetHeight) {
              $('body, html, ' + Selector.wrapper).css({
                  'height': 'auto',
                  'min-height': '100%'
              });
          }
  
          if (!this.bindedResize) {
              $(window).resize(function () {
                  this.fix();
                  this.fixSidebar();
  
                  $(Selector.logo + ', ' + Selector.sidebar).one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function () {
                      this.fix();
                      this.fixSidebar();
                  }.bind(this));
              }.bind(this));
  
              this.bindedResize = true;
          }
  
          $(Selector.sidebarMenu).on('expanded.tree', function () {
              this.fix();
              this.fixSidebar();
          }.bind(this));
  
          $(Selector.sidebarMenu).on('collapsed.tree', function () {
              this.fix();
              this.fixSidebar();
          }.bind(this));
      };
  
      Layout.prototype.fix = function () {
          // Remove overflow from .wrapper if layout-boxed exists
          $(Selector.layoutBoxed + ' > ' + Selector.wrapper).css('overflow', 'hidden');
  
          // Get window height and the wrapper height
          var footerHeight = $(Selector.mainFooter).outerHeight() || 0;
          var headerHeight = $(Selector.mainHeader).outerHeight() || 0;
          var neg = headerHeight + footerHeight;
          var windowHeight = $(window).height();
          var sidebarHeight = $(Selector.sidebar).outerHeight() || 0;
  
          // Set the min-height of the content and sidebar based on
          // the height of the document.
          if ($('body').hasClass(ClassName.fixed)) {
              $(Selector.contentWrapper).css('min-height', windowHeight - footerHeight);
          } else {
              var postSetHeight;
  
              if (windowHeight >= sidebarHeight + headerHeight) {
                  $(Selector.contentWrapper).css('min-height', windowHeight - neg);
                  postSetHeight = windowHeight - neg;
              } else {
                  $(Selector.contentWrapper).css('min-height', sidebarHeight);
                  postSetHeight = sidebarHeight;
              }
  
              // Fix for the control sidebar height
              var $controlSidebar = $(Selector.controlSidebar);
              if (typeof $controlSidebar !== 'undefined') {
                  if ($controlSidebar.height() > postSetHeight)
                      $(Selector.contentWrapper).css('min-height', $controlSidebar.height());
              }
          }
      };
  
      Layout.prototype.fixSidebar = function () {
          // Make sure the body tag has the .fixed class
          if (!$('body').hasClass(ClassName.fixed)) {
              if (typeof $.fn.slimScroll !== 'undefined') {
                  $(Selector.sidebar).slimScroll({destroy: true}).height('auto');
              }
              return;
          }
  
          // Enable slimscroll for fixed layout
          if (this.options.slimscroll) {
              if (typeof $.fn.slimScroll !== 'undefined') {
                  // Destroy if it exists
                  // $(Selector.sidebar).slimScroll({ destroy: true }).height('auto')
  
                  // Add slimscroll
                  if ($(Selector.mainSidebar).find(Selector.slimScrollDiv).length === 0) {
                      $(Selector.sidebar).slimScroll({
                          height: ($(window).height() - $(Selector.mainHeader).height()) + 'px'
                      });
                  }
              }
          }
      };
  
      // Plugin Definition
      // =================
      function Plugin(option) {
          return this.each(function () {
              var $this = $(this);
              var data = $this.data(DataKey);
  
              if (!data) {
                  var options = $.extend({}, Default, $this.data(), typeof option === 'object' && option);
                  $this.data(DataKey, (data = new Layout(options)));
              }
  
              if (typeof option === 'string') {
                  if (typeof data[option] === 'undefined') {
                      throw new Error('No method named ' + option);
                  }
                  data[option]();
              }
          });
      }
  
      var old = $.fn.layout;
  
      $.fn.layout = Plugin;
      $.fn.layout.Constuctor = Layout;
  
      // No conflict mode
      // ================
      $.fn.layout.noConflict = function () {
          $.fn.layout = old;
          return this;
      };
  
      // Layout DATA-API
      // ===============
      $(window).on('load', function () {
          Plugin.call($('body'));
      });
  }(jQuery);
  