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  Almsaeed Studio
   * @Support <http://www.almsaeedstudio.com>
   * @Email   <abdullah@almsaeedstudio.com>
   * @version 2.3.7
   * @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: "#e65100",
      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) {
      $('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
        $(document).on('click', toggleBtn, 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).off('click', menu + ' li a')
        .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')) && (!$('body').hasClass('sidebar-collapse'))) {
            //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());
          if (_this.hasBindedResize) {
            return;
          }
          $(window).resize(function () {
            _this._fix(sidebar);
          });
          _this.hasBindedResize = true;
        } 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 CONTROLS
   * -----------------------
   * 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, toggle and remove box.
   *
   * @type plugin
   * @usage $("#box-widget").activateBox();
   * @usage $("#box-widget").toggleBox();
   * @usage $("#box-widget").removeBox();
   */
  (function ($) {
  
    'use strict';
  
    $.fn.activateBox = function () {
      $.AdminLTE.boxWidget.activate(this);
    };
  
    $.fn.toggleBox = function () {
      var button = $($.AdminLTE.boxWidget.selectors.collapse, this);
      $.AdminLTE.boxWidget.collapse(button);
    };
  
    $.fn.removeBox = function () {
      var button = $($.AdminLTE.boxWidget.selectors.remove, this);
      $.AdminLTE.boxWidget.remove(button);
    };
  
  })(jQuery);
  
  /*
   * TODO LIST CUSTOM PLUGIN
   * -----------------------
   * This plugin depends on iCheck plugin for checkbox and radio inputs
   *
   * @type plugin
   * @usage $("#todo-widget").todolist( options );
   */
  (function ($) {
  
    'use strict';
  
    $.fn.todolist = function (options) {
      // Render options
      var settings = $.extend({
        //When the user checks the input
        onCheck: function (ele) {
          return ele;
        },
        //When the user unchecks the input
        onUncheck: function (ele) {
          return ele;
        }
      }, options);
  
      return this.each(function () {
  
        if (typeof $.fn.iCheck != 'undefined') {
          $('input', this).on('ifChecked', function () {
            var ele = $(this).parents("li").first();
            ele.toggleClass("done");
            settings.onCheck.call(ele);
          });
  
          $('input', this).on('ifUnchecked', function () {
            var ele = $(this).parents("li").first();
            ele.toggleClass("done");
            settings.onUncheck.call(ele);
          });
        } else {
          $('input', this).on('change', function () {
            var ele = $(this).parents("li").first();
            ele.toggleClass("done");
            if ($('input', ele).is(":checked")) {
              settings.onCheck.call(ele);
            } else {
              settings.onUncheck.call(ele);
            }
          });
        }
      });
    };
  }(jQuery));
  