[
  {
    "path": ".gitignore",
    "content": ".idea/\nbower_components/\nnode_modules/"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Zura Sekhniashvili\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "README.md",
    "content": "# LobiPanel\n[![CDNJS](https://img.shields.io/cdnjs/v/lobipanel.svg)](https://cdnjs.com/libraries/lobipanel)\n\njQuery plugin for bootstrap panels. It extends panels with several common and useful functions.\n\n[View Demo](http://lobianijs.com/site/lobipanel)\n\n### Features\n\n- Sort, drag, expand, resize, minimize bootstrap panels\n- Specify url and load content in panel from this url\n- Change the name of the panel\n- Customize action icons and action tooltips\n- Works for nested panels\n- HTML5 localStorage support\n    - Save panel state: (pinned, unpinned, collapsed, fullscreen, minimized) and apply it on page load\n    - Save panel position among siblings and apply on next time\n\n### Installation and dependecies\n\nLobiPanel is depended on jQuery, jQuery ui and bootstrap.\n\n#### 1. Include necessary css/js files\n\n```html\n<!DOCTYPE html>\n<html>\n   <head>\n        <!--Default installation-->\n        <link rel=\"stylesheet\" href=\"lib/jquery-ui.min.css\"/>\n        <link rel=\"stylesheet\" href=\"bootstrap/css/bootstrap.min.css\"/>\n        <link rel=\"stylesheet\" href=\"lib/font-awesome/css/font-awesome.min.css\"/>\n\n        <!--Installation using bower. Preferred!!! -->\n        <!--<link rel=\"stylesheet\" href=\"bower_components/bootstrap/dist/css/bootstrap.min.css\"/>-->\n        <!--<link rel=\"stylesheet\" href=\"bower_components/jquery-ui/themes/ui-lightness/jquery-ui.min.css\"/>-->\n        <!--Run `bower install font-awesome` and uncomment this line to see font awesome examples-->\n        <!--<link rel=\"stylesheet\" href=\"bower_components/font-awesome/css/font-awesome.min.css\"/>-->\n\n        <link rel=\"stylesheet\" href=\"dist/css/lobipanel.min.css\"/>\n   </head>\n\n    <body>\n        ...\n        <!--Default installation-->\n        <script src=\"lib/jquery.1.11.min.js\"></script>\n        <script src=\"lib/jquery-ui.min.js\"></script>\n        <script src=\"lib/jquery.ui.touch-punch.min.js\"></script>\n        <script src=\"bootstrap/js/bootstrap.min.js\"></script>\n\n        <!--Installation using bower. Preferred!!! -->\n        <!--<script src=\"bower_components/jquery/dist/jquery.min.js\"></script>-->\n        <!--<script src=\"bower_components/jquery-ui/jquery-ui.min.js\"></script>-->\n        <!--<script src=\"bower_components/jquery-ui-touch-punch-improved/jquery.ui.touch-punch-improved.js\"></script>-->\n        <!--<script src=\"bower_components/bootstrap/dist/js/bootstrap.min.js\"></script>-->\n\n        <script src=\"dist/js/lobipanel.js\"></script>\n\n   </body>\n</html>\n```\n\n#### 2. Initialize plugin and use it\n\n#### Stateful panels\nIn order stateful panels to works you need to:\n - Give `stateful: true` to panel options.\n - Give `data-inner-id` to lobipanel element and parent element to keep track of the child\n which contacts lobipanels as unique identifier\n\n### For documentation and examples visit the plugin's [home page](http://lobianijs.com/site/lobipanel)\n"
  },
  {
    "path": "bootstrap/js/npm.js",
    "content": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequire('../../js/transition.js')\nrequire('../../js/alert.js')\nrequire('../../js/button.js')\nrequire('../../js/carousel.js')\nrequire('../../js/collapse.js')\nrequire('../../js/dropdown.js')\nrequire('../../js/modal.js')\nrequire('../../js/tooltip.js')\nrequire('../../js/popover.js')\nrequire('../../js/scrollspy.js')\nrequire('../../js/tab.js')\nrequire('../../js/affix.js')"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"lobipanel\",\n  \"description\": \"jQuery plugin for bootstrap panels. It extends panels with several common and useful functions\",\n  \"main\": [\n    \"css/lobipanel.css\",\n    \"js/lobipanel.js\"\n  ],\n  \"authors\": [\n    {\n      \"name\": \"Zura Sekhniashvili\",\n      \"email\": \"zurasekhniashvili@gmail.com\",\n      \"homepage\": \"https://github.com/arboshiki\"\n    }\n  ],\n  \"license\": \"MIT\",\n  \"keywords\": [\n    \"jQuery\",\n    \"plugin\",\n    \"bootstrap panels\",\n    \"floating windows\",\n    \"ajax loading panels\",\n    \"localStorage\"\n  ],\n  \"homepage\": \"https://github.com/arboshiki/lobibox\",\n  \"moduleType\": [],\n  \"private\": true,\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"bower_components\",\n    \"test\",\n    \"tests\"\n  ],\n  \"dependencies\": {\n    \"bootstrap\": \"^3.3.6\",\n    \"jquery-ui\": \"^1.11.4\",\n    \"jquery-ui-touch-punch-improved\": \"^0.3.1\"\n  }\n}\n"
  },
  {
    "path": "css/lobipanel.css",
    "content": ".spinner-wrapper {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: rgba(255, 255, 255, 0.5);\n}\n.spinner-windows8 {\n  position: relative;\n  display: block;\n  margin: 0 auto;\n  width: 50px;\n  height: 50px;\n  margin-top: 100px;\n}\n.spinner-windows8 .wBall {\n  position: absolute;\n  width: 48px;\n  height: 48px;\n  opacity: 0;\n  -moz-transform: rotate(225deg);\n  -moz-animation: orbit 2.75s infinite;\n  -webkit-transform: rotate(225deg);\n  -webkit-animation: orbit 2.75s infinite;\n  -ms-transform: rotate(225deg);\n  -ms-animation: orbit 2.75s infinite;\n  -o-transform: rotate(225deg);\n  -o-animation: orbit 2.75s infinite;\n  transform: rotate(225deg);\n  animation: orbit 2.75s infinite;\n}\n.spinner-windows8 .wBall .wInnerBall {\n  position: absolute;\n  width: 6px;\n  height: 6px;\n  background: #000000;\n  left: 0px;\n  top: 0px;\n  -moz-border-radius: 6px;\n  -webkit-border-radius: 6px;\n  -ms-border-radius: 6px;\n  -o-border-radius: 6px;\n  border-radius: 6px;\n  z-index: 2;\n}\n.spinner-windows8 .wBall:first-child {\n  -moz-animation-delay: 0.6s;\n  -webkit-animation-delay: 0.6s;\n  -ms-animation-delay: 0.6s;\n  -o-animation-delay: 0.6s;\n  animation-delay: 0.6s;\n}\n.spinner-windows8 .wBall:nth-child(2) {\n  -moz-animation-delay: 0.12s;\n  -webkit-animation-delay: 0.12s;\n  -ms-animation-delay: 0.12s;\n  -o-animation-delay: 0.12s;\n  animation-delay: 0.12s;\n}\n.spinner-windows8 .wBall:nth-child(3) {\n  -moz-animation-delay: 0.24s;\n  -webkit-animation-delay: 0.24s;\n  -ms-animation-delay: 0.24s;\n  -o-animation-delay: 0.24s;\n  animation-delay: 0.24s;\n}\n.spinner-windows8 .wBall:nth-child(4) {\n  -moz-animation-delay: 0.36s;\n  -webkit-animation-delay: 0.36s;\n  -ms-animation-delay: 0.36s;\n  -o-animation-delay: 0.36s;\n  animation-delay: 0.36s;\n}\n.spinner-windows8 .wBall:nth-child(5) {\n  -moz-animation-delay: 0.48s;\n  -webkit-animation-delay: 0.48s;\n  -ms-animation-delay: 0.48s;\n  -o-animation-delay: 0.48s;\n  animation-delay: 0.48s;\n}\n@-moz-keyframes orbit {\n  0% {\n    opacity: 1;\n    z-index: 99;\n    -moz-transform: rotate(180deg);\n    -moz-animation-timing-function: ease-out;\n  }\n  7% {\n    opacity: 1;\n    -moz-transform: rotate(300deg);\n    -moz-animation-timing-function: linear;\n    -moz-origin: 0%;\n  }\n  30% {\n    opacity: 1;\n    -moz-transform: rotate(410deg);\n    -moz-animation-timing-function: ease-in-out;\n    -moz-origin: 7%;\n  }\n  39% {\n    opacity: 1;\n    -moz-transform: rotate(645deg);\n    -moz-animation-timing-function: linear;\n    -moz-origin: 30%;\n  }\n  70% {\n    opacity: 1;\n    -moz-transform: rotate(770deg);\n    -moz-animation-timing-function: ease-out;\n    -moz-origin: 39%;\n  }\n  75% {\n    opacity: 1;\n    -moz-transform: rotate(900deg);\n    -moz-animation-timing-function: ease-out;\n    -moz-origin: 70%;\n  }\n  76% {\n    opacity: 0;\n    -moz-transform: rotate(900deg);\n  }\n  100% {\n    opacity: 0;\n    -moz-transform: rotate(900deg);\n  }\n}\n@-webkit-keyframes orbit {\n  0% {\n    opacity: 1;\n    z-index: 99;\n    -webkit-transform: rotate(180deg);\n    -webkit-animation-timing-function: ease-out;\n  }\n  7% {\n    opacity: 1;\n    -webkit-transform: rotate(300deg);\n    -webkit-animation-timing-function: linear;\n    -webkit-origin: 0%;\n  }\n  30% {\n    opacity: 1;\n    -webkit-transform: rotate(410deg);\n    -webkit-animation-timing-function: ease-in-out;\n    -webkit-origin: 7%;\n  }\n  39% {\n    opacity: 1;\n    -webkit-transform: rotate(645deg);\n    -webkit-animation-timing-function: linear;\n    -webkit-origin: 30%;\n  }\n  70% {\n    opacity: 1;\n    -webkit-transform: rotate(770deg);\n    -webkit-animation-timing-function: ease-out;\n    -webkit-origin: 39%;\n  }\n  75% {\n    opacity: 1;\n    -webkit-transform: rotate(900deg);\n    -webkit-animation-timing-function: ease-out;\n    -webkit-origin: 70%;\n  }\n  76% {\n    opacity: 0;\n    -webkit-transform: rotate(900deg);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: rotate(900deg);\n  }\n}\n@-ms-keyframes orbit {\n  0% {\n    opacity: 1;\n    z-index: 99;\n    -ms-transform: rotate(180deg);\n    -ms-animation-timing-function: ease-out;\n  }\n  7% {\n    opacity: 1;\n    -ms-transform: rotate(300deg);\n    -ms-animation-timing-function: linear;\n    -ms-origin: 0%;\n  }\n  30% {\n    opacity: 1;\n    -ms-transform: rotate(410deg);\n    -ms-animation-timing-function: ease-in-out;\n    -ms-origin: 7%;\n  }\n  39% {\n    opacity: 1;\n    -ms-transform: rotate(645deg);\n    -ms-animation-timing-function: linear;\n    -ms-origin: 30%;\n  }\n  70% {\n    opacity: 1;\n    -ms-transform: rotate(770deg);\n    -ms-animation-timing-function: ease-out;\n    -ms-origin: 39%;\n  }\n  75% {\n    opacity: 1;\n    -ms-transform: rotate(900deg);\n    -ms-animation-timing-function: ease-out;\n    -ms-origin: 70%;\n  }\n  76% {\n    opacity: 0;\n    -ms-transform: rotate(900deg);\n  }\n  100% {\n    opacity: 0;\n    -ms-transform: rotate(900deg);\n  }\n}\n@-o-keyframes orbit {\n  0% {\n    opacity: 1;\n    z-index: 99;\n    -o-transform: rotate(180deg);\n    -o-animation-timing-function: ease-out;\n  }\n  7% {\n    opacity: 1;\n    -o-transform: rotate(300deg);\n    -o-animation-timing-function: linear;\n    -o-origin: 0%;\n  }\n  30% {\n    opacity: 1;\n    -o-transform: rotate(410deg);\n    -o-animation-timing-function: ease-in-out;\n    -o-origin: 7%;\n  }\n  39% {\n    opacity: 1;\n    -o-transform: rotate(645deg);\n    -o-animation-timing-function: linear;\n    -o-origin: 30%;\n  }\n  70% {\n    opacity: 1;\n    -o-transform: rotate(770deg);\n    -o-animation-timing-function: ease-out;\n    -o-origin: 39%;\n  }\n  75% {\n    opacity: 1;\n    -o-transform: rotate(900deg);\n    -o-animation-timing-function: ease-out;\n    -o-origin: 70%;\n  }\n  76% {\n    opacity: 0;\n    -o-transform: rotate(900deg);\n  }\n  100% {\n    opacity: 0;\n    -o-transform: rotate(900deg);\n  }\n}\n@keyframes orbit {\n  0% {\n    opacity: 1;\n    z-index: 99;\n    transform: rotate(180deg);\n    animation-timing-function: ease-out;\n  }\n  7% {\n    opacity: 1;\n    transform: rotate(300deg);\n    animation-timing-function: linear;\n    origin: 0%;\n  }\n  30% {\n    opacity: 1;\n    transform: rotate(410deg);\n    animation-timing-function: ease-in-out;\n    origin: 7%;\n  }\n  39% {\n    opacity: 1;\n    transform: rotate(645deg);\n    animation-timing-function: linear;\n    origin: 30%;\n  }\n  70% {\n    opacity: 1;\n    transform: rotate(770deg);\n    animation-timing-function: ease-out;\n    origin: 39%;\n  }\n  75% {\n    opacity: 1;\n    transform: rotate(900deg);\n    animation-timing-function: ease-out;\n    origin: 70%;\n  }\n  76% {\n    opacity: 0;\n    transform: rotate(900deg);\n  }\n  100% {\n    opacity: 0;\n    transform: rotate(900deg);\n  }\n}\n.tooltip {\n  z-index: 20000;\n}\nbody.lobipanel-minimized {\n  padding-bottom: 36px;\n}\n.lobipanel {\n  position: relative;\n  margin-bottom: 15px;\n}\n.lobipanel > .panel-heading {\n  padding: 5px;\n  position: relative;\n  border-top-right-radius: 0px;\n  border-top-left-radius: 0px;\n}\n.lobipanel > .panel-heading > .panel-title {\n  float: left;\n  max-width: calc(100% - 30px);\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  font-size: 16px;\n  line-height: 30px;\n  padding-left: 15px;\n}\n.lobipanel > .panel-heading > .panel-title h1,\n.lobipanel > .panel-heading > .panel-title h2,\n.lobipanel > .panel-heading > .panel-title h3,\n.lobipanel > .panel-heading > .panel-title h4,\n.lobipanel > .panel-heading > .panel-title h5,\n.lobipanel > .panel-heading > .panel-title h6 {\n  margin: 0;\n  line-height: 30px;\n}\n.lobipanel > .panel-heading > .panel-title input {\n  color: inherit;\n  line-height: 30px;\n  border-radius: 2px;\n  padding: 0 5px;\n  width: 100%;\n  background-color: rgba(0, 0, 0, 0.2);\n  border: 1px solid transparent;\n  outline: 0;\n}\n.lobipanel > .panel-heading > .panel-title input:focus {\n  background-color: rgba(0, 0, 0, 0.15);\n}\n.lobipanel > .panel-heading .dropdown {\n  display: inline-block;\n  float: right;\n  position: relative;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu {\n  left: auto;\n  right: 0;\n  min-width: 0;\n  margin-top: 0;\n  border-radius: 0;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu > li > a .control-title {\n  display: inline-block;\n  margin-left: 15px;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu .style-change-item {\n  position: relative;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu .style-change-item .style-list {\n  position: absolute;\n  background: #f5f5f5;\n  box-shadow: 2px 2px 12px rgba(0, 0, 0, 0.3);\n  padding: 4px;\n  display: none;\n  width: 92px;\n  top: 100%;\n  right: 0;\n  z-index: 2;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu .style-change-item .style-list .style-item {\n  cursor: pointer;\n  display: inline-block;\n  width: 24px;\n  height: 24px;\n  margin: 2px;\n  border: 2px solid #f5f5f5;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu .style-change-item .style-list .style-item:hover {\n  border-color: #FFF;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu .style-change-item .style-list .style-item:active {\n  box-shadow: inset 2px 2px 10px rgba(0, 0, 0, 0.3);\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu .style-change-item .style-list.opened {\n  display: block;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-toggle {\n  border: none;\n  outline: 0;\n  background-color: transparent;\n  text-align: center;\n  padding: 0;\n  width: 30px;\n  font-size: 14px;\n  -webkit-transition: all 0.2s;\n  -o-transition: all 0.2s;\n  transition: all 0.2s;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-toggle .panel-control-icon {\n  top: 0;\n  line-height: 30px;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-toggle:hover,\n.lobipanel > .panel-heading .dropdown .dropdown-toggle:hover:focus {\n  text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.6);\n  background-color: rgba(0, 0, 0, 0.15);\n}\n.lobipanel > .panel-heading .dropdown.open .dropdown-toggle {\n  text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.6);\n  background-color: rgba(0, 0, 0, 0.15);\n}\n.lobipanel > .panel-heading:before,\n.lobipanel > .panel-heading:after {\n  content: \" \";\n  display: table;\n}\n.lobipanel > .panel-heading:after {\n  clear: both;\n}\n@media screen and (min-width: 768px) {\n  .lobipanel .panel-heading .panel-title {\n    max-width: calc(100% - 180px);\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu {\n    position: static;\n    display: inline-block;\n    border: none;\n    padding: 0;\n    margin: 0;\n    min-width: 0;\n    width: auto;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n    background: transparent;\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li {\n    display: inline-block;\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li > a {\n    cursor: pointer;\n    color: inherit;\n    padding: 0;\n    outline: 0;\n    text-align: center;\n    width: 30px;\n    font-size: 14px;\n    -webkit-transition: all 0.2s;\n    -o-transition: all 0.2s;\n    transition: all 0.2s;\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li > a .panel-control-icon {\n    top: 0;\n    line-height: 30px;\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li > a .control-title {\n    display: none;\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li > a:hover,\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li > a:focus:hover {\n    text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.6);\n    background-color: rgba(0, 0, 0, 0.15);\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li > a:focus {\n    text-shadow: none;\n    background-color: transparent;\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-toggle {\n    display: none;\n  }\n}\n.lobipanel > .panel-body {\n  overflow: auto;\n  position: relative;\n}\n.lobipanel .panel-loader {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: #fff;\n  opacity: 0.8;\n}\n.lobipanel.panel-collapsed > .panel-heading {\n  border-bottom: none;\n}\n.lobipanel.panel-collapsed > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"unpin\"],\n.lobipanel.panel-collapsed > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"reload\"] {\n  display: none;\n}\n.lobipanel.panel-expanded,\n.lobipanel.panel-unpin,\n.lobipanel.panel-minimized.panel-unpin {\n  margin-bottom: 0;\n}\n.lobipanel.panel-unpin {\n  overflow: hidden;\n  position: absolute;\n  z-index: 10000;\n  -webkit-box-shadow: 2px 2px 15px 5px rgba(10, 10, 10, 0.5);\n  box-shadow: 2px 2px 15px 5px rgba(10, 10, 10, 0.5);\n}\n.lobipanel.panel-unpin > .panel-heading {\n  cursor: move;\n}\n.lobipanel.panel-unpin.panel-minimized {\n  float: left;\n  position: static;\n  border-radius: 0;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n  min-width: 170px;\n  margin-right: 5px;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading {\n  padding: 0;\n  cursor: pointer;\n  border-bottom: none;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title {\n  max-width: calc(100% - 60px);\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title h1,\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title h2,\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title h3,\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title h4,\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title h5,\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title h6 {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu {\n  position: static;\n  display: inline-block;\n  border: none;\n  padding: 0;\n  margin: 0;\n  min-width: 0;\n  width: auto;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n  background: transparent;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li {\n  display: inline-block;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a {\n  cursor: pointer;\n  color: inherit;\n  padding: 0;\n  outline: 0;\n  text-align: center;\n  width: 30px;\n  font-size: 14px;\n  -webkit-transition: all 0.2s;\n  -o-transition: all 0.2s;\n  transition: all 0.2s;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a .panel-control-icon {\n  top: 0;\n  line-height: 30px;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a .control-title {\n  display: none;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a:hover,\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a:focus:hover {\n  text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.6);\n  background-color: rgba(0, 0, 0, 0.15);\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a:focus {\n  text-shadow: none;\n  background-color: transparent;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-toggle {\n  display: none;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a {\n  display: none;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"close\"],\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"expand\"] {\n  display: inline-block;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-body,\n.lobipanel.panel-unpin.panel-minimized > .panel-footer {\n  display: none !important;\n}\n.lobipanel.panel-expanded > .panel-heading {\n  cursor: default;\n}\n.lobipanel.panel-expanded > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"unpin\"],\n.lobipanel.panel-expanded > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"minimize\"] {\n  display: none;\n}\n.lobipanel.panel-expanded.panel-unpin > .panel-heading .panel-control[data-func=\"minimize\"] {\n  display: block;\n}\n.lobipanel-minimized-toolbar {\n  position: fixed;\n  height: 36px;\n  padding: 2px;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  z-index: 20000;\n  background: rgba(34, 115, 182, 0.51);\n}\n.lobipanel-placeholder {\n  background-color: #f9f5d1;\n  border: 1px dashed #919191;\n  margin-bottom: 15px;\n}\n.lobipanel-parent-sortable {\n  min-height: 20px;\n}\n"
  },
  {
    "path": "demo/demo.css",
    "content": ".highlight {\n    overflow: auto;\n    padding: 9px 14px;\n    margin-bottom: 14px;\n    background-color: #f7f7f9;\n    border: 1px solid #e1e1e8;\n    border-radius: 4px\n}\n\n.highlight pre {\n    min-width: 400px;\n    padding: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n    word-break: normal;\n    white-space: nowrap;\n    background-color: transparent;\n    border: 0\n}\n\n.highlight pre code {\n    padding: 0;\n    background-color: transparent\n}\n\n.bs-example+.highlight {\n    margin-top: -16px;\n    border-top-right-radius: 0;\n    border-top-left-radius: 0\n}\n\n.lobipanel-parent-sortable{\n    border: 1px solid rgba(0, 0, 0, 0.3);\n}"
  },
  {
    "path": "demo/documentation.css",
    "content": ".plugin-documentation .row{margin-left:0;margin-right:0;border-bottom:1px solid #ddd}.plugin-documentation .row-header .cell{text-transform:uppercase;font-size:.8em;color:#999;background-color:#eee}.plugin-documentation .cell{float:left;font-size:.95em;padding:6px 9px;width:100%}.plugin-documentation .cell pre{min-width:320px}.plugin-documentation .text-mobile{display:none}@media screen and (max-width:768px){.plugin-documentation .row{padding-left:0;padding-right:0}.plugin-documentation .row-header{display:none}.plugin-documentation .cell{width:100%!important;padding:0;margin-bottom:3px}.plugin-documentation .text-mobile{font-weight:400;display:inline}}.plugin-documentation.plugin-options .cell-name{width:16.66666667%}.plugin-documentation.plugin-options .cell-type{width:8.33333333%}.plugin-documentation.plugin-options .cell-default{width:25%}.plugin-documentation.plugin-options .cell-descr{width:50%}.plugin-documentation.plugin-methods .cell-name{width:16.66666667%}.plugin-documentation.plugin-methods .cell-params{width:33.33333333%}.plugin-documentation.plugin-methods .cell-params>div>i{font-weight:700}.plugin-documentation.plugin-methods .cell-return{width:16.66666667%}.plugin-documentation.plugin-methods .cell-descr{width:33.33333333%}.plugin-documentation.plugin-events .cell-name,.plugin-documentation.plugin-events .cell-params{width:25%}.plugin-documentation.plugin-events .cell-params>div>code{font-style:italic;font-weight:700}.plugin-documentation.plugin-events .cell-descr{width:50%}@media screen and (max-width:768px){.plugin-documentation .cell-name{font-size:102%;font-weight:700}.plugin-documentation .cell-default,.plugin-documentation .cell-descr,.plugin-documentation .cell-params,.plugin-documentation .cell-return{padding-left:30px}.plugin-documentation .cell-params>div{padding-left:20px}.plugin-documentation.plugin-options .cell-type{display:none}.plugin-documentation.plugin-methods .cell-params>div>i{font-weight:700}.plugin-documentation.plugin-methods .cell-return{display:none}}"
  },
  {
    "path": "demo/iframe.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <title>Lobipanel - jQuery plugin for bootstrap panels. It extends panels with several common and useful\n        functions.</title>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!--Default installation-->\n    <link rel=\"stylesheet\" href=\"../bower_components/jquery-ui/themes/ui-lightness/jquery-ui.min.css\"/>\n    <link rel=\"stylesheet\" href=\"../bower_components/bootstrap/dist/css/bootstrap.css\"/>\n    <link rel=\"stylesheet\" href=\"../lib/font-awesome/css/font-awesome.min.css\"/>\n\n\n    <!--Installation using bower. Preferred!!! -->\n    <!--<link rel=\"stylesheet\" href=\"bower_components/bootstrap/dist/css/bootstrap.min.css\"/>-->\n    <!--<link rel=\"stylesheet\" href=\"bower_components/jquery-ui/themes/ui-lightness/jquery-ui.min.css\"/>-->\n    <!--Run `bower install font-awesome` and uncomment this line to see font awesome examples-->\n    <!--<link rel=\"stylesheet\" href=\"bower_components/font-awesome/css/font-awesome.min.css\"/>-->\n\n    <link rel=\"stylesheet\" href=\"../css/lobipanel.css\"/>\n\n    <link rel=\"stylesheet\" href=\"../lib/highlight/github.css\"/>\n    <link rel=\"stylesheet\" href=\"../demo/documentation.css\"/>\n    <link rel=\"stylesheet\" href=\"../demo/demo.css\"/>\n</head>\n<body>\n\n<div style=\"padding: 25px;\">\n    <div class=\"row lobipanel-parent-stateful\">\n        <div class=\"col-sm-6\" data-inner-id=\"lobipanel-parent-stateful1\">\n            <div class=\"panel panel-primary\" data-sortable=\"true\" data-inner-id=\"lobipanel-primary\">\n                <div class=\"panel-heading\">\n                    <div class=\"panel-title\">\n                        <h4>Panel title</h4>\n                    </div>\n                </div>\n                <div class=\"panel-body\">\n                    <div class=\"embed-responsive embed-responsive-4by3\">\n                        <iframe class=\"embed-responsive-item\" src=\"https://transform-service.inpriva.net/app/\"></iframe>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n\n<!--Default installation-->\n<script src=\"../bower_components/jquery/dist/jquery.js\"></script>\n<script src=\"../bower_components/jquery-ui/jquery-ui.js\"></script>\n<script src=\"../bower_components/jquery-ui-touch-punch-improved/jquery.ui.touch-punch-improved.js\"></script>\n<script src=\"../bower_components/bootstrap/dist/js/bootstrap.js\"></script>\n\n<!--Installation using bower. Preferred!!! -->\n<!--<script src=\"bower_components/jquery/dist/jquery.min.js\"></script>-->\n<!--<script src=\"bower_components/jquery-ui/jquery-ui.min.js\"></script>-->\n<!--<script src=\"bower_components/jquery-ui-touch-punch-improved/jquery.ui.touch-punch-improved.js\"></script>-->\n<!--<script src=\"bower_components/bootstrap/dist/js/bootstrap.min.js\"></script>-->\n\n<script src=\"../js/lobipanel.js\"></script>\n\n<script>\n    $(function () {\n        $('.lobipanel-parent-stateful .panel').lobiPanel({\n            stateful: true\n        });\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "demo/stateful.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <title>Lobipanel - jQuery plugin for bootstrap panels. It extends panels with several common and useful\n        functions.</title>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!--Default installation-->\n    <link rel=\"stylesheet\" href=\"../bower_components/jquery-ui/themes/ui-lightness/jquery-ui.min.css\"/>\n    <link rel=\"stylesheet\" href=\"../bower_components/bootstrap/dist/css/bootstrap.css\"/>\n    <link rel=\"stylesheet\" href=\"../lib/font-awesome/css/font-awesome.min.css\"/>\n\n\n    <!--Installation using bower. Preferred!!! -->\n    <!--<link rel=\"stylesheet\" href=\"bower_components/bootstrap/dist/css/bootstrap.min.css\"/>-->\n    <!--<link rel=\"stylesheet\" href=\"bower_components/jquery-ui/themes/ui-lightness/jquery-ui.min.css\"/>-->\n    <!--Run `bower install font-awesome` and uncomment this line to see font awesome examples-->\n    <!--<link rel=\"stylesheet\" href=\"bower_components/font-awesome/css/font-awesome.min.css\"/>-->\n\n    <link rel=\"stylesheet\" href=\"../css/lobipanel.css\"/>\n\n    <link rel=\"stylesheet\" href=\"../lib/highlight/github.css\"/>\n    <link rel=\"stylesheet\" href=\"../demo/documentation.css\"/>\n    <link rel=\"stylesheet\" href=\"../demo/demo.css\"/>\n</head>\n<body>\n\n<div style=\"padding: 25px;\">\n    <div class=\"row lobipanel-parent-stateful\">\n        <div class=\"col-sm-6\" data-inner-id=\"lobipanel-parent-stateful1\">\n            <div class=\"panel panel-primary\" data-sortable=\"true\" data-inner-id=\"lobipanel-primary\">\n                <div class=\"panel-heading\">\n                    <div class=\"panel-title\">\n                        <h4>Panel title</h4>\n                    </div>\n                </div>\n                <div class=\"panel-body\">\n                    Panel 2\n                </div>\n            </div>\n            <div class=\"panel panel-default\" data-sortable=\"true\" data-inner-id=\"lobipanel-default\">\n                <div class=\"panel-heading\">\n                    <div class=\"panel-title\">\n                        <h4>Panel title</h4>\n                    </div>\n                </div>\n                <div class=\"panel-body\">\n                    Panel 3\n                </div>\n            </div>\n        </div>\n        <div class=\"col-sm-6 lobipanel-parent-sortable\" data-inner-id=\"lobipanel-parent-stateful2\">\n            <div class=\"panel panel-success\" data-sortable=\"true\" data-inner-id=\"lobipanel-success\">\n                <div class=\"panel-heading\">\n                    <div class=\"panel-title\">\n                        <h4>Panel title</h4>\n                    </div>\n                </div>\n                <div class=\"panel-body\">\n                    <!-- Single button -->\n                    <div class=\"btn-group\">\n                        <button type=\"button\" class=\"btn btn-default dropdown-toggle\" data-toggle=\"dropdown\"\n                                aria-haspopup=\"true\" aria-expanded=\"false\">\n                            Action <span class=\"caret\"></span>\n                        </button>\n                        <ul class=\"dropdown-menu\">\n                            <li><a href=\"#\">Action</a></li>\n                            <li><a href=\"#\">Another action</a></li>\n                            <li><a href=\"#\">Something else here</a></li>\n                            <li role=\"separator\" class=\"divider\"></li>\n                            <li><a href=\"#\">Separated link</a></li>\n                        </ul>\n                    </div>\n                </div>\n            </div>\n            <div class=\"panel panel-danger\" data-sortable=\"true\" data-inner-id=\"lobipanel-danger\">\n                <div class=\"panel-heading\">\n                    <div class=\"panel-title\">\n                        <h4>Panel title</h4>\n                    </div>\n                </div>\n                <div class=\"panel-body\">\n                    Panel 5\n                </div>\n            </div>\n        </div>\n    </div>\n    <div class=\"row lobipanel-parent-stateful\">\n\n        <div class=\"col-sm-6 lobipanel-parent-sortable\" data-inner-id=\"lobipanel-parent-stateful3\">\n        </div>\n        <div class=\"col-sm-6 lobipanel-parent-sortable\" data-inner-id=\"lobipanel-parent-stateful4\">\n        </div>\n    </div>\n</div>\n\n<!--Default installation-->\n<script src=\"../bower_components/jquery/dist/jquery.js\"></script>\n<script src=\"../bower_components/jquery-ui/jquery-ui.js\"></script>\n<script src=\"../bower_components/jquery-ui-touch-punch-improved/jquery.ui.touch-punch-improved.js\"></script>\n<script src=\"../bower_components/bootstrap/dist/js/bootstrap.js\"></script>\n\n<!--Installation using bower. Preferred!!! -->\n<!--<script src=\"bower_components/jquery/dist/jquery.min.js\"></script>-->\n<!--<script src=\"bower_components/jquery-ui/jquery-ui.min.js\"></script>-->\n<!--<script src=\"bower_components/jquery-ui-touch-punch-improved/jquery.ui.touch-punch-improved.js\"></script>-->\n<!--<script src=\"bower_components/bootstrap/dist/js/bootstrap.min.js\"></script>-->\n\n<script src=\"../js/lobipanel.js\"></script>\n\n<script>\n    $(function () {\n        $('.lobipanel-parent-stateful .panel').lobiPanel({\n            stateful: true\n        });\n    });\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "dist/css/lobipanel.css",
    "content": ".spinner-wrapper {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background-color: rgba(255, 255, 255, 0.5);\n}\n.spinner-windows8 {\n  position: relative;\n  display: block;\n  margin: 0 auto;\n  width: 50px;\n  height: 50px;\n  margin-top: 100px;\n}\n.spinner-windows8 .wBall {\n  position: absolute;\n  width: 48px;\n  height: 48px;\n  opacity: 0;\n  -moz-transform: rotate(225deg);\n  -moz-animation: orbit 2.75s infinite;\n  -webkit-transform: rotate(225deg);\n  -webkit-animation: orbit 2.75s infinite;\n  -ms-transform: rotate(225deg);\n  -ms-animation: orbit 2.75s infinite;\n  -o-transform: rotate(225deg);\n  -o-animation: orbit 2.75s infinite;\n  transform: rotate(225deg);\n  animation: orbit 2.75s infinite;\n}\n.spinner-windows8 .wBall .wInnerBall {\n  position: absolute;\n  width: 6px;\n  height: 6px;\n  background: #000000;\n  left: 0px;\n  top: 0px;\n  -moz-border-radius: 6px;\n  -webkit-border-radius: 6px;\n  -ms-border-radius: 6px;\n  -o-border-radius: 6px;\n  border-radius: 6px;\n  z-index: 2;\n}\n.spinner-windows8 .wBall:first-child {\n  -moz-animation-delay: 0.6s;\n  -webkit-animation-delay: 0.6s;\n  -ms-animation-delay: 0.6s;\n  -o-animation-delay: 0.6s;\n  animation-delay: 0.6s;\n}\n.spinner-windows8 .wBall:nth-child(2) {\n  -moz-animation-delay: 0.12s;\n  -webkit-animation-delay: 0.12s;\n  -ms-animation-delay: 0.12s;\n  -o-animation-delay: 0.12s;\n  animation-delay: 0.12s;\n}\n.spinner-windows8 .wBall:nth-child(3) {\n  -moz-animation-delay: 0.24s;\n  -webkit-animation-delay: 0.24s;\n  -ms-animation-delay: 0.24s;\n  -o-animation-delay: 0.24s;\n  animation-delay: 0.24s;\n}\n.spinner-windows8 .wBall:nth-child(4) {\n  -moz-animation-delay: 0.36s;\n  -webkit-animation-delay: 0.36s;\n  -ms-animation-delay: 0.36s;\n  -o-animation-delay: 0.36s;\n  animation-delay: 0.36s;\n}\n.spinner-windows8 .wBall:nth-child(5) {\n  -moz-animation-delay: 0.48s;\n  -webkit-animation-delay: 0.48s;\n  -ms-animation-delay: 0.48s;\n  -o-animation-delay: 0.48s;\n  animation-delay: 0.48s;\n}\n@-moz-keyframes orbit {\n  0% {\n    opacity: 1;\n    z-index: 99;\n    -moz-transform: rotate(180deg);\n    -moz-animation-timing-function: ease-out;\n  }\n  7% {\n    opacity: 1;\n    -moz-transform: rotate(300deg);\n    -moz-animation-timing-function: linear;\n    -moz-origin: 0%;\n  }\n  30% {\n    opacity: 1;\n    -moz-transform: rotate(410deg);\n    -moz-animation-timing-function: ease-in-out;\n    -moz-origin: 7%;\n  }\n  39% {\n    opacity: 1;\n    -moz-transform: rotate(645deg);\n    -moz-animation-timing-function: linear;\n    -moz-origin: 30%;\n  }\n  70% {\n    opacity: 1;\n    -moz-transform: rotate(770deg);\n    -moz-animation-timing-function: ease-out;\n    -moz-origin: 39%;\n  }\n  75% {\n    opacity: 1;\n    -moz-transform: rotate(900deg);\n    -moz-animation-timing-function: ease-out;\n    -moz-origin: 70%;\n  }\n  76% {\n    opacity: 0;\n    -moz-transform: rotate(900deg);\n  }\n  100% {\n    opacity: 0;\n    -moz-transform: rotate(900deg);\n  }\n}\n@-webkit-keyframes orbit {\n  0% {\n    opacity: 1;\n    z-index: 99;\n    -webkit-transform: rotate(180deg);\n    -webkit-animation-timing-function: ease-out;\n  }\n  7% {\n    opacity: 1;\n    -webkit-transform: rotate(300deg);\n    -webkit-animation-timing-function: linear;\n    -webkit-origin: 0%;\n  }\n  30% {\n    opacity: 1;\n    -webkit-transform: rotate(410deg);\n    -webkit-animation-timing-function: ease-in-out;\n    -webkit-origin: 7%;\n  }\n  39% {\n    opacity: 1;\n    -webkit-transform: rotate(645deg);\n    -webkit-animation-timing-function: linear;\n    -webkit-origin: 30%;\n  }\n  70% {\n    opacity: 1;\n    -webkit-transform: rotate(770deg);\n    -webkit-animation-timing-function: ease-out;\n    -webkit-origin: 39%;\n  }\n  75% {\n    opacity: 1;\n    -webkit-transform: rotate(900deg);\n    -webkit-animation-timing-function: ease-out;\n    -webkit-origin: 70%;\n  }\n  76% {\n    opacity: 0;\n    -webkit-transform: rotate(900deg);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: rotate(900deg);\n  }\n}\n@-ms-keyframes orbit {\n  0% {\n    opacity: 1;\n    z-index: 99;\n    -ms-transform: rotate(180deg);\n    -ms-animation-timing-function: ease-out;\n  }\n  7% {\n    opacity: 1;\n    -ms-transform: rotate(300deg);\n    -ms-animation-timing-function: linear;\n    -ms-origin: 0%;\n  }\n  30% {\n    opacity: 1;\n    -ms-transform: rotate(410deg);\n    -ms-animation-timing-function: ease-in-out;\n    -ms-origin: 7%;\n  }\n  39% {\n    opacity: 1;\n    -ms-transform: rotate(645deg);\n    -ms-animation-timing-function: linear;\n    -ms-origin: 30%;\n  }\n  70% {\n    opacity: 1;\n    -ms-transform: rotate(770deg);\n    -ms-animation-timing-function: ease-out;\n    -ms-origin: 39%;\n  }\n  75% {\n    opacity: 1;\n    -ms-transform: rotate(900deg);\n    -ms-animation-timing-function: ease-out;\n    -ms-origin: 70%;\n  }\n  76% {\n    opacity: 0;\n    -ms-transform: rotate(900deg);\n  }\n  100% {\n    opacity: 0;\n    -ms-transform: rotate(900deg);\n  }\n}\n@-o-keyframes orbit {\n  0% {\n    opacity: 1;\n    z-index: 99;\n    -o-transform: rotate(180deg);\n    -o-animation-timing-function: ease-out;\n  }\n  7% {\n    opacity: 1;\n    -o-transform: rotate(300deg);\n    -o-animation-timing-function: linear;\n    -o-origin: 0%;\n  }\n  30% {\n    opacity: 1;\n    -o-transform: rotate(410deg);\n    -o-animation-timing-function: ease-in-out;\n    -o-origin: 7%;\n  }\n  39% {\n    opacity: 1;\n    -o-transform: rotate(645deg);\n    -o-animation-timing-function: linear;\n    -o-origin: 30%;\n  }\n  70% {\n    opacity: 1;\n    -o-transform: rotate(770deg);\n    -o-animation-timing-function: ease-out;\n    -o-origin: 39%;\n  }\n  75% {\n    opacity: 1;\n    -o-transform: rotate(900deg);\n    -o-animation-timing-function: ease-out;\n    -o-origin: 70%;\n  }\n  76% {\n    opacity: 0;\n    -o-transform: rotate(900deg);\n  }\n  100% {\n    opacity: 0;\n    -o-transform: rotate(900deg);\n  }\n}\n@keyframes orbit {\n  0% {\n    opacity: 1;\n    z-index: 99;\n    transform: rotate(180deg);\n    animation-timing-function: ease-out;\n  }\n  7% {\n    opacity: 1;\n    transform: rotate(300deg);\n    animation-timing-function: linear;\n    origin: 0%;\n  }\n  30% {\n    opacity: 1;\n    transform: rotate(410deg);\n    animation-timing-function: ease-in-out;\n    origin: 7%;\n  }\n  39% {\n    opacity: 1;\n    transform: rotate(645deg);\n    animation-timing-function: linear;\n    origin: 30%;\n  }\n  70% {\n    opacity: 1;\n    transform: rotate(770deg);\n    animation-timing-function: ease-out;\n    origin: 39%;\n  }\n  75% {\n    opacity: 1;\n    transform: rotate(900deg);\n    animation-timing-function: ease-out;\n    origin: 70%;\n  }\n  76% {\n    opacity: 0;\n    transform: rotate(900deg);\n  }\n  100% {\n    opacity: 0;\n    transform: rotate(900deg);\n  }\n}\n.tooltip {\n  z-index: 20000;\n}\nbody.lobipanel-minimized {\n  padding-bottom: 36px;\n}\n.lobipanel {\n  position: relative;\n  margin-bottom: 15px;\n}\n.lobipanel > .panel-heading {\n  padding: 5px;\n  position: relative;\n  border-top-right-radius: 0px;\n  border-top-left-radius: 0px;\n}\n.lobipanel > .panel-heading > .panel-title {\n  float: left;\n  max-width: calc(100% - 30px);\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  font-size: 16px;\n  line-height: 30px;\n  padding-left: 15px;\n}\n.lobipanel > .panel-heading > .panel-title h1,\n.lobipanel > .panel-heading > .panel-title h2,\n.lobipanel > .panel-heading > .panel-title h3,\n.lobipanel > .panel-heading > .panel-title h4,\n.lobipanel > .panel-heading > .panel-title h5,\n.lobipanel > .panel-heading > .panel-title h6 {\n  margin: 0;\n  line-height: 30px;\n}\n.lobipanel > .panel-heading > .panel-title input {\n  color: inherit;\n  line-height: 30px;\n  border-radius: 2px;\n  padding: 0 5px;\n  width: 100%;\n  background-color: rgba(0, 0, 0, 0.2);\n  border: 1px solid transparent;\n  outline: 0;\n}\n.lobipanel > .panel-heading > .panel-title input:focus {\n  background-color: rgba(0, 0, 0, 0.15);\n}\n.lobipanel > .panel-heading .dropdown {\n  display: inline-block;\n  float: right;\n  position: relative;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu {\n  left: auto;\n  right: 0;\n  min-width: 0;\n  margin-top: 0;\n  border-radius: 0;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu > li > a .control-title {\n  display: inline-block;\n  margin-left: 15px;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu .style-change-item {\n  position: relative;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu .style-change-item .style-list {\n  position: absolute;\n  background: #f5f5f5;\n  box-shadow: 2px 2px 12px rgba(0, 0, 0, 0.3);\n  padding: 4px;\n  display: none;\n  width: 92px;\n  top: 100%;\n  right: 0;\n  z-index: 2;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu .style-change-item .style-list .style-item {\n  cursor: pointer;\n  display: inline-block;\n  width: 24px;\n  height: 24px;\n  margin: 2px;\n  border: 2px solid #f5f5f5;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu .style-change-item .style-list .style-item:hover {\n  border-color: #FFF;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu .style-change-item .style-list .style-item:active {\n  box-shadow: inset 2px 2px 10px rgba(0, 0, 0, 0.3);\n}\n.lobipanel > .panel-heading .dropdown .dropdown-menu .style-change-item .style-list.opened {\n  display: block;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-toggle {\n  border: none;\n  outline: 0;\n  background-color: transparent;\n  text-align: center;\n  padding: 0;\n  width: 30px;\n  font-size: 14px;\n  -webkit-transition: all 0.2s;\n  -o-transition: all 0.2s;\n  transition: all 0.2s;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-toggle .panel-control-icon {\n  top: 0;\n  line-height: 30px;\n}\n.lobipanel > .panel-heading .dropdown .dropdown-toggle:hover,\n.lobipanel > .panel-heading .dropdown .dropdown-toggle:hover:focus {\n  text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.6);\n  background-color: rgba(0, 0, 0, 0.15);\n}\n.lobipanel > .panel-heading .dropdown.open .dropdown-toggle {\n  text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.6);\n  background-color: rgba(0, 0, 0, 0.15);\n}\n.lobipanel > .panel-heading:before,\n.lobipanel > .panel-heading:after {\n  content: \" \";\n  display: table;\n}\n.lobipanel > .panel-heading:after {\n  clear: both;\n}\n@media screen and (min-width: 768px) {\n  .lobipanel .panel-heading .panel-title {\n    max-width: calc(100% - 180px);\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu {\n    position: static;\n    display: inline-block;\n    border: none;\n    padding: 0;\n    margin: 0;\n    min-width: 0;\n    width: auto;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n    background: transparent;\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li {\n    display: inline-block;\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li > a {\n    cursor: pointer;\n    color: inherit;\n    padding: 0;\n    outline: 0;\n    text-align: center;\n    width: 30px;\n    font-size: 14px;\n    -webkit-transition: all 0.2s;\n    -o-transition: all 0.2s;\n    transition: all 0.2s;\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li > a .panel-control-icon {\n    top: 0;\n    line-height: 30px;\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li > a .control-title {\n    display: none;\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li > a:hover,\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li > a:focus:hover {\n    text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.6);\n    background-color: rgba(0, 0, 0, 0.15);\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-menu > li > a:focus {\n    text-shadow: none;\n    background-color: transparent;\n  }\n  .lobipanel .panel-heading .dropdown .dropdown-toggle {\n    display: none;\n  }\n}\n.lobipanel > .panel-body {\n  overflow: auto;\n  position: relative;\n}\n.lobipanel .panel-loader {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: #fff;\n  opacity: 0.8;\n}\n.lobipanel.panel-collapsed > .panel-heading {\n  border-bottom: none;\n}\n.lobipanel.panel-collapsed > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"unpin\"],\n.lobipanel.panel-collapsed > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"reload\"],\n.lobipanel.panel-collapsed > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"expand\"] {\n  display: none;\n}\n.lobipanel.panel-expanded,\n.lobipanel.panel-unpin,\n.lobipanel.panel-minimized.panel-unpin {\n  margin-bottom: 0;\n}\n.lobipanel.panel-unpin {\n  overflow: hidden;\n  position: absolute;\n  z-index: 10000;\n  -webkit-box-shadow: 2px 2px 15px 5px rgba(10, 10, 10, 0.5);\n  box-shadow: 2px 2px 15px 5px rgba(10, 10, 10, 0.5);\n}\n.lobipanel.panel-unpin > .panel-heading {\n  cursor: move;\n}\n.lobipanel.panel-unpin.panel-minimized {\n  float: left;\n  position: static;\n  border-radius: 0;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n  min-width: 170px;\n  margin-right: 5px;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading {\n  padding: 0;\n  cursor: pointer;\n  border-bottom: none;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title {\n  max-width: calc(100% - 60px);\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title h1,\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title h2,\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title h3,\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title h4,\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title h5,\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .panel-title h6 {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu {\n  position: static;\n  display: inline-block;\n  border: none;\n  padding: 0;\n  margin: 0;\n  min-width: 0;\n  width: auto;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n  background: transparent;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li {\n  display: inline-block;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a {\n  cursor: pointer;\n  color: inherit;\n  padding: 0;\n  outline: 0;\n  text-align: center;\n  width: 30px;\n  font-size: 14px;\n  -webkit-transition: all 0.2s;\n  -o-transition: all 0.2s;\n  transition: all 0.2s;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a .panel-control-icon {\n  top: 0;\n  line-height: 30px;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a .control-title {\n  display: none;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a:hover,\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a:focus:hover {\n  text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.6);\n  background-color: rgba(0, 0, 0, 0.15);\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a:focus {\n  text-shadow: none;\n  background-color: transparent;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-toggle {\n  display: none;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a {\n  display: none;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"close\"],\n.lobipanel.panel-unpin.panel-minimized > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"expand\"] {\n  display: inline-block;\n}\n.lobipanel.panel-unpin.panel-minimized > .panel-body,\n.lobipanel.panel-unpin.panel-minimized > .panel-footer {\n  display: none !important;\n}\n.lobipanel.panel-expanded > .panel-heading {\n  cursor: default;\n}\n.lobipanel.panel-expanded > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"unpin\"],\n.lobipanel.panel-expanded > .panel-heading .dropdown .dropdown-menu > li > a[data-func=\"minimize\"] {\n  display: none;\n}\n.lobipanel.panel-expanded.panel-unpin > .panel-heading .panel-control[data-func=\"minimize\"] {\n  display: block;\n}\n.lobipanel-minimized-toolbar {\n  position: fixed;\n  height: 36px;\n  padding: 2px;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  z-index: 20000;\n  background: rgba(34, 115, 182, 0.51);\n}\n.lobipanel-placeholder {\n  background-color: #f9f5d1;\n  border: 1px dashed #919191;\n  margin-bottom: 15px;\n}\n.lobipanel-parent-sortable {\n  min-height: 20px;\n}\n"
  },
  {
    "path": "dist/js/lobipanel.js",
    "content": "//Author      : @arboshiki\n/**\n * Generates random string of n length.\n * String contains only letters and numbers\n *\n * @param {int} n\n * @returns {String}\n */\nMath.randomString = function (n) {\n    var text = \"\";\n    var possible = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n    for (var i = 0; i < n; i++)\n        text += possible.charAt(Math.floor(Math.random() * possible.length));\n\n    return text;\n};\n\n/**\n * This function is for HTML element style attribute.\n * It converts the style attribute to css object\n *\n * @returns {object}\n */\nString.prototype.getCss = function () {\n    var css = {};\n    var style = this.valueOf().split(';');\n    for (var i = 0; i < style.length; i++) {\n        style[i] = $.trim(style[i]);\n        if (style[i]) {\n            var s = style[i].split(':');\n            css[$.trim(s[0])] = $.trim(s[1]);\n        }\n    }\n    return css;\n};\nString.prototype.trim = function () {\n    return this.replace(/^\\s+|\\s+$/g, \"\");\n};\n\nString.prototype.toCamel = function () {\n    return this.replace(/(\\-[a-z])/g, function ($1) {\n        return $1.toUpperCase().replace('-', '');\n    });\n};\n\nString.prototype.toDash = function () {\n    return this.replace(/([A-Z])/g, function ($1) {\n        return \"-\" + $1.toLowerCase();\n    });\n};\nString.prototype.toUnderscore = function () {\n    return this.replace(/([A-Z])/g, function ($1) {\n        return \"_\" + $1.toLowerCase();\n    });\n};\n\n/**\n * Checks if number is between two numbers\n *\n * @param {number} num1\n * @param {number} num2\n * @param {boolean} including \"include these numbers in comparison or not\" default false\n * @returns boolean\n */\nNumber.prototype.isBetween = function (num1, num2, including) {\n    if (!including) {\n        if (this.valueOf() < num2 && this.valueOf() > num1) {\n            return true;\n        }\n    } else {\n        if (this.valueOf() <= num2 && this.valueOf() >= num1) {\n            return true;\n        }\n    }\n    return false;\n};\n\n/**\n * Inserts element at specific index in given elements children\n *\n * @param {number} i\n * @param {string} selector\n * @returns {undefined}\n */\n$.fn.insertAt = function (i, selector) {\n    var $object = selector;\n    if (typeof selector === 'string') {\n        $object = $(selector);\n    }\n\n    i = Math.min($object.children().length, i);\n    if (i == 0) {\n        $object.prepend(this);\n        return this;\n    }\n    var oldIndex = this.data('index');\n\n    if (!i || isNaN(i)) {\n        i = $object.children().length - 1;\n    }\n    this.attr('data-index', i);\n\n    var $el = $object.children().eq(i - 1);\n    if ($el.length) {\n        $el.after(this);\n    } else {\n        $object.append(this);\n    }\n    $object.children().each(function (index, el) {\n        var $el = $(el);\n        if (oldIndex < i && index > oldIndex && index <= i) {\n            $el.attr('data-index', parseInt($el.data('data-index'), 10) - 1);\n        } else if (oldIndex >= i && index > i && index <= oldIndex) {\n            $el.attr('data-index', parseInt($el.attr('data-index'), 10) + 1);\n        }\n    });\n    return this;\n};\n\n$.fn.disableSelection = function () {\n    return this\n        .attr('unselectable', 'on')\n        .css('user-select', 'none')\n        .on('selectstart', false);\n};\n\n$.fn.enableSelection = function () {\n    return this\n        .removeAttr('unselectable')\n        .css('user-select', 'initial')\n        .off('selectstart');\n};\n\n$(function () {\n    var STORAGE_PREFIX = 'lobipanel_';\n\n    var StorageLocal = function () {\n        this.saveChildPositions = function (parentInnerId, positions) {\n            if (positions !== undefined) {\n                localStorage.setItem(STORAGE_PREFIX + 'parent_' + parentInnerId, JSON.stringify(positions));\n            }\n        };\n\n        this.savePanelParams = function (innerId, storage) {\n            localStorage.setItem(STORAGE_PREFIX + innerId, JSON.stringify(storage));\n        };\n\n        this.getAllPanelPositions = function () {\n            var parents = [];\n            for (var i in localStorage) {\n                if (i.indexOf(STORAGE_PREFIX + 'parent_') === 0) {\n                    var innerParentId = i.replace(STORAGE_PREFIX + 'parent_', '');\n                    var $parent = $('.lobipanel-parent-sortable[data-inner-id=' + innerParentId + ']');\n                    if ($parent.length) {\n                        parents[innerParentId] = JSON.parse(localStorage[i]);\n                    }\n                }\n            }\n            return parents;\n        };\n\n        this.getPanelStorage = function (innerId) {\n            var item = localStorage.getItem(STORAGE_PREFIX + innerId);\n            return JSON.parse(item || null) || {};\n        };\n\n    };\n\n    var LobiPanel = function ($el, options) {\n        var me = this;\n\n        this.hasRandomId = false;\n        this.storage = {};\n\n\n        this.$el = $el;\n        if (!me.$el.data('inner-id')) {\n            me.hasRandomId = true;\n            me.$el.attr('data-inner-id', Math.randomString(10));\n        }\n\n        this.innerId = me.$el.data('inner-id');\n\n        this.$options = me._processInput(options);\n        me.$heading = this.$el.find('>.panel-heading');\n        me.$body = this.$el.find('>.panel-body');\n        me._init();\n        me.$el.css('display', 'none');\n        me._applyState(me.$options.state, me.$options.stateParams);\n        me.$el.css('display', 'block');\n        // me._applyIndex(me.$options.initialIndex);\n        me._triggerEvent(\"init\");\n    };\n\n    LobiPanel.prototype = {\n        _processInput: function (options) {\n            var me = this;\n            if (!options) {\n                options = {};\n            }\n\n\n            this.storageObject = options.storageObject || new StorageLocal();\n            if (!me.hasRandomId) {\n                me.storage = this.storageObject.getPanelStorage(me.innerId);\n            }\n            var opts = me._getOptionsFromAttributes();\n//            window.console.log(opts);\n            options = $.extend({}, $.fn.lobiPanel.DEFAULTS, me.storage, options, opts);\n            var objects = ['unpin', 'reload', 'expand', 'minimize', 'close', 'editTitle'];\n            for (var i = 0; i < objects.length; i++) {\n                var prop = objects[i];\n                if (typeof options[prop] === 'object') {\n                    options[prop] = $.extend({}, $.fn.lobiPanel.DEFAULTS[prop], options[prop], opts[prop]);\n                }\n            }\n            return options;\n        },\n        _init: function () {\n            var me = this;\n            me.$el.addClass('lobipanel');\n\n            me.$heading.append(me._generateControls());\n//------------------------------------------------------------------------------\n            var parent = me.$el.parent();\n            me._appendInnerIdToParent(parent, me.innerId);\n            me._enableSorting();\n            me._onToggleIconsBtnClick();\n            me._enableResponsiveness();\n            me._setBodyHeight();\n            if (me.$options.autoload) {\n                me.load();\n            }\n            var maxWidth = 'calc(100% - ' + me.$heading.find('.dropdown-menu').children().length * me.$heading.find('.dropdown-menu li').first().outerWidth() + \"px)\";\n            me.$heading.find('.panel-title').css('max-width', maxWidth);\n\n            if (me.getParam('panelTitle')) {\n                me.$heading.find('.panel-title').html(me.getParam('panelTitle'));\n            }\n\n            var style = me.getParam('panelStyle');\n            if (style) {\n                me.applyStyle(style.bg, style.text);\n            }\n\n            // me.savepanelPositions();\n            // me._triggerEvent(\"init\");\n        },\n        /**\n         * Checks if panel is initialized. Panel is initialized if it has\n         * lobipanel class and data-inner-id=\"\" attribute\n         *\n         * @returns {boolean}\n         */\n        isPanelInit: function () {\n            var me = this;\n            return me.$el.hasClass('lobipanel') && me.$el.data('inner-id');\n        },\n\n        /**\n         * Checks if panel is pinned or unpinned\n         *\n         * @returns {Boolean}\n         */\n        isPinned: function () {\n            var me = this;\n            return !me.$el.hasClass('panel-unpin');\n        },\n\n        /**\n         * Pin the panel\n         *\n         * @returns {LobiPanel}\n         */\n        pin: function () {\n            var me = this;\n\n            //disable resize functionality\n            me.disableResize();\n            me.disableDrag();\n\n            //remove on panel click event (which brings the panel into front)\n            me._offPanelClick();\n            //remove panel-unpin class\n            me.$el.removeClass('panel-unpin')\n            //save current position, z-index and size to use it for later unpin\n                .attr('old-style', me.$el.attr('style'))\n                // .removeAttr('style')\n                .css('position', 'relative');\n\n            var toRemoveProperties = [\n                'position',\n                'z-index',\n                'left',\n                'top',\n                'width',\n                'height'\n            ];\n\n            for (var i in toRemoveProperties) {\n                me.$el.css(toRemoveProperties[i], '');\n            }\n\n            me.$body.css({\n                width: '',\n                height: ''\n            });\n            me._setBodyHeight();\n            me._insertInParent();\n            me._enableSorting();\n            return me;\n        },\n\n        /**\n         * Unpin the panel\n         *\n         * @returns {LobiPanel}\n         */\n        unpin: function () {\n            var me = this;\n            if (me.$el.hasClass(\"panel-collapsed\")) {\n                return me;\n            }\n            me._disableSorting();\n            if (me.$el.attr('old-style')) {\n                me.$el.attr('style', me.$el.attr('old-style'));\n            } else {\n                var width = me.$el.width();\n                var height = me.$el.height();\n                var left = Math.max(0, (($(window).width() - me.$el.outerWidth()) / 2));\n                var top = Math.max(0, ($(document).scrollTop() + ($(window).height() - me.$el.outerHeight()) / 2));\n                me.$el.css({\n                    left: left,\n                    top: top,\n                    width: width,\n                    height: height\n                });\n            }\n            var res = me._getMaxZIndex();\n            me.$el.css('z-index', res['z-index'] + 1);\n            me._onPanelClick();\n\n            me.$el.addClass('panel-unpin');\n            $('body').append(me.$el);\n\n            var panelWidth = me._getAvailableWidth(me.$el.width());\n            var panelHeight = me._getAvailableHeight(me.$el.height());\n            me.$el.css({\n                position: 'absolute',\n                width: panelWidth,\n                height: panelHeight\n            });\n            //we give .panel-body to width and height in order .panel-body to start scroling\n            var bHeight = me._calculateBodyHeight(panelHeight);\n            var bWidth = me._calculateBodyWidth(panelWidth);\n            me.$body.css({\n                width: bWidth,\n                height: bHeight\n            });\n\n            if (me.$options.draggable) {\n                me.enableDrag();\n            }\n            if (me.$options.resize !== 'none') {\n                me.enableResize();\n            }\n            return me;\n        },\n\n        /**\n         * Toggles (pin or unpin) the panel\n         *\n         * @returns {LobiPanel}\n         */\n        togglePin: function () {\n            var me = this;\n            if (this.isPinned()) {\n                this.unpin();\n            } else {\n                this.pin();\n            }\n            return me;\n        },\n\n        /**\n         * Checks if panel is minimized or not. It does not matter if panel is pinned or not\n         *\n         * @returns {Boolean}\n         */\n        isMinimized: function () {\n            var me = this;\n            return me.$el.hasClass('panel-minimized') || me.$el.hasClass('panel-collapsed');\n        },\n\n        /**\n         * Minimize the panel. If panel is pinned it is minimized on its place\n         * if panel is unpinned it is minimized at the bottom of the page\n         *\n         * @returns {LobiPanel}\n         */\n        minimize: function () {\n            var me = this;\n            me._triggerEvent(\"beforeMinimize\");\n            if (me.isMinimized()) {\n                return me;\n            }\n            if (me.isPinned()) {\n                me.$body.slideUp();\n                me.$el.find('.panel-footer').slideUp();\n                me.$el.addClass('panel-collapsed');\n                me._saveState('collapsed');\n                me._changeClassOfControl(me.$heading.find('[data-func=\"minimize\"]'));\n            } else {\n                me.disableTooltips();\n                //get footer where we need to put panel\n                var footer = me._getFooterForMinimizedPanels();\n                //find other panels which are already inside footer\n                var children = footer.find('>*');\n                var left, top;\n                //get top coordinate of footer\n                top = footer.offset().top;\n                //if there are no other panels inside footer, this panel will be first\n                //and its left coordinate will be footer's left coordinate\n                if (children.length === 0) {\n                    left = footer.offset().left;\n                } else {\n                    //if there exist panels inside footer, then this panel's left\n                    //coordinate will be last panel's (in footer) right coordinate\n                    var ch = $(children[children.length - 1]);\n                    left = ch.offset().left + ch.width();\n                }\n                //if panel was not expanded and it was jus unpin we need to save\n                //panel's style\n                if (!me.$el.hasClass('panel-expanded')) {\n                    me.$el.attr('old-style', me.$el.attr('style'));\n                }\n                me.$el.animate({\n                    left: left,\n                    top: top,\n                    width: 200,\n                    height: footer.height()\n                }, 100, function () {\n                    //if panel was expanded on full screen before we minimize it\n                    //after minimization we remove 'panel-expanded' class and we change icon\n                    if (me.$el.hasClass('panel-expanded')) {\n                        me.$el.removeClass('panel-expanded');\n                        me.$el.find('.panel-heading [data-func=expand] .' + LobiPanel.PRIVATE_OPTIONS.iconClass)\n                            .removeClass(me.$options.expand.icon2)\n                            .addClass(me.$options.expand.icon)\n                        ;\n                    }\n                    //we add 'panel-minimized' class\n                    me.$el.addClass('panel-minimized');\n                    me.$el.removeAttr('style');\n                    me.disableDrag();\n                    me.disableResize();\n                    me._expandOnHeaderClick();\n                    //animation was made and panel is positioned in place we it must be\n                    //so we append panel into footer\n                    footer.append(me.$el);\n                    $('body').addClass('lobipanel-minimized');\n                    var maxWidth = 'calc(100% - ' + me.$heading.find('.dropdown-menu li>a:visible').length * me.$heading.find('.dropdown-menu li>a:visible').first().outerWidth() + \"px)\";\n                    me.$heading.find('.panel-title').css('max-width', maxWidth);\n                    me._saveState('minimized');\n                    me._triggerEvent(\"onMinimize\");\n                });\n            }\n            return me;\n        },\n\n        /**\n         * Maximize the panel. This method works for minimized panel.\n         * If panel is pinned it's maximized on its place.\n         * If panel is unpinned it's maximized on position from which it was minimized\n         *\n         * @returns {LobiPanel}\n         */\n        maximize: function () {\n            var me = this;\n            me._triggerEvent(\"beforeMaximize\");\n            if (!me.isMinimized()) {\n                return me;\n            }\n            if (me.isPinned()) {\n                me.$body.slideDown();\n                me.$el.find('.panel-footer').slideDown();\n                me.$el.removeClass('panel-collapsed');\n                me._saveState('pinned');\n                me._changeClassOfControl(me.$heading.find('[data-func=\"minimize\"]'));\n                me._triggerEvent(\"onMaximize\");\n            } else {\n                me.enableTooltips();\n                //we get css style which was saved before minimization\n                var css = me.$el.attr('old-style').getCss();\n                //we give panel these css properties, coz animation work\n                me.$el.css({\n                    position: css.position || 'fixed',\n                    'z-index': css['z-index'],\n                    left: me.$el.offset().left,\n                    top: me.$el.offset().top,\n                    width: me.$el.width(),\n                    height: me.$el.height()\n                });\n                //we append panel into body\n                $('body').append(me.$el);\n                //It is not possible to make animations to these propeties and we remove it\n                delete css['position'];\n                delete css['z-index'];\n//            css['position'] = 'absolute';\n                //and we animate panel to its saved style\n                me.$el.animate(css, 100, function () {\n                    //we remove position property from style, before 'panel-unpin'\n                    //class has it to absolute\n                    me.$el.css('position', '');\n                    me.$el.removeClass('panel-minimized');\n                    //as panel is already in its place we remove 'old-style' property\n                    me.$el.removeAttr('old-style');\n                    if (me.$options.draggable) {\n                        me.enableDrag();\n                    }\n                    me.enableResize();\n                    me._removeExpandOnHeaderClick();\n                    //If there are no other elements inside footer, remove it also\n                    var footer = me._getFooterForMinimizedPanels();\n                    if (footer.children().length === 0) {\n                        footer.remove();\n                    }\n                    $('body').removeClass('lobipanel-minimized')\n                        .addClass('lobipanel-minimized');\n                    var maxWidth = 'calc(100% - ' + me.$heading.find('.dropdown-menu li').length * me.$heading.find('.dropdown-menu li').first().outerWidth() + \"px)\";\n                    me.$heading.find('.panel-title').css('max-width', maxWidth);\n                    me._updateUnpinnedState();\n                    me._triggerEvent(\"onMaximize\");\n                });\n            }\n            return me;\n        },\n\n        /**\n         * Toggles (minimize or maximize) the panel state.\n         *\n         * @returns {LobiPanel}\n         */\n        toggleMinimize: function () {\n            var me = this;\n            if (me.isMinimized()) {\n                me.maximize();\n            } else {\n                me.minimize();\n            }\n            return me;\n        },\n\n        /**\n         * Checks if panel is on full screen\n         *\n         * @returns {Boolean}\n         */\n        isOnFullScreen: function () {\n            var me = this;\n            return me.$el.hasClass('panel-expanded');\n        },\n\n        /**\n         * Expands the panel to full screen size\n         *\n         * @returns {LobiPanel}\n         */\n        toFullScreen: function () {\n            var me = this;\n            me._triggerEvent(\"beforeFullScreen\");\n            if (me.$el.hasClass(\"panel-collapsed\")) {\n                return me;\n            }\n            me.$el.attr('data-index', me.$el.index());\n            me._changeClassOfControl(me.$heading.find('[data-func=\"expand\"]'));\n            me.$el.css('position', 'fixed');\n            var res = me._getMaxZIndex();\n            //if panel is pinned or minimized, its position is not absolute and\n            //animation will not work correctly so we change its position and\n            //other css properties and we append panel into body\n            if (me.isPinned() || me.isMinimized()) {\n                me.enableTooltips();\n                me.$el.css({\n                    \"z-index\": res[\"z-index\"] + 1,\n                    left: me.$el.offset().left,\n                    top: me.$el.offset().top - $(window).scrollTop(),\n                    width: me.$el.width(),\n                    height: me.$el.height()\n                });\n                $('body').append(me.$el);\n                //If we are expanding panel to full screen from footer and in footer there are no more elements\n                //remove footer also\n                var footer = me._getFooterForMinimizedPanels();\n                if (footer.children().length === 0) {\n                    footer.remove();\n                }\n            } else {\n                me.$body.css({\n                    width: '',\n                    height: ''\n                });\n                me._setBodyHeight();\n            }\n            //if panel is not minimized we save its style property, because when\n            //toSmallSize() method is called panel needs to have style, it had before calling method\n            // toFullScreen()\n            if (!me.isMinimized()) {\n                me.$el.attr('old-style', me.$el.attr('style'));\n                me.disableResize();\n            } else {\n                me.$el.removeClass('panel-minimized');\n                me._removeExpandOnHeaderClick();\n            }\n            //get toolbar\n            var toolbar = $('.' + LobiPanel.PRIVATE_OPTIONS.toolbarClass);\n            var toolbarHeight = toolbar.outerHeight() || 0;\n            me.$el.animate({\n                width: $(window).width(),\n                height: $(window).height() - toolbarHeight,\n                left: 0,\n                top: 0\n            }, me.$options.expandAnimation, function () {\n                me.$el.css({\n                    width: '',\n                    height: '',\n                    right: 0,\n                    bottom: toolbarHeight\n                });\n                me.$el.addClass('panel-expanded');\n                $('body').css('overflow', 'hidden');\n                me.$body.css({\n                    width: me._calculateBodyWidth(me.$el.width()),\n                    height: me._calculateBodyHeight(me.$el.height())\n                });\n                me.disableDrag();\n                if (me.isPinned()) {\n                    me._disableSorting();\n                }\n                me._saveState('fullscreen');\n                me._triggerEvent(\"onFullScreen\");\n            });\n            return me;\n        },\n\n        /**\n         * Collapse the panel to small size\n         *\n         * @returns {LobiPanel}\n         */\n        toSmallSize: function () {\n            var me = this;\n            me._triggerEvent(\"beforeSmallSize\");\n            me._changeClassOfControl(me.$heading.find('[data-func=\"expand\"]'));\n            var css = me.$el.attr('old-style').getCss();\n\n            var toRemoveProperties = [\n                'position',\n                'z-index',\n                'left',\n                'top',\n                'width',\n                'height'\n            ];\n\n            //we get css properties from old-style (saved before expanding)\n            //and we animate panel to this css properties\n            me.$el.animate({\n                position: 'absolute',\n                left: css.left,\n                top: css.top,\n                width: css.width,\n                height: css.height,\n                right: css.right,\n                bottom: css.bottom\n            }, me.$options.collapseAnimation, function () {\n                //we remove old-style as we do not need it\n                me.$el.removeAttr('old-style');\n                //if panel is pinned we also remove its style attribute and we\n                //append panel in its parent element\n                if (!me.$el.hasClass('panel-unpin')) {\n                    for (var i in toRemoveProperties) {\n                        me.$el.css(toRemoveProperties[i], '');\n                    }\n                    // me.$el.removeAttr('style');\n                    me._insertInParent();\n                    me._enableSorting();\n                } else {\n                    if (me.$options.draggable) {\n                        me.enableDrag();\n                    }\n                    me.enableResize();\n                }\n                me.$el.removeClass('panel-expanded');\n                $('body').css('overflow', 'auto');\n                var bWidth = '';\n                var bHeight = '';\n                if (!me.isPinned()) {\n                    bWidth = me._calculateBodyWidth(me.getWidth());\n                    bHeight = me._calculateBodyHeight(me.getHeight());\n                } else if (me.$options.bodyHeight !== 'auto') {\n                    bHeight = me.$options.bodyHeight;\n                }\n                if (me.isPinned()) {\n                    me._saveState('pinned');\n                } else {\n                    me._updateUnpinnedState();\n                }\n                me.$body.css({\n                    width: bWidth,\n                    height: bHeight\n                });\n                me._triggerEvent(\"onSmallSize\");\n            });\n            return me;\n        },\n\n        /**\n         * Toggles (changes to full screen size or to small size) the panel size\n         *\n         * @returns {LobiPanel}\n         */\n        toggleSize: function () {\n            var me = this;\n            if (me.isOnFullScreen()) {\n                me.toSmallSize();\n            } else {\n                me.toFullScreen();\n            }\n            return me;\n        },\n\n        /**\n         * Closes the panel. Removes it from document\n         *\n         * @param {number} animationDuration\n         * @returns {LobiPanel}\n         */\n        close: function (animationDuration) {\n            var me = this,\n                animationDuration = animationDuration === undefined ? 100 : animationDuration;\n            me._triggerEvent('beforeClose');\n            me.$el.hide(animationDuration, function () {\n                if (me.isOnFullScreen()) {\n                    $('body').css('overflow', 'auto');\n                }\n                me._triggerEvent('onClose');\n                me.$el.remove();\n                var footer = me._getFooterForMinimizedPanels();\n                if (footer.children().length === 0) {\n                    footer.remove();\n                }\n            });\n            return me;\n        },\n\n        /**\n         * Moves unpinned panel to given position.\n         * This method will do nothing if panel is pinned\n         *\n         * @param {number} left\n         * @param {number} top\n         * @param {number} animationDuration\n         * @returns {LobiPanel}\n         */\n        setPosition: function (left, top, animationDuration) {\n            var me = this,\n                animationDuration = animationDuration === undefined ? 100 : animationDuration;\n\n            //this method works only if panel is not pinned\n            if (me.isPinned()) {\n                return me;\n            }\n            me.$el.animate({\n                'left': left,\n                'top': top\n            }, animationDuration);\n            return me;\n        },\n\n        /**\n         * Set the width of the panel\n         *\n         * @param {number} w\n         * @param {number} animationDuration\n         * @returns {LobiPanel}\n         */\n        setWidth: function (w, animationDuration) {\n            var me = this,\n                animationDuration = animationDuration === undefined ? 100 : animationDuration;\n            if (me.isPinned()) {\n                return me;\n            }\n            var bWidth = me._calculateBodyWidth(w);\n            me.$el.animate({\n                width: w\n            }, animationDuration);\n            me.$body.animate({\n                width: bWidth\n            }, animationDuration);\n            return me;\n        },\n\n        /**\n         * Set the height of the panel\n         *\n         * @param {number} h\n         * @param {number} animationDuration\n         * @returns {LobiPanel}\n         */\n        setHeight: function (h, animationDuration) {\n            var me = this,\n                animationDuration = animationDuration === undefined ? 100 : animationDuration;\n            if (me.isPinned()) {\n                return me;\n            }\n            var bHeight = me._calculateBodyHeight(h);\n            me.$el.animate({\n                height: h\n            }, animationDuration);\n            me.$body.animate({\n                height: bHeight\n            }, animationDuration);\n            return me;\n        },\n\n        /**\n         * Set size (width and height) of the panel\n         *\n         * @param {number} w\n         * @param {number} h\n         * @param {number} animationDuration\n         * @returns {LobiPanel}\n         */\n        setSize: function (w, h, animationDuration) {\n            var me = this,\n                animationDuration = animationDuration === undefined ? 100 : animationDuration;\n            if (me.isPinned()) {\n                return me;\n            }\n            var bHeight = me._calculateBodyHeight(h);\n            var bWidth = me._calculateBodyWidth(w);\n            me.$el.animate({\n                height: h,\n                width: w\n            }, animationDuration);\n            me.$body.animate({\n                height: bHeight,\n                width: bWidth\n            }, animationDuration);\n            return me;\n        },\n\n        /**\n         * Get the position of the panel.\n         * Returns object where x is left coordinate and y is top coordinate\n         *\n         * @returns {Object}\n         */\n        getPosition: function () {\n            var me = this;\n            var offset = me.$el.offset();\n            return {\n                x: offset.left,\n                y: offset.top\n            };\n        },\n\n        /**\n         * Get width of the panel\n         *\n         * @returns {number}\n         */\n        getWidth: function () {\n            var me = this;\n            return me.$el.width();\n        },\n\n        /**\n         * Get height of the panel\n         *\n         * @returns {number}\n         */\n        getHeight: function () {\n            var me = this;\n            return me.$el.height();\n        },\n\n        /**\n         * If panel is overlapped by another panel this panel will be shown on front\n         * (this panel will overlap other panels)\n         *\n         * @returns {LobiPanel}\n         */\n        bringToFront: function () {\n            var me = this;\n            me._triggerEvent(\"beforeToFront\");\n            var res = me._getMaxZIndex();\n            if (res['id'] === me.$el.data('inner-id')) {\n                return me;\n            }\n            me.$el.css('z-index', res['z-index'] + 1);\n            me._triggerEvent(\"onToFront\");\n            return me;\n        },\n\n        /**\n         * Enable dragging of panel\n         *\n         * @returns {LobiPanel}\n         */\n        enableDrag: function () {\n            var me = this;\n            me.$el.draggable({\n                handle: '.panel-heading',\n                containment: me.$options.constrain,\n                start: function () {\n                    me.$el.css('position', 'absolute');\n                },\n                stop: function () {\n                    me.$el.css('position', '');\n                    me._updateUnpinnedState();\n                }\n            });\n            return me;\n        },\n\n        /**\n         * Disable dragging of the panel\n         *\n         * @returns {LobiPanel}\n         */\n        disableDrag: function () {\n            var me = this;\n            if (me.$el.hasClass('ui-draggable')) {\n                me.$el.draggable(\"destroy\");\n            }\n            return me;\n        },\n\n        /**\n         * Enable resize of the panel\n         *\n         * @returns {LobiPanel}\n         */\n        enableResize: function () {\n            var me = this;\n            var handles = false;\n            if (me.$options.resize === 'vertical') {\n                handles = 'n, s';\n            } else if (me.$options.resize === 'horizontal') {\n                handles = 'e, w';\n            } else if (me.$options.resize === 'both') {\n                handles = 'all';\n            }\n            if (!handles) {\n                return me;\n            }\n            me.$el.resizable({\n                minWidth: me.$options.minWidth,\n                maxWidth: me.$options.maxWidth,\n                minHeight: me.$options.minHeight,\n                maxHeight: me.$options.maxHeight,\n                handles: handles,\n                start: function () {\n                    me.$el.disableSelection();\n                    me._triggerEvent('resizeStart');\n                },\n                stop: function () {\n                    me.$el.enableSelection();\n                    me._triggerEvent('resizeStop');\n                },\n                resize: function () {\n                    var bHeight = me._calculateBodyHeight(me.$el.height());\n                    var bWidth = me._calculateBodyWidth(me.$el.width());\n                    me.$body.css({\n                        width: bWidth,\n                        height: bHeight\n                    });\n                    me._updateUnpinnedState();\n                    me._triggerEvent(\"onResize\");\n                }\n            });\n            return me;\n        },\n\n        /**\n         * Disable resize of the panel\n         *\n         * @returns {LobiPanel}\n         */\n        disableResize: function () {\n            var me = this;\n            if (me.$el.hasClass('ui-resizable')) {\n                me.$el.resizable(\"destroy\");\n            }\n            return me;\n        },\n\n        /**\n         * Start spinner of the panel loading\n         *\n         * @returns {LobiPanel}\n         */\n        startLoading: function () {\n            var me = this;\n            var spinner = me._generateWindow8Spinner();\n            me.$el.append(spinner);\n            var sp = spinner.find('.spinner');\n            sp.css('margin-top', 50);\n            return me;\n        },\n\n        /**\n         * Stop spinner of the panel loading\n         *\n         * @returns {LobiPanel}\n         */\n        stopLoading: function () {\n            var me = this;\n            me.$el.find('.spinner-wrapper').remove();\n            return me;\n        },\n\n        /**\n         * Set url. This url will be used to load data when Reload button is clicked\n         * or user calls .load() method without url parameter\n         *\n         * @param {string} url\n         * @returns {LobiPanel}\n         */\n        setLoadUrl: function (url) {\n            var me = this;\n            me.$options.loadUrl = url;\n            return me;\n        },\n\n        /**\n         * Load data into .panel-body.\n         * params object is in format\n         * {\n         *      url: '', //Optional: load url\n         *      data: 'PlainObject or String', //Optional: A plain object or string of parameters which is sent to the server with the request.\n         *      callback: 'function' //Optional: callback function which is called when load is finished\n         * }\n         *\n         * @param {Object} params\n         * @returns {LobiPanel}\n         */\n        load: function (params) {\n            var me = this;\n            params = params || {};\n            if (typeof params === 'string') {\n                params = {url: params};\n            }\n            var url = params.url || me.$options.loadUrl,\n                data = params.data || {},\n                callback = params.callback || null;\n\n            if (!url) {\n                return me;\n            }\n            me._triggerEvent(\"beforeLoad\");\n            me.startLoading();\n            me.$body.load(url, data, function (result, status, xhr) {\n                if (callback && typeof callback === 'function') {\n                    me.callback(result, status, xhr);\n                }\n                me.stopLoading();\n                me._triggerEvent(\"loaded\", result, status, xhr);\n            });\n            return me;\n        },\n\n        /**\n         * Destroy the LobiPanel instance\n         *\n         * @returns {jQuery}\n         */\n        destroy: function () {\n            var me = this;\n            me.disableDrag();\n            me.disableResize();\n            me.$options.sortable = false;\n            me._enableSorting();\n            me._removeInnerIdFromParent(me.innerId);\n            me.$el.removeClass('lobipanel')\n                .removeAttr('data-inner-id')\n                .removeAttr('data-index')\n                .removeData('lobiPanel');\n            me.$heading.find('.dropdown').remove();\n            return me.$el;\n        },\n\n        /**\n         * Creates input field to edit panel title\n         *\n         * @returns {LobiPanel}\n         */\n        startTitleEditing: function () {\n            var me = this;\n            var title = me.$heading.find('.panel-title').text().trim();\n            var input = $('<input value=\"' + title + '\"/>');\n            input.on('keydown', function (ev) {\n                if (ev.which === 13) {\n                    me.finishTitleEditing();\n                } else if (ev.which === 27) {\n                    me.cancelTitleEditing();\n                }\n            });\n            me.$heading.find('.panel-title')\n                .data('old-title', title)\n                .html(\"\").append(input);\n            input[0].focus();\n            input[0].select();\n            me._changeClassOfControl(me.$heading.find('[data-func=\"editTitle\"]'));\n            return me;\n        },\n\n        /**\n         * Check if panel title is being edited (if it is in edit process)\n         *\n         * @returns {Boolean}\n         */\n        isTitleEditing: function () {\n            var me = this;\n            return me.$heading.find('.panel-title input').length > 0;\n        },\n\n        /**\n         * Cancel the panel new title and return to previous title when it is changed but not saved\n         *\n         * @returns {LobiPanel}\n         */\n        cancelTitleEditing: function () {\n            var me = this;\n            var title = me.$heading.find('.panel-title');\n            title.html(title.data('old-title'))\n                .find('input').remove();\n            me._changeClassOfControl(me.$heading.find('[data-func=\"editTitle\"]'));\n            return me;\n        },\n\n        /**\n         * Finish the panel title editing process and save new title\n         *\n         * @returns {LobiPanel}\n         */\n        finishTitleEditing: function () {\n            var me = this,\n                input = me.$heading.find('input');\n            if (me._triggerEvent('beforeTitleChange', input.val()) === false) {\n                return me;\n            }\n\n            me.saveParam('panelTitle', input.val());\n            me.$heading.find('.panel-title').html(input.val());\n            input.remove();\n            me._changeClassOfControl(me.$heading.find('[data-func=\"editTitle\"]'));\n            me._triggerEvent('onTitleChange', input.val());\n            return me;\n        },\n\n        /**\n         * Enable tooltips on panel controls\n         *\n         * @returns {LobiPanel}\n         */\n        enableTooltips: function () {\n            var me = this;\n            if ($(window).width() < 768) {\n                return me;\n            }\n            var controls = me.$heading.find('.dropdown-menu>li>a');\n            controls.each(function (index, el) {\n                var $el = $(el);\n                $el.attr('data-toggle', 'tooltip')\n                    .attr('data-title', $el.data('tooltip'))\n                    .attr('data-placement', 'bottom')\n                ;\n            });\n            controls.each(function (ind, el) {\n                $(el).tooltip({\n                    container: 'body',\n                    template: '<div class=\"tooltip lobipanel-tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n                });\n            });\n            return me;\n        },\n\n        /**\n         * Disable tooltips on panel controls\n         *\n         * @returns {LobiPanel}\n         */\n        disableTooltips: function () {\n            var me = this;\n            var $links = me.$heading.find('.dropdown-menu>li>a');\n            $links.each(function (ind, el) {\n                var bsTooltip = $(el).data('bs.tooltip');\n                if (bsTooltip) {\n                    $(el).tooltip('destroy');\n                }\n            });\n            // me.$heading.find('.dropdown-menu>li>a').tooltip('destroy');\n            return me;\n        },\n\n        _generateControls: function () {\n            var me = this;\n            var dropdown = me._generateDropdown();\n            var menu = dropdown.find('.dropdown-menu');\n            if (me.$options.editTitle !== false) {\n                menu.append(me._generateEditTitle());\n            }\n            if (me.$options.unpin !== false) {\n                menu.append(me._generateUnpin());\n            }\n            if (me.$options.reload !== false) {\n                menu.append(me._generateReload());\n            }\n            if (me.$options.minimize !== false) {\n                menu.append(me._generateMinimize());\n            }\n            if (me.$options.expand !== false) {\n                menu.append(me._generateExpand());\n            }\n            if (me.$options.changeStyle !== false) {\n                menu.append(me._generateChangeStyle());\n            }\n            if (me.$options.close !== false) {\n                menu.append(me._generateClose());\n            }\n            menu.find('>li>a').on('click', function (ev) {\n                ev.preventDefault();\n                ev.stopPropagation();\n            });\n            return dropdown;\n        },\n        _generateDropdown: function () {\n            var me = this;\n            return $('<div class=\"dropdown\"'+(me.$options.forAngularJs ? ' uib-dropdown' : '')+'></div>')\n                .append('<ul class=\"dropdown-menu dropdown-menu-right\"'+(me.$options.forAngularJs ? ' uib-dropdown-menu' : '')+'></ul>')\n                .append('<div class=\"dropdown-toggle\"'+(me.$options.forAngularJs ? ' uib-dropdown-toggle' : ' data-toggle=\"dropdown\"')+'><span class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + me.$options.toggleIcon + '\"></div>');\n        },\n        _generateEditTitle: function () {\n            var me = this;\n            var options = me.$options.editTitle;\n            var control = $('<a data-func=\"editTitle\"></a>');\n            control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                control.attr('data-tooltip', options.tooltip);\n            }\n\n            me._attachEditTitleClickListener(control);\n            return $('<li></li>').append(control);\n        },\n        _attachEditTitleClickListener: function (control) {\n            var me = this;\n            control.on('mousedown', function (ev) {\n                ev.stopPropagation();\n            });\n            control.on('click', function (ev) {\n                ev.stopPropagation();\n                me.hideTooltip(control);\n                if (me.isTitleEditing()) {\n                    me.finishTitleEditing();\n                } else {\n                    me.startTitleEditing();\n                }\n            });\n        },\n\n        hideTooltip: function ($el) {\n            var bsTooltip = $el.data('bs.tooltip');\n\n            if (bsTooltip) {\n                $el.tooltip('hide');\n            }\n            return this;\n        },\n        _generateUnpin: function () {\n            var me = this;\n            var options = me.$options.unpin;\n            var control = $('<a data-func=\"unpin\"></a>');\n            control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                control.attr('data-tooltip', options.tooltip);\n            }\n            me._attachUnpinClickListener(control);\n            return $('<li></li>').append(control);\n        },\n        _attachUnpinClickListener: function (control) {\n            var me = this;\n            //hide the tooltip\n            control.on('mousedown', function (ev) {\n                ev.stopPropagation();\n            });\n            control.on('click', function () {\n                me.hideTooltip(control);\n                me.doTogglePin();\n            });\n        },\n        _generateReload: function () {\n            var me = this;\n            var options = me.$options.reload;\n            var control = $('<a data-func=\"reload\"></a>');\n            control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                control.attr('data-tooltip', options.tooltip);\n            }\n            me._attachReloadClickListener(control);\n            return $('<li></li>').append(control);\n        },\n        _attachReloadClickListener: function (control) {\n            var me = this;\n            control.on('mousedown', function (ev) {\n                ev.stopPropagation();\n            });\n            control.on('click', function () {\n                me.hideTooltip(control);\n                me.load();\n            });\n        },\n        _generateMinimize: function () {\n            var me = this;\n            var options = me.$options.minimize;\n            var control = $('<a data-func=\"minimize\"></a>');\n            control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                control.attr('data-tooltip', options.tooltip);\n            }\n            me._attachMinimizeClickListener(control);\n            return $('<li></li>').append(control);\n        },\n        _attachMinimizeClickListener: function (control) {\n            var me = this;\n            control.on('mousedown', function (ev) {\n                ev.stopPropagation();\n            });\n            control.on('click', function (ev) {\n                ev.stopPropagation();\n                me.hideTooltip(control);\n                me.toggleMinimize();\n            });\n        },\n        _generateExpand: function () {\n            var me = this;\n            var options = me.$options.expand;\n            var control = $('<a data-func=\"expand\"></a>');\n            control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                control.attr('data-tooltip', options.tooltip);\n            }\n            me._attachExpandClickListener(control);\n            return $('<li></li>').append(control);\n        },\n        _generateChangeStyle: function () {\n            var me = this;\n            var options = me.$options.changeStyle;\n            var $control = $('<a data-func=\"changeStyle\"></a>');\n            $control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                $control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                $control.attr('data-tooltip', options.tooltip);\n            }\n            // me._attachExpandClickListener(control);\n\n            var $dropdown = $('<li class=\"style-change-item\"></li>').append($control);\n\n            var $menu = $('<div>', {\n                'class': 'style-list'\n            }).appendTo($dropdown);\n\n            if (me.$options.styles) {\n                for (var i = 0; i < me.$options.styles.length; i++) {\n                    var style = me.$options.styles[i];\n                    $menu.append('<div class=\"style-item style-primary\" style=\"background-color: ' +\n                        style.bg + '\" data-bg=\"' + style.bg + '\" data-text=\"' + style.text + '\"></div>');\n                }\n            }\n            $menu.find('.style-item').on('click', function () {\n                var $item = $(this);\n                me.saveParam('panelStyle', {\n                    bg: $item.data('bg'),\n                    text: $item.data('text')\n                });\n                me.applyStyle($item.data('bg'), $item.data('text'));\n                $menu.removeClass('opened');\n            });\n\n            $control.on('click', function () {\n                var $this = $(this);\n                var $parent = $this.closest('.style-change-item');\n                $parent.find('.style-list').toggleClass('opened');\n            });\n\n            return $dropdown;\n        },\n\n        applyStyle: function (color, text) {\n            var me = this;\n            me.$heading.css('background-color', color);\n            me.$heading.css('border-color', color);\n            me.$heading.css('color', text);\n            me.$el.css('border-color', color);\n        },\n\n        _createDropdownForStyleChange: function () {\n            var me = this;\n            var $dropdown = $('<div>', {\n                'class': 'dropdown'\n            }).append(\n                $('<button>', {\n                    'type': 'button',\n                    'data-toggle': 'dropdown',\n                    'class': 'btn btn-default btn-xs',\n                    'html': '<i class=\"glyphicon glyphicon-th\"></i>'\n                })\n            );\n            var $menu = $('<div>', {\n                'class': 'dropdown-menu dropdown-menu-right'\n            }).appendTo($dropdown);\n\n            for (var i = 0; i < 0; i++) {\n                var st = me.$globalOptions.listStyles[i];\n                var st = 'primary';\n                $('<div class=\"' + st + '\"></div>')\n                    .on('mousedown', function (ev) {\n                        ev.stopPropagation()\n                    })\n                    .click(function () {\n                        var classes = me.$el[0].className.split(' ');\n                        var oldClass = null;\n                        for (var i = 0; i < classes.length; i++) {\n                            if (me.$globalOptions.listStyles.indexOf(classes[i]) > -1) {\n                                oldClass = classes[i];\n                            }\n                        }\n                        me.$el.removeClass(me.$globalOptions.listStyles.join(\" \"))\n                            .addClass(this.className);\n\n                        me._triggerEvent('styleChange', [me, oldClass, this.className]);\n\n                    })\n                    .appendTo($menu);\n            }\n\n            return $dropdown;\n        },\n        _attachExpandClickListener: function (control) {\n            var me = this;\n            control.on('mousedown', function (ev) {\n                ev.stopPropagation();\n            });\n            control.on('click', function (ev) {\n                ev.stopPropagation();\n                me.hideTooltip(control);\n                me.toggleSize();\n            });\n        },\n        _generateClose: function () {\n            var me = this;\n            var options = me.$options.close;\n            var control = $('<a data-func=\"close\"></a>');\n            control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                control.attr('data-tooltip', options.tooltip);\n            }\n            me._attachCloseClickListener(control);\n            return $('<li></li>').append(control);\n        },\n        _attachCloseClickListener: function (control) {\n            var me = this;\n            control.on('mousedown', function (ev) {\n                ev.stopPropagation();\n            });\n            control.on('click', function (ev) {\n                ev.stopPropagation();\n                me.hideTooltip(control);\n                me.close();\n            });\n        },\n        _getMaxZIndex: function () {\n            var me = this;\n            var panels = $('.lobipanel.panel-unpin:not(.panel-minimized.panel-expanded)'),\n                style,\n                max,\n                cur;\n            if (panels.length === 0) {\n                return {\n                    \"id\": \"\",\n                    \"z-index\": LobiPanel.PRIVATE_OPTIONS.initialZIndex\n                };\n            }\n            style = $(panels[0]).attr('style');\n            var id = $(panels[0]).data('inner-id');\n            if (!style) {\n                max = LobiPanel.PRIVATE_OPTIONS.initialZIndex;\n            } else {\n                max = style.getCss()['z-index'];\n            }\n            for (var i = 1; i < panels.length; i++) {\n                style = $(panels[i]).attr('style');\n                if (!style) {\n                    cur = 0;\n                } else {\n                    cur = style.getCss()['z-index'];\n                }\n                if (cur > max) {\n                    id = $(panels[i]).data('inner-id');\n                    max = cur;\n                }\n            }\n            return {\n                \"id\": id,\n                \"z-index\": parseInt(max, 10)\n            };\n        },\n        _onPanelClick: function () {\n            var me = this;\n            me.$el.on('mousedown.lobiPanel', function () {\n                if (me.isPinned() ||\n                    me.isMinimized() ||\n                    me.isOnFullScreen()) {\n                    return false;\n                }\n                me.bringToFront();\n            });\n        },\n        _offPanelClick: function () {\n            var me = this;\n            me.$el.off('mousedown.lobiPanel');\n        },\n        _changeClassOfControl: function (el) {\n            var me = this;\n            el = $(el);\n            var opts = me.$options[el.attr('data-func')];\n            if (!opts.icon) {\n                return;\n            }\n            el.find('.' + LobiPanel.PRIVATE_OPTIONS.iconClass).toggleClass(opts.icon).toggleClass(opts.icon2);\n        },\n        _getFooterForMinimizedPanels: function () {\n            var me = this;\n            //we grab footer where minimized panels should go\n            var minimizedCtr = $('.' + LobiPanel.PRIVATE_OPTIONS.toolbarClass);\n            //if panel does not exist we create it and append to body\n            if (minimizedCtr.length === 0) {\n                minimizedCtr = $('<div class=\"' + LobiPanel.PRIVATE_OPTIONS.toolbarClass + '\"></div>');\n                $('body').append(minimizedCtr);\n            }\n            return minimizedCtr;\n        },\n        _expandOnHeaderClick: function () {\n            var me = this;\n            me.$heading.on('click.lobiPanel', function () {\n                me.maximize();\n                me.bringToFront();\n            });\n        },\n        _removeExpandOnHeaderClick: function () {\n            var me = this;\n            me.$heading.off('click.lobiPanel');\n        },\n        _getAvailableWidth: function (calcWidth) {\n            var me = this;\n            if (me.$options.maxWidth) {\n                calcWidth = Math.min(calcWidth, me.$options.maxWidth);\n            }\n            if (me.$options.minWidth) {\n                calcWidth = Math.max(calcWidth, me.$options.minWidth);\n            }\n            return calcWidth;\n        },\n        _getAvailableHeight: function (calcHeight) {\n            var me = this;\n            if (me.$options.maxHeight) {\n                calcHeight = Math.min(calcHeight, me.$options.maxHeight);\n            }\n            if (me.$options.minHeight) {\n                calcHeight = Math.max(calcHeight, me.$options.minHeight);\n            }\n            return calcHeight;\n        },\n        _calculateBodyHeight: function (h) {\n            var me = this;\n            return h - me.$heading.outerHeight() - me.$el.find('.panel-footer').outerHeight();\n        },\n        _calculateBodyWidth: function (w) {\n            var me = this;\n            return w - 2;\n        },\n        _appendInnerIdToParent: function (parent, innerId) {\n            var me = this;\n            //If this is first lobipanel element of its parent\n            if (parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr) === undefined) {\n                parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr, innerId);\n            }\n            //This means that parent already has LobiPanel instance\n            else {\n                //if parent already has panel innerId than we do nothing\n                if (parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr).indexOf(innerId) > -1) {\n                    return;\n                }\n                var innerIds = parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr);\n                parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr, innerIds + \" \" + innerId);\n            }\n            me.$el.attr('data-index', me.$el.index());\n        },\n        _insertInParent: function () {\n            var me = this;\n            //find its parent element\n            var parent = $('[' + LobiPanel.PRIVATE_OPTIONS.parentAttr + '~=' + me.innerId + ']');\n            me.$el.insertAt(me.$el.attr('data-index'), parent);\n        },\n        _generateWindow8Spinner: function () {\n            var me = this;\n            var template = ['<div class=\"spinner spinner-windows8\">',\n                '<div class=\"wBall\">',\n                '<div class=\"wInnerBall\">',\n                '</div>',\n                '</div>',\n                '<div class=\"wBall\">',\n                '<div class=\"wInnerBall\">',\n                '</div>',\n                '</div>',\n                '<div class=\"wBall\">',\n                '<div class=\"wInnerBall\">',\n                '</div>',\n                '</div>',\n                '<div class=\"wBall\">',\n                '<div class=\"wInnerBall\">',\n                '</div>',\n                '</div>',\n                '<div class=\"wBall\">',\n                '<div class=\"wInnerBall\">',\n                '</div>',\n                '</div>',\n                '</div>'].join(\"\");\n            return $('<div class=\"spinner-wrapper\">' + template + '</div>');\n        },\n        _enableSorting: function () {\n            var me = this;\n            var parent = me.$el.parent();\n            if (parent.hasClass('ui-sortable')) {\n                parent.sortable(\"destroy\");\n            }\n            if (me.$options.sortable) {\n                me.$el.addClass('lobipanel-sortable');\n                parent.addClass('lobipanel-parent-sortable');\n            } else {\n                me.$el.removeClass('lobipanel-sortable');\n            }\n            parent.sortable({\n                connectWith: '.lobipanel-parent-sortable',\n                items: '.lobipanel-sortable',\n                handle: '.panel-heading',\n                cursor: 'move',\n                placeholder: 'lobipanel-placeholder',\n                forcePlaceholderSize: true,\n                opacity: 0.7,\n                revert: 300,\n                update: function (event, ui) {\n                    me.savepanelPositions();\n                    var $panel = ui.item;\n\n                    var innerId = $panel.data('inner-id');\n                    me._removeInnerIdFromParent(innerId);\n                    me._appendInnerIdToParent(ui.item.parent(), innerId);\n                    me._triggerEvent('dragged');\n                }\n            });\n        },\n\n        savepanelPositions: function () {\n            var me = this;\n            var $parents = $('.lobipanel-parent-sortable');\n            $parents.each(function (index, parent) {\n                var $parent = $(parent);\n\n                var parentInnerId = $parent.data('inner-id');\n                if (!parentInnerId) {\n                    console.error(\"Panel does not have parent id \", $parent);\n                    return;\n                }\n                var $childPanels = $parent.find('.lobipanel');\n                var positions = {};\n                $childPanels.each(function (index, el) {\n                    var $el = $(el);\n                    positions[$el.data('inner-id')] = index;\n                });\n                me.storageObject.saveChildPositions(parentInnerId, positions);\n            });\n        },\n\n        _disableSorting: function () {\n            var me = this;\n            var parent = me.$el.parent();\n            if (parent.hasClass('ui-sortable')) {\n                parent.sortable(\"destroy\");\n            }\n        },\n        _removeInnerIdFromParent: function (innerId) {\n            var me = this;\n            var parent = $('[' + LobiPanel.PRIVATE_OPTIONS.parentAttr + '~=' + innerId + ']');\n            if (parent.length) {\n                var innerIds = parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr).replace(innerId, '').trim().replace(/\\s{2,}/g, ' ');\n                parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr, innerIds);\n            }\n        },\n        _onToggleIconsBtnClick: function () {\n            var me = this;\n            me.$heading.find('.toggle-controls').on('click.lobiPanel', function () {\n                me.$el.toggleClass(\"controls-expanded\");\n            });\n        },\n        _adjustForScreenSize: function () {\n            var me = this;\n            me.disableTooltips();\n            if ($(window).width() > 768 && me.$options.tooltips) {\n                me.enableTooltips();\n            }\n            if (me.isOnFullScreen()) {\n                me.$body.css({\n                    width: me._calculateBodyWidth(me.$el.width()),\n                    height: me._calculateBodyHeight(me.$el.height())\n                });\n            }\n        },\n        _enableResponsiveness: function () {\n            var me = this;\n            me._adjustForScreenSize();\n            $(window).on('resize.lobiPanel', function () {\n                me._adjustForScreenSize();\n            });\n        },\n        _setBodyHeight: function () {\n            var me = this;\n            if (me.$options.bodyHeight !== 'auto') {\n                me.$body.css({\n                    'height': me.$options.bodyHeight,\n                    overflow: 'auto'\n                });\n            }\n        },\n        _getOptionsFromAttributes: function () {\n            var me = this;\n            var $el = me.$el;\n            var options = {};\n            for (var key in $.fn.lobiPanel.DEFAULTS) {\n                var k = key.toDash();\n                var val = $el.data(k);\n                if (val !== undefined) {\n                    if (typeof $.fn.lobiPanel.DEFAULTS[key] !== 'object') {\n                        options[key] = val;\n                    } else {\n                        options[key] = eval('(' + val + ')');\n                    }\n                }\n            }\n            return options;\n        },\n        _saveState: function (state, params) {\n            var me = this;\n            // console.log(\"Save state \", state, params);\n            if (!me.hasRandomId && me.$options.stateful) {\n                me.storage.state = state;\n                if (params) {\n                    me.storage.stateParams = params;\n                }\n\n                me._saveLocalStorage(me.storage);\n            }\n        },\n        getParam: function (key, value) {\n            var me = this;\n            // console.log(\"Save state \", state, params);\n            return me.storage[key];\n        },\n        saveParam: function (key, value) {\n            var me = this;\n            // console.log(\"Save state \", state, params);\n            me.storage[key] = value;\n\n            me._saveLocalStorage(me.storage);\n        },\n        _saveLocalStorage: function (storage) {\n            var me = this;\n            me.storageObject.savePanelParams(me.innerId, storage);\n        },\n        _applyState: function (state, params) {\n            var me = this;\n            switch (state) {\n                case 'pinned':\n                    if (!me.hasRandomId) {\n                        var allPanelPositions = me.storageObject.getAllPanelPositions();\n                        // console.log(allPanelPositions);\n                        for (var i in allPanelPositions) {\n                            var panelPositions = allPanelPositions[i];\n                            var innerParentId = i;\n                            var $parent = $('.lobipanel-parent-sortable[data-inner-id=' + innerParentId + ']');\n                            for (var j in panelPositions) {\n                                var $panel = $('[data-inner-id=' + j + ']');\n                                me._removeInnerIdFromParent($panel.data('inner-id'));\n                                me._appendInnerIdToParent($parent, $panel.data('inner-id'));\n                                if (!$panel.hasClass('panel-unpin') && !$panel.hasClass('panel-expanded')) {\n                                    $panel.insertAt(panelPositions[j], $parent);\n                                }\n                            }\n                        }\n                    }\n                    // if (params && params.index !== null && params.index !== undefined) {\n                    //     me._applyIndex(params.index);\n                    // }\n                    break;\n                case 'unpinned':\n                    me.unpin();\n                    me.setPosition(params.left, params.top, 0);\n                    me.setSize(params.width, params.height, 0);\n                    break;\n                case 'minimized':\n                    me.unpin();\n                    me.minimize();\n                    break;\n                case 'collapsed':\n                    me.minimize();\n                    break;\n                case 'fullscreen':\n                    me.toFullScreen();\n                    break;\n                default:\n                    break;\n            }\n        },\n        _applyIndex: function (index) {\n            var me = this;\n            if (index !== null) {\n                me.$el.insertAt(index, me.$el.parent());\n            }\n        },\n        _triggerEvent: function (eventType) {\n            var me = this;\n            var args = Array.prototype.slice.call(arguments, 1);\n            args.unshift(me);\n\n            me.$el.trigger(eventType + '.lobiPanel', args);\n            if (me.$options[eventType] && typeof me.$options[eventType] === 'function') {\n                return me.$options[eventType].apply(me, args);\n            }\n\n            return true;\n        },\n        doPin: function () {\n            var me = this;\n            if (me._triggerEvent(\"beforePin\") !== false) {\n                me.pin();\n                me._saveState('pinned');\n                me._triggerEvent(\"onPin\");\n            }\n            return me;\n        },\n        doUnpin: function () {\n            var me = this;\n            if (me._triggerEvent('beforeUnpin') !== false) {\n                me.unpin();\n                me._updateUnpinnedState();\n                me._triggerEvent('onUnpin');\n            }\n            return me;\n        },\n        doTogglePin: function () {\n            var me = this;\n            if (this.isPinned()) {\n                this.doUnpin();\n            } else {\n                this.doPin();\n            }\n            return me;\n        },\n        _updateUnpinnedState: function () {\n            var me = this;\n            me._saveState('unpinned', me.getAlignment());\n        },\n        getAlignment: function () {\n            var me = this;\n            return {\n                top: me.$el.css('top'),\n                left: me.$el.css('left'),\n                width: me.$el.css('width'),\n                height: me.$el.css('height')\n            };\n        }\n    };\n\n    $.fn.lobiPanel = function (option) {\n        var args = arguments,\n            ret = null;\n        this.each(function () {\n\n            var $this = $(this);\n            var data = $this.data('lobiPanel');\n            var options = typeof option === 'object' && option;\n\n            if (!data) {\n                $this.data('lobiPanel', (data = new LobiPanel($this, options)));\n            }\n            if (typeof option === 'string') {\n                args = Array.prototype.slice.call(args, 1);\n                ret = data[option].apply(data, args);\n            }\n        });\n        return ret;\n    };\n    $.fn.lobiPanelParent = function (option) {\n        this.each(function (index, parent) {\n            var $parent = $(parent);\n            if (!$parent.hasClass('ui-sortable')) {\n                $parent.sortable({\n                    connectWith: '.lobipanel-parent-sortable',\n                    items: '.lobipanel-sortable',\n                    handle: '.panel-heading',\n                    cursor: 'move',\n                    placeholder: 'lobipanel-placeholder',\n                    forcePlaceholderSize: true,\n                    opacity: 0.7,\n                    revert: 300,\n                    update: function (event, ui) {\n                        console.log(ui);\n                        // me.savepanelPositions();\n                        //\n                        // // me._removeInnerIdFromParent(innerId);\n                        // // me._appendInnerIdToParent(ui.item.parent(), innerId);\n                        // me._triggerEvent('dragged');\n                    }\n                });\n            }\n        });\n        return this;\n    };\n    LobiPanel.PRIVATE_OPTIONS = {\n        //We need to know what is the parent of the panel, that's why we add\n        //this attribute to parent element and it contains space seperated inner-ids of all its child lobipanel\n        parentAttr: 'data-lobipanel-child-inner-id',\n        toolbarClass: 'lobipanel-minimized-toolbar', //This class is added to container which contains all minimized panels\n        //First instance on lobiPanel will get this z-index css property.\n        //Every next instance will get 1 + previous z-index\n        initialZIndex: 10000,\n        //This class is attached to every panel-control icon\n        iconClass: 'panel-control-icon'\n    };\n    $.fn.lobiPanel.DEFAULTS = {\n        //Makes <b>unpinned</b> panel draggable\n        //Warning!!! This requires jquery ui draggable widget to be included\n        draggable: true,\n        //Makes <b>pinned</b> panels sortable\n        //Warning!!! This requires jquery ui sortable widget to be included\n        sortable: false,\n        //jquery ui sortable plugin option.\n        //To avoid any problems this option must be same for all panels which are direct children of their parent\n        connectWith: '.ui-sortable',\n        //This parameter accepts string ['both', 'vertical', 'horizontal', 'none']. none means disable resize\n        resize: 'both',\n        //Minimum width <b>unpin, resizable</b> panel can have.\n        minWidth: 200,\n        //Minimum height <b>unpin, resizable</b> panel can have.\n        minHeight: 100,\n        //Maximum width <b>unpin, resizable</b> panel can have.\n        maxWidth: 1200,\n        //Maximum height <b>unpin, resizable</b> panel can have.\n        maxHeight: 700,\n        //The url which will be used to load content. If not provided reload button will do nothing\n        loadUrl: \"\",\n        //If loadUrl is provided plugin will load content as soon as plugin is initialized\n        autoload: true,\n        bodyHeight: 'auto',\n        //This will enable tooltips on panel controls\n        tooltips: true,\n        forAngularJs: false,\n        toggleIcon: 'glyphicon glyphicon-cog',\n        expandAnimation: 100,\n        collapseAnimation: 100,\n        state: 'pinned', // Initial state of the panel. Available options: pinned, unpinned, collapsed, minimized, fullscreen\n        initialIndex: null, // Initial index of the panel among its siblings\n        stateful: false, // If you set this to true you must specify data-inner-id. Plugin will save (in localStorage) it's states such as\n                         // pinned, unpinned, collapsed, minimized, fullscreen, position among it's siblings\n                         // and apply them when you reload the browser\n        constrain: 'document', // 'parent', 'document', 'window'\n        unpin: {\n            icon: 'glyphicon glyphicon-move', //You can user glyphicons if you do not want to use font-awesome\n            tooltip: 'Unpin'               //tooltip text, If you want to disable tooltip, set it to false\n        },\n        reload: {\n            icon: 'glyphicon glyphicon-refresh', //You can user glyphicons if you do not want to use font-awesome\n            tooltip: 'Reload'           //tooltip text, If you want to disable tooltip, set it to false\n        },\n        minimize: {\n            icon: 'glyphicon glyphicon-minus', //icon is shown when panel is not minimized\n            icon2: 'glyphicon glyphicon-plus', //icon2 is shown when panel is minimized\n            tooltip: 'Minimize'         //tooltip text, If you want to disable tooltip, set it to false\n        },\n        expand: {\n            icon: 'glyphicon glyphicon-resize-full', //icon is shown when panel is not on full screen\n            icon2: 'glyphicon glyphicon-resize-small', //icon2 is shown when pane is on full screen state\n            tooltip: 'Fullscreen'       //tooltip text, If you want to disable tooltip, set it to false\n        },\n        changeStyle: {\n            icon: 'glyphicon glyphicon-th', //icon is shown when panel is not on full screen\n            tooltip: 'Style'       //tooltip text, If you want to disable tooltip, set it to false\n        },\n        close: {\n            icon: 'glyphicon glyphicon-remove', //You can user glyphicons if you do not want to use font-awesome\n            tooltip: 'Close'            //tooltip text, If you want to disable tooltip, set it to false\n        },\n        editTitle: {\n            icon: 'glyphicon glyphicon-pencil',\n            icon2: 'glyphicon glyphicon-floppy-disk',\n            tooltip: 'Edit title'\n        },\n        styles: [\n            {\n                bg: '#d9534f',\n                text: '#FFF'\n            },\n            {\n                bg: '#f0ad4e',\n                text: '#FFF'\n            },\n            {\n                bg: '#337ab7',\n                text: '#FFF'\n            },\n            {\n                bg: '#5bc0de',\n                text: '#FFF'\n            },\n            {\n                bg: '#4753e4',\n                text: '#FFF'\n            },\n            {\n                bg: '#9e4aea',\n                text: '#FFF'\n            }\n        ],\n        storageObject: null,\n\n        // Events\n        /**\n         * @event beforeTitleChange\n         * Fires before title change happens. Returning false will prevent title change from happening.\n         * @param {LobiPanel} The <code>LobiPanel</code> instance\n         */\n        beforeTitleChange: null\n    };\n\n    $('.lobipanel').lobiPanel();\n\n    var $parent = $('.lobipanel-parent-sortable');\n    $parent.lobiPanelParent();\n});\n\n"
  },
  {
    "path": "gulpfile.js",
    "content": "/**\n * Created by zura on 12/10/2017.\n */\n\n'use strict';\n\nvar pjson = require('./package.json');\n\nvar less = require('gulp-less');\nvar path = require('path');\nvar gulp = require('gulp');\nvar copy = require('gulp-copy');\nvar uglify = require('gulp-uglify');\nvar rename = require('gulp-rename');\nvar cleanCSS = require('gulp-clean-css');\n// var pump = require('pump');\n\n\ngulp.task('less', function () {\n  return gulp.src('./less/lobipanel.less')\n    .pipe(less({\n      paths: [path.join(__dirname, 'less', 'includes')]\n    }))\n    .pipe(gulp.dest('./css'));\n});\n\ngulp.task('copy', function () {\n  gulp.src('./js/**/*.js')\n    .pipe(gulp.dest('./dist/js'));\n  gulp.src('./css/**/*.css')\n    .pipe(gulp.dest('./dist/css'));\n\n});\n\ngulp.task('cssmin', function () {\n  return gulp.src('./css/lobipanel.css')\n    .pipe(cleanCSS({compatibility: 'ie8'}))\n    .pipe(rename({suffix: '.min'}))\n    .pipe(gulp.dest('./dist/css'));\n});\n\ngulp.task('scripts', function () {\n  gulp.src([\n    './js/lobipanel.js'\n  ])\n\n    .pipe(gulp.dest('./dist/js'))\n    .pipe(uglify())\n    .pipe(rename({suffix: '.min'}))\n    .pipe(gulp.dest('./dist/js'))\n});\n\ngulp.task('watch', function () {\n  gulp.watch('./less/**/*.less', ['less', 'cssmin', 'copy']);\n  gulp.watch('./js/**/*.js', ['scripts', 'copy']);\n});\n\ngulp.task('default', ['less', 'copy', 'cssmin', 'scripts'], function () {\n  gulp.start('watch');\n});"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <title>Lobipanel - jQuery plugin for bootstrap panels. It extends panels with several common and useful functions.</title>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!--Default installation-->\n    <link rel=\"stylesheet\" href=\"lib/jquery-ui.min.css\"/>\n    <link rel=\"stylesheet\" href=\"bootstrap/css/bootstrap.min.css\"/>\n    <link rel=\"stylesheet\" href=\"lib/font-awesome/css/font-awesome.min.css\"/>\n\n\n    <!--Installation using bower. Preferred!!! -->\n    <!--<link rel=\"stylesheet\" href=\"bower_components/bootstrap/dist/css/bootstrap.min.css\"/>-->\n    <!--<link rel=\"stylesheet\" href=\"bower_components/jquery-ui/themes/ui-lightness/jquery-ui.min.css\"/>-->\n    <!--Run `bower install font-awesome` and uncomment this line to see font awesome examples-->\n    <!--<link rel=\"stylesheet\" href=\"bower_components/font-awesome/css/font-awesome.min.css\"/>-->\n\n    <link rel=\"stylesheet\" href=\"css/lobipanel.css\"/>\n\n    <link rel=\"stylesheet\" href=\"lib/highlight/github.css\"/>\n    <link rel=\"stylesheet\" href=\"demo/documentation.css\"/>\n    <link rel=\"stylesheet\" href=\"demo/demo.css\"/>\n</head>\n<body>\n    <div id=\"lobipanel\">\n        <div class=\"container\">\n            <p></p>\n            <div class=\"alert alert-info\">\n                <p>For documentation visit <a href=\"http://lobianijs.com/site/lobipanel\">Lobipanel webpage</a></p>\n            </div>\n            <!--Examples-->\n            <div id=\"lobipanel-examples\">\n                <!--Basic example-->\n                <div>\n                    <h3>Basic example</h3>\n                    <div class=\"bs-example\">\n                        <div id=\"lobipanel-basic\" class=\"panel panel-default\">\n                            <div class=\"panel-heading\">\n                                <div class=\"panel-title\">\n                                    Panel title\n                                </div>\n                            </div>\n                            <div class=\"panel-body\">\n                                Lorem ipsum dolor sit amet concealed leaf shah proper council binary. Concealed assured affairs faces, finish easily glows shouted faint. Sentence islands spouting we unbeguiled, faces concealed. Diam rays countries, faces fames peeling bind wary catch solomon, painting, they beats evil. Failing newer landscapes steal retinues vidi rays echoes sheltered evil. Veins concealed spouting obtaining delight wild. Venenatis failing wreaths shouted countries wild, privilege climbing.\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"highlight\">\n                        <pre><code>$('selector').lobiPanel();\n</code></pre>\n                    </div>\n                </div>\n                <!--Custom controls-->\n                <div>\n                    <h3>Disable control buttons</h3>\n                    <div class=\"bs-example\">\n                        <div id=\"lobipanel-custom-control\" class=\"panel panel-default\">\n                            <div class=\"panel-heading\">\n                                <div class=\"panel-title\">\n                                    Panel title\n                                </div>\n                            </div>\n                            <div class=\"panel-body\">\n                                Lorem ipsum dolor sit amet concealed leaf shah proper council binary. Concealed assured affairs faces, finish easily glows shouted faint. Sentence islands spouting we unbeguiled, faces concealed. Diam rays countries, faces fames peeling bind wary catch solomon, painting, they beats evil. Failing newer landscapes steal retinues vidi rays echoes sheltered evil. Veins concealed spouting obtaining delight wild. Venenatis failing wreaths shouted countries wild, privilege climbing.\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"highlight\">\n                        <pre><code>$('selector').lobiPanel({\n    reload: false,\n    close: false,\n    editTitle: false\n});\n</code></pre>\n                    </div>\n                </div>\n                <!-- Stateful -->\n                <div>\n                    <h3>Stateful. <small>Saves its state in localStorage</small></h3>\n                    <div class=\"bs-example\">\n                        <div id=\"lobipanel-stateful\" class=\"panel panel-default\" data-inner-id=\"lobipanel-stateful\">\n                            <div class=\"panel-heading\">\n                                <div class=\"panel-title\">\n                                    Panel title\n                                </div>\n                            </div>\n                            <div class=\"panel-body\">\n                                Lorem ipsum dolor sit amet concealed leaf shah proper council binary. Concealed assured affairs faces, finish easily glows shouted faint. Sentence islands spouting we unbeguiled, faces concealed. Diam rays countries, faces fames peeling bind wary catch solomon, painting, they beats evil. Failing newer landscapes steal retinues vidi rays echoes sheltered evil. Veins concealed spouting obtaining delight wild. Venenatis failing wreaths shouted countries wild, privilege climbing.\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"highlight\">\n                        <pre><code>$('selector').lobiPanel({\n    stateful: true\n});\n</code></pre>\n                    </div>\n                </div>\n                <!--Font awesome controls-->\n                <div>\n                    <h3>Use font awesome icons</h3>\n                    <div class=\"bs-example\">\n                        <div id=\"lobipanel-font-awesome\" class=\"panel panel-info\">\n                            <div class=\"panel-heading\">\n                                <div class=\"panel-title\">\n                                    Panel title\n                                </div>\n                            </div>\n                            <div class=\"panel-body\">\n                                Lorem ipsum dolor sit amet concealed leaf shah proper council binary. Concealed assured affairs faces, finish easily glows shouted faint. Sentence islands spouting we unbeguiled, faces concealed. Diam rays countries, faces fames peeling bind wary catch solomon, painting, they beats evil. Failing newer landscapes steal retinues vidi rays echoes sheltered evil. Veins concealed spouting obtaining delight wild. Venenatis failing wreaths shouted countries wild, privilege climbing.\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"highlight\">\n                        <pre><code>$('selector').lobiPanel({\n    reload: {\n        icon: 'fa fa-refresh'\n    },\n    editTitle: {\n        icon: 'fa fa-edit',\n        icon2: 'fa fa-save'\n    },\n    unpin: {\n        icon: 'fa fa-arrows'\n    },\n    minimize: {\n        icon: 'fa fa-chevron-up',\n        icon2: 'fa fa-chevron-down'\n    },\n    close: {\n        icon: 'fa fa-times-circle'\n    },\n    expand: {\n        icon: 'fa fa-expand',\n        icon2: 'fa fa-compress'\n    }\n});\n</code></pre>\n                    </div>\n                </div>\n                <!--Constrain panel size-->\n                <div>\n                    <h3>Constrain panel size</h3>\n                    <p>Unpin the panel and try to resize it.</p>\n                    <div class=\"bs-example\">\n                        <div id=\"lobipanel-constrain-size\" class=\"panel panel-primary\">\n                            <div class=\"panel-heading\">\n                                <div class=\"panel-title\">\n                                    Panel title\n                                </div>\n                            </div>\n                            <div class=\"panel-body\">\n                                Lorem ipsum dolor sit amet concealed leaf shah proper council binary. Concealed assured affairs faces, finish easily glows shouted faint. Sentence islands spouting we unbeguiled, faces concealed. Diam rays countries, faces fames peeling bind wary catch solomon, painting, they beats evil. Failing newer landscapes steal retinues vidi rays echoes sheltered evil. Veins concealed spouting obtaining delight wild. Venenatis failing wreaths shouted countries wild, privilege climbing.\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"highlight\">\n                        <pre><code>$('selector').lobiPanel({\n    minWidth: 300,\n    minHeight: 300,\n    maxWidth: 600,\n    maxHeight: 480\n});\n</code></pre>\n                    </div>\n                </div>\n                <!--Load content from ajax-->\n                <div>\n                    <h3>Load content from url</h3>\n                    <p>Load content from specified url and apply highlight code</p>\n                    <div class=\"bs-example\">\n                        <div id=\"lobipanel-from-url\" class=\"panel panel-success\" data-autoload=\"false\">\n                            <div class=\"panel-heading\">\n                                <div class=\"panel-title\">\n                                    <h4>Content from url</h4>\n                                </div>\n                            </div>\n                            <div class=\"panel-body\" style=\"height: 400px; overflow: auto;\">\n\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"highlight\">\n                        <pre><code>$('selector').on('loaded.lobiPanel', function(ev, lobiPanel){\n    var $body = lobiPanel.$el.find('.panel-body');\n    $body.html('&lt;div class=\"highlight\">&ltpre>&lt;code>' + $body.html() + '&lt;/code>&lt;/pre>&lt;/div>');\n    hljs.highlightBlock($body.find('code')[0]);\n});\n$('selector').lobiPanel({\n    loadUrl: 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.css',\n    bodyHeight: 400\n});\n</code></pre>\n                    </div>\n                </div>\n                <!--Multiple lobiPanels-->\n                <div id=\"lobipanel-multiple\">\n                    <h3>Multiple panels with drag & drop</h3>\n                    <p>Drag panels by clicking on the headers</p>\n                    <div class=\"bs-example\">\n                        <div class=\"row\">\n                            <div id=\"lobipanel-parent\" class=\"col-md-6 lobipanel-parent\">\n                                <div class=\"panel panel-default\" data-stateful=\"true\" data-inner-id=\"lobipanel-parent-default\">\n                                    <div class=\"panel-heading\">\n                                        <div class=\"panel-title\">\n                                            <h4>Default title</h4>\n                                        </div>\n                                    </div>\n                                    <div class=\"panel-body\">\n                                        <div class=\"media\">\n                                            <div class=\"media-left\">\n                                                <a href=\"#\">\n                                                    <img class=\"media-object\" data-src=\"holder.js/64x64\" alt=\"64x64\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+PGRlZnMvPjxyZWN0IHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZmlsbD0iI0VFRUVFRSIvPjxnPjx0ZXh0IHg9IjE0LjUiIHk9IjMyIiBzdHlsZT0iZmlsbDojQUFBQUFBO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6QXJpYWwsIEhlbHZldGljYSwgT3BlbiBTYW5zLCBzYW5zLXNlcmlmLCBtb25vc3BhY2U7Zm9udC1zaXplOjEwcHQ7ZG9taW5hbnQtYmFzZWxpbmU6Y2VudHJhbCI+NjR4NjQ8L3RleHQ+PC9nPjwvc3ZnPg==\" data-holder-rendered=\"true\" style=\"width: 64px; height: 64px;\">\n                                                </a>\n                                            </div>\n                                            <div class=\"media-body\">\n                                                <h4 class=\"media-heading\">Media heading</h4>\n                                                Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus.\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"panel panel-primary\" data-stateful=\"true\"  data-inner-id=\"lobipanel-parent-primary\">\n                                    <div class=\"panel-heading\">\n                                        <div class=\"panel-title\">\n                                            <h4>primary title</h4>\n                                        </div>\n                                    </div>\n                                    <div class=\"panel-body\">\n                                        <div class=\"media\">\n                                            <div class=\"media-left\">\n                                                <a href=\"#\">\n                                                    <img class=\"media-object\" data-src=\"holder.js/64x64\" alt=\"64x64\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+PGRlZnMvPjxyZWN0IHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZmlsbD0iI0VFRUVFRSIvPjxnPjx0ZXh0IHg9IjE0LjUiIHk9IjMyIiBzdHlsZT0iZmlsbDojQUFBQUFBO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6QXJpYWwsIEhlbHZldGljYSwgT3BlbiBTYW5zLCBzYW5zLXNlcmlmLCBtb25vc3BhY2U7Zm9udC1zaXplOjEwcHQ7ZG9taW5hbnQtYmFzZWxpbmU6Y2VudHJhbCI+NjR4NjQ8L3RleHQ+PC9nPjwvc3ZnPg==\" data-holder-rendered=\"true\" style=\"width: 64px; height: 64px;\">\n                                                </a>\n                                            </div>\n                                            <div class=\"media-body\">\n                                                <h4 class=\"media-heading\">Media heading</h4>\n                                                Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus.\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"panel panel-info\" data-stateful=\"true\"  data-inner-id=\"lobipanel-parent-info\">\n                                    <div class=\"panel-heading\">\n                                        <div class=\"panel-title\">\n                                            <h4>Info title</h4>\n                                        </div>\n                                    </div>\n                                    <div class=\"panel-body\">\n                                        <div class=\"media\">\n                                            <div class=\"media-left\">\n                                                <a href=\"#\">\n                                                    <img class=\"media-object\" data-src=\"holder.js/64x64\" alt=\"64x64\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+PGRlZnMvPjxyZWN0IHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZmlsbD0iI0VFRUVFRSIvPjxnPjx0ZXh0IHg9IjE0LjUiIHk9IjMyIiBzdHlsZT0iZmlsbDojQUFBQUFBO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6QXJpYWwsIEhlbHZldGljYSwgT3BlbiBTYW5zLCBzYW5zLXNlcmlmLCBtb25vc3BhY2U7Zm9udC1zaXplOjEwcHQ7ZG9taW5hbnQtYmFzZWxpbmU6Y2VudHJhbCI+NjR4NjQ8L3RleHQ+PC9nPjwvc3ZnPg==\" data-holder-rendered=\"true\" style=\"width: 64px; height: 64px;\">\n                                                </a>\n                                            </div>\n                                            <div class=\"media-body\">\n                                                <h4 class=\"media-heading\">Media heading</h4>\n                                                Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus.\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"panel panel-success\" data-stateful=\"true\" data-inner-id=\"lobipanel-parent-success\">\n                                    <div class=\"panel-heading\">\n                                        <div class=\"panel-title\">\n                                            <h4>Success title</h4>\n                                        </div>\n                                    </div>\n                                    <div class=\"panel-body\">\n                                        <div class=\"media\">\n                                            <div class=\"media-left\">\n                                                <a href=\"#\">\n                                                    <img class=\"media-object\" data-src=\"holder.js/64x64\" alt=\"64x64\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+PGRlZnMvPjxyZWN0IHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZmlsbD0iI0VFRUVFRSIvPjxnPjx0ZXh0IHg9IjE0LjUiIHk9IjMyIiBzdHlsZT0iZmlsbDojQUFBQUFBO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6QXJpYWwsIEhlbHZldGljYSwgT3BlbiBTYW5zLCBzYW5zLXNlcmlmLCBtb25vc3BhY2U7Zm9udC1zaXplOjEwcHQ7ZG9taW5hbnQtYmFzZWxpbmU6Y2VudHJhbCI+NjR4NjQ8L3RleHQ+PC9nPjwvc3ZnPg==\" data-holder-rendered=\"true\" style=\"width: 64px; height: 64px;\">\n                                                </a>\n                                            </div>\n                                            <div class=\"media-body\">\n                                                <h4 class=\"media-heading\">Media heading</h4>\n                                                Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus.\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"panel panel-warning\" data-stateful=\"true\" data-inner-id=\"lobipanel-parent-warning\">\n                                    <div class=\"panel-heading\">\n                                        <div class=\"panel-title\">\n                                            <h4>Warning title</h4>\n                                        </div>\n                                    </div>\n                                    <div class=\"panel-body\">\n                                        <div class=\"media\">\n                                            <div class=\"media-left\">\n                                                <a href=\"#\">\n                                                    <img class=\"media-object\" data-src=\"holder.js/64x64\" alt=\"64x64\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+PGRlZnMvPjxyZWN0IHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZmlsbD0iI0VFRUVFRSIvPjxnPjx0ZXh0IHg9IjE0LjUiIHk9IjMyIiBzdHlsZT0iZmlsbDojQUFBQUFBO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6QXJpYWwsIEhlbHZldGljYSwgT3BlbiBTYW5zLCBzYW5zLXNlcmlmLCBtb25vc3BhY2U7Zm9udC1zaXplOjEwcHQ7ZG9taW5hbnQtYmFzZWxpbmU6Y2VudHJhbCI+NjR4NjQ8L3RleHQ+PC9nPjwvc3ZnPg==\" data-holder-rendered=\"true\" style=\"width: 64px; height: 64px;\">\n                                                </a>\n                                            </div>\n                                            <div class=\"media-body\">\n                                                <h4 class=\"media-heading\">Media heading</h4>\n                                                Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus.\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"panel panel-danger\" data-stateful=\"true\" data-inner-id=\"lobipanel-parent-danger\">\n                                    <div class=\"panel-heading\">\n                                        <div class=\"panel-title\">\n                                            <h4>Danger title</h4>\n                                        </div>\n                                    </div>\n                                    <div class=\"panel-body\">\n                                        <div class=\"media\">\n                                            <div class=\"media-left\">\n                                                <a href=\"#\">\n                                                    <img class=\"media-object\" data-src=\"holder.js/64x64\" alt=\"64x64\" src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZpZXdCb3g9IjAgMCA2NCA2NCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+PGRlZnMvPjxyZWN0IHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgZmlsbD0iI0VFRUVFRSIvPjxnPjx0ZXh0IHg9IjE0LjUiIHk9IjMyIiBzdHlsZT0iZmlsbDojQUFBQUFBO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6QXJpYWwsIEhlbHZldGljYSwgT3BlbiBTYW5zLCBzYW5zLXNlcmlmLCBtb25vc3BhY2U7Zm9udC1zaXplOjEwcHQ7ZG9taW5hbnQtYmFzZWxpbmU6Y2VudHJhbCI+NjR4NjQ8L3RleHQ+PC9nPjwvc3ZnPg==\" data-holder-rendered=\"true\" style=\"width: 64px; height: 64px;\">\n                                                </a>\n                                            </div>\n                                            <div class=\"media-body\">\n                                                <h4 class=\"media-heading\">Media heading</h4>\n                                                Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus.\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"col-md-6\">\n                                <div class=\"panel panel-success\">\n                                    <div class=\"panel-heading\">\n                                        <div class=\"panel-title\">\n                                            <h4>Panel title</h4>\n                                        </div>\n                                    </div>\n                                    <div class=\"panel-body\">\n                                        <table class=\"table table-striped\">\n                                            <thead>\n                                                <tr>\n                                                    <th>#</th>\n                                                    <th>First Name</th>\n                                                    <th>Last Name</th>\n                                                    <th>Username</th>\n                                                </tr>\n                                            </thead>\n                                            <tbody>\n                                                <tr>\n                                                    <th scope=\"row\">1</th>\n                                                    <td>Mark</td>\n                                                    <td>Otto</td>\n                                                    <td>@mdo</td>\n                                                </tr>\n                                                <tr>\n                                                    <th scope=\"row\">2</th>\n                                                    <td>Jacob</td>\n                                                    <td>Thornton</td>\n                                                    <td>@fat</td>\n                                                </tr>\n                                                <tr>\n                                                    <th scope=\"row\">3</th>\n                                                    <td>Larry</td>\n                                                    <td>the Bird</td>\n                                                    <td>@twitter</td>\n                                                </tr>\n                                            </tbody>\n                                        </table>\n                                    </div>\n                                </div>\n                                <div class=\"panel panel-info\">\n                                    <div class=\"panel-heading\">\n                                        <div class=\"panel-title\">\n                                            <h4>Panel title</h4>\n                                        </div>\n                                    </div>\n                                    <div class=\"panel-body\">\n                                        <table class=\"table table-striped\">\n                                            <thead>\n                                                <tr>\n                                                    <th>#</th>\n                                                    <th>First Name</th>\n                                                    <th>Last Name</th>\n                                                    <th>Username</th>\n                                                </tr>\n                                            </thead>\n                                            <tbody>\n                                                <tr>\n                                                    <th scope=\"row\">1</th>\n                                                    <td>Mark</td>\n                                                    <td>Otto</td>\n                                                    <td>@mdo</td>\n                                                </tr>\n                                                <tr>\n                                                    <th scope=\"row\">2</th>\n                                                    <td>Jacob</td>\n                                                    <td>Thornton</td>\n                                                    <td>@fat</td>\n                                                </tr>\n                                                <tr>\n                                                    <th scope=\"row\">3</th>\n                                                    <td>Larry</td>\n                                                    <td>the Bird</td>\n                                                    <td>@twitter</td>\n                                                </tr>\n                                            </tbody>\n                                        </table>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"highlight\">\n                        <pre><code>$('.panel').lobiPanel({\n    sortable: true\n});\n</code></pre>\n                    </div>\n                </div>\n                <!--Initialize with data attributes-->\n                <div>\n                    <h3>Initialize with <code>data-*</code> attributes</h3>\n                    <div class=\"bs-example\">\n                        <div class=\"panel panel-default lobipanel\" data-stateful=\"true\" data-inner-id=\"lobipanel-data-attributes\" data-body-height=\"300\" data-tooltips=\"false\"\n                             data-min-width=\"400\" data-resize=\"horizontal\" data-close=\"{tooltip: 'custom'}\">\n                            <div class=\"panel-heading\">\n                                <div class=\"panel-title\">\n                                    This is panel title\n                                </div>\n                            </div>\n                            <div class=\"panel-body\">\n                                <table class=\"table table-striped\">\n                                    <thead>\n                                        <tr>\n                                            <th>#</th>\n                                            <th>First Name</th>\n                                            <th>Last Name</th>\n                                            <th>Username</th>\n                                        </tr>\n                                    </thead>\n                                    <tbody>\n                                        <tr>\n                                            <th scope=\"row\">1</th>\n                                            <td>Mark</td>\n                                            <td>Otto</td>\n                                            <td>@mdo</td>\n                                        </tr>\n                                        <tr>\n                                            <th scope=\"row\">2</th>\n                                            <td>Jacob</td>\n                                            <td>Thornton</td>\n                                            <td>@fat</td>\n                                        </tr>\n                                        <tr>\n                                            <th scope=\"row\">3</th>\n                                            <td>Larry</td>\n                                            <td>the Bird</td>\n                                            <td>@twitter</td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"highlight\">\n                        <pre><code>&lt;div class=&quot;panel panel-default lobipanel&quot; data-inner-id=&quot;lobipanel-data-attributes&quot; data-body-height=&quot;300&quot; data-tooltips=&quot;false&quot; data-min-width=&quot;400&quot; data-resize=&quot;horizontal&quot; data-close=&quot;{tooltip: &apos;custom&apos;}&quot;&gt;\n    &lt;div class=&quot;panel-heading&quot;&gt;\n       &lt;div class=&quot;panel-title&quot;&gt;\n           This is panel title\n       &lt;/div&gt;\n    &lt;/div&gt;\n    &lt;div class=&quot;panel-body&quot;&gt;\n        content\n    &lt;/div&gt;\n&lt;/div&gt;\n</code></pre>\n                    </div>\n                </div>\n                <!--Nested LobiPanel-->\n                <div id=\"lobipanel-nested-example\">\n                    <h4>Nested LobiPanel example</h4>\n                    <div class=\"bs-example\">\n                        <div class=\"panel panel-info lobipanel\">\n                            <div class=\"panel-heading\">\n                                <div class=\"panel-title\">\n                                    <h4>LobiPanel title</h4>\n                                </div>\n                            </div>\n                            <div class=\"panel-body\">\n                                <div class=\"panel panel-warning lobipanel\">\n                                    <div class=\"panel-heading\">\n                                        <div class=\"panel-title\">\n                                            <h4>Nested LobiPanel title</h4>\n                                        </div>\n                                    </div>\n                                    <div class=\"panel-body\">\n                                        Panel 1\n                                    </div>\n                                </div>\n                                <div class=\"row\">\n                                    <div class=\"col-lg-6\">\n                                        <div class=\"panel panel-default lobipanel\" data-sortable=\"true\">\n                                            <div class=\"panel-heading\">\n                                                <div class=\"panel-title\">\n                                                    <h4>Panel title</h4>\n                                                </div>\n                                            </div>\n                                            <div class=\"panel-body\">\n                                                Panel 2\n                                            </div>\n                                        </div>\n                                        <div class=\"panel panel-default lobipanel\" data-sortable=\"true\">\n                                            <div class=\"panel-heading\">\n                                                <div class=\"panel-title\">\n                                                    <h4>Panel title</h4>\n                                                </div>\n                                            </div>\n                                            <div class=\"panel-body\">\n                                                Panel 3\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div class=\"col-lg-6\">\n                                        <div class=\"panel panel-default lobipanel\" data-sortable=\"true\">\n                                            <div class=\"panel-heading\">\n                                                <div class=\"panel-title\">\n                                                    <h4>Panel title</h4>\n                                                </div>\n                                            </div>\n                                            <div class=\"panel-body\">\n                                                Panel 4\n                                            </div>\n                                        </div>\n                                        <div class=\"panel panel-default lobipanel\" data-sortable=\"true\">\n                                            <div class=\"panel-heading\">\n                                                <div class=\"panel-title\">\n                                                    <h4>Panel title</h4>\n                                                </div>\n                                            </div>\n                                            <div class=\"panel-body\">\n                                                Panel 5\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"highlight\">\n                        <pre><code>&lt;div class=&quot;panel panel-info lobipanel&quot;&gt;\n    &lt;div class=&quot;panel-heading&quot;&gt;\n        &lt;div class=&quot;panel-title&quot;&gt;\n            &lt;h4&gt;LobiPanel title&lt;/h4&gt;\n        &lt;/div&gt;\n    &lt;/div&gt;\n    &lt;div class=&quot;panel-body&quot;&gt;\n        &lt;div class=&quot;panel panel-warning lobipanel&quot;&gt;\n            &lt;div class=&quot;panel-heading&quot;&gt;\n                &lt;div class=&quot;panel-title&quot;&gt;\n                    &lt;h4&gt;Nested LobiPanel title&lt;/h4&gt;\n                &lt;/div&gt;\n            &lt;/div&gt;\n            &lt;div class=&quot;panel-body&quot;&gt;\n                Panel 1\n            &lt;/div&gt;\n        &lt;/div&gt;\n        &lt;div class=&quot;row&quot;&gt;\n            &lt;div class=&quot;col-lg-6&quot;&gt;\n                &lt;div class=&quot;panel panel-default lobipanel&quot; data-sortable=&quot;true&quot;&gt;\n                    &lt;div class=&quot;panel-heading&quot;&gt;\n                        &lt;div class=&quot;panel-title&quot;&gt;\n                            &lt;h4&gt;Panel title&lt;/h4&gt;\n                        &lt;/div&gt;\n                    &lt;/div&gt;\n                    &lt;div class=&quot;panel-body&quot;&gt;\n                        Panel 2\n                    &lt;/div&gt;\n                &lt;/div&gt;\n                &lt;div class=&quot;panel panel-default lobipanel&quot; data-sortable=&quot;true&quot;&gt;\n                    &lt;div class=&quot;panel-heading&quot;&gt;\n                        &lt;div class=&quot;panel-title&quot;&gt;\n                            &lt;h4&gt;Panel title&lt;/h4&gt;\n                        &lt;/div&gt;\n                    &lt;/div&gt;\n                    &lt;div class=&quot;panel-body&quot;&gt;\n                        Panel 3\n                    &lt;/div&gt;\n                &lt;/div&gt;\n            &lt;/div&gt;\n            &lt;div class=&quot;col-lg-6&quot;&gt;\n                &lt;div class=&quot;panel panel-default lobipanel&quot; data-sortable=&quot;true&quot;&gt;\n                    &lt;div class=&quot;panel-heading&quot;&gt;\n                        &lt;div class=&quot;panel-title&quot;&gt;\n                            &lt;h4&gt;Panel title&lt;/h4&gt;\n                        &lt;/div&gt;\n                    &lt;/div&gt;\n                    &lt;div class=&quot;panel-body&quot;&gt;\n                        Panel 4\n                    &lt;/div&gt;\n                &lt;/div&gt;\n                &lt;div class=&quot;panel panel-default lobipanel&quot; data-sortable=&quot;true&quot;&gt;\n                    &lt;div class=&quot;panel-heading&quot;&gt;\n                        &lt;div class=&quot;panel-title&quot;&gt;\n                            &lt;h4&gt;Panel title&lt;/h4&gt;\n                        &lt;/div&gt;\n                    &lt;/div&gt;\n                    &lt;div class=&quot;panel-body&quot;&gt;\n                        Panel 5\n                    &lt;/div&gt;\n                &lt;/div&gt;\n            &lt;/div&gt;\n        &lt;/div&gt;\n    &lt;/div&gt;\n&lt;/div&gt;\n</code></pre>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n\n\n    <!--Default installation-->\n    <script src=\"lib/jquery.1.11.min.js\"></script>\n    <script src=\"lib/jquery-ui.min.js\"></script>\n    <script src=\"lib/jquery.ui.touch-punch.min.js\"></script>\n    <script src=\"bootstrap/js/bootstrap.min.js\"></script>\n\n    <!--Installation using bower. Preferred!!! -->\n    <!--<script src=\"bower_components/jquery/dist/jquery.min.js\"></script>-->\n    <!--<script src=\"bower_components/jquery-ui/jquery-ui.min.js\"></script>-->\n    <!--<script src=\"bower_components/jquery-ui-touch-punch-improved/jquery.ui.touch-punch-improved.js\"></script>-->\n    <!--<script src=\"bower_components/bootstrap/dist/js/bootstrap.min.js\"></script>-->\n\n    <script src=\"dist/js/lobipanel.js\"></script>\n\n    <script src=\"lib/highlight/highlight.pack.js\"></script>\n    <script>\n        $(function(){\n            var codes = $('.highlight code');\n            codes.each(function (ind, el) {\n                hljs.highlightBlock(el);\n            });\n\n            $('.lobipanel').lobiPanel();\n            $('#demoPanel11').lobiPanel();\n            $('#lobipanel-basic')\n                    .on('beforeUnpin.lobiPanel', function () {\n                        console.log(\"beforeClose\");\n                    })\n                    .on('onClose.lobiPanel', function () {\n                        console.log(\"onClose\");\n                    })\n                    .on('onTitleChange.lobiPanel', function () {\n                        console.log(this, arguments);\n\n                    })\n                    .lobiPanel();\n            $('#lobipanel-custom-control').lobiPanel({\n                reload: false,\n                close: false,\n                editTitle: false\n            });\n            $('#lobipanel-stateful').lobiPanel({\n                stateful: true\n            });\n            $('#lobipanel-font-awesome').lobiPanel({\n                reload: {\n                    icon: 'fa fa-refresh'\n                },\n                editTitle: {\n                    icon: 'fa fa-edit',\n                    icon2: 'fa fa-save'\n                },\n                unpin: {\n                    icon: 'fa fa-arrows'\n                },\n                minimize: {\n                    icon: 'fa fa-chevron-up',\n                    icon2: 'fa fa-chevron-down'\n                },\n                close: {\n                    icon: 'fa fa-times-circle'\n                },\n                expand: {\n                    icon: 'fa fa-expand',\n                    icon2: 'fa fa-compress'\n                }\n            });\n            $('#lobipanel-constrain-size').lobiPanel({\n                minWidth: 300,\n                minHeight: 300,\n                maxWidth: 600,\n                maxHeight: 480\n            });\n            $('#lobipanel-from-url').on('loaded.lobiPanel', function (ev, lobiPanel) {\n                var $body = lobiPanel.$el.find('.panel-body');\n                $body.html('<div class=\"highlight\"><pre><code>' + $body.html() + '</code></pre></div>');\n                hljs.highlightBlock($body.find('code')[0]);\n            }).lobiPanel({\n                loadUrl: 'bootstrap/dist/css/bootstrap.min.css',\n                bodyHeight: 400\n            });\n            $('#lobipanel-multiple').find('.panel').lobiPanel({\n                sortable: true,\n                beforeTitleChange: function(lobiPanel, title){\n                    console.log(\"beforeTitleChange\", arguments);\n                    if (!title) {\n                        return false;\n                    }\n                }\n            });\n        });\n    </script>\n</body>\n</html>"
  },
  {
    "path": "js/lobipanel.js",
    "content": "//Author      : @arboshiki\n/**\n * Generates random string of n length.\n * String contains only letters and numbers\n *\n * @param {int} n\n * @returns {String}\n */\nMath.randomString = function (n) {\n    var text = \"\";\n    var possible = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n    for (var i = 0; i < n; i++)\n        text += possible.charAt(Math.floor(Math.random() * possible.length));\n\n    return text;\n};\n\n/**\n * This function is for HTML element style attribute.\n * It converts the style attribute to css object\n *\n * @returns {object}\n */\nString.prototype.getCss = function () {\n    var css = {};\n    var style = this.valueOf().split(';');\n    for (var i = 0; i < style.length; i++) {\n        style[i] = $.trim(style[i]);\n        if (style[i]) {\n            var s = style[i].split(':');\n            css[$.trim(s[0])] = $.trim(s[1]);\n        }\n    }\n    return css;\n};\nString.prototype.trim = function () {\n    return this.replace(/^\\s+|\\s+$/g, \"\");\n};\n\nString.prototype.toCamel = function () {\n    return this.replace(/(\\-[a-z])/g, function ($1) {\n        return $1.toUpperCase().replace('-', '');\n    });\n};\n\nString.prototype.toDash = function () {\n    return this.replace(/([A-Z])/g, function ($1) {\n        return \"-\" + $1.toLowerCase();\n    });\n};\nString.prototype.toUnderscore = function () {\n    return this.replace(/([A-Z])/g, function ($1) {\n        return \"_\" + $1.toLowerCase();\n    });\n};\n\n/**\n * Checks if number is between two numbers\n *\n * @param {number} num1\n * @param {number} num2\n * @param {boolean} including \"include these numbers in comparison or not\" default false\n * @returns boolean\n */\nNumber.prototype.isBetween = function (num1, num2, including) {\n    if (!including) {\n        if (this.valueOf() < num2 && this.valueOf() > num1) {\n            return true;\n        }\n    } else {\n        if (this.valueOf() <= num2 && this.valueOf() >= num1) {\n            return true;\n        }\n    }\n    return false;\n};\n\n/**\n * Inserts element at specific index in given elements children\n *\n * @param {number} i\n * @param {string} selector\n * @returns {undefined}\n */\n$.fn.insertAt = function (i, selector) {\n    var $object = selector;\n    if (typeof selector === 'string') {\n        $object = $(selector);\n    }\n\n    i = Math.min($object.children().length, i);\n    if (i == 0) {\n        $object.prepend(this);\n        return this;\n    }\n    var oldIndex = this.data('index');\n\n    if (!i || isNaN(i)) {\n        i = $object.children().length - 1;\n    }\n    this.attr('data-index', i);\n\n    var $el = $object.children().eq(i - 1);\n    if ($el.length) {\n        $el.after(this);\n    } else {\n        $object.append(this);\n    }\n    $object.children().each(function (index, el) {\n        var $el = $(el);\n        if (oldIndex < i && index > oldIndex && index <= i) {\n            $el.attr('data-index', parseInt($el.data('data-index'), 10) - 1);\n        } else if (oldIndex >= i && index > i && index <= oldIndex) {\n            $el.attr('data-index', parseInt($el.attr('data-index'), 10) + 1);\n        }\n    });\n    return this;\n};\n\n$.fn.disableSelection = function () {\n    return this\n        .attr('unselectable', 'on')\n        .css('user-select', 'none')\n        .on('selectstart', false);\n};\n\n$.fn.enableSelection = function () {\n    return this\n        .removeAttr('unselectable')\n        .css('user-select', 'initial')\n        .off('selectstart');\n};\n\n$(function () {\n    var STORAGE_PREFIX = 'lobipanel_';\n\n    var StorageLocal = function () {\n        this.saveChildPositions = function (parentInnerId, positions) {\n            if (positions !== undefined) {\n                localStorage.setItem(STORAGE_PREFIX + 'parent_' + parentInnerId, JSON.stringify(positions));\n            }\n        };\n\n        this.savePanelParams = function (innerId, storage) {\n            localStorage.setItem(STORAGE_PREFIX + innerId, JSON.stringify(storage));\n        };\n\n        this.getAllPanelPositions = function () {\n            var parents = [];\n            for (var i in localStorage) {\n                if (i.indexOf(STORAGE_PREFIX + 'parent_') === 0) {\n                    var innerParentId = i.replace(STORAGE_PREFIX + 'parent_', '');\n                    var $parent = $('.lobipanel-parent-sortable[data-inner-id=' + innerParentId + ']');\n                    if ($parent.length) {\n                        parents[innerParentId] = JSON.parse(localStorage[i]);\n                    }\n                }\n            }\n            return parents;\n        };\n\n        this.getPanelStorage = function (innerId) {\n            var item = localStorage.getItem(STORAGE_PREFIX + innerId);\n            return JSON.parse(item || null) || {};\n        };\n\n    };\n\n    var LobiPanel = function ($el, options) {\n        var me = this;\n\n        this.hasRandomId = false;\n        this.storage = {};\n\n\n        this.$el = $el;\n        if (!me.$el.data('inner-id')) {\n            me.hasRandomId = true;\n            me.$el.attr('data-inner-id', Math.randomString(10));\n        }\n\n        this.innerId = me.$el.data('inner-id');\n\n        this.$options = me._processInput(options);\n        me.$heading = this.$el.find('>.panel-heading');\n        me.$body = this.$el.find('>.panel-body');\n        me._init();\n        me.$el.css('display', 'none');\n        me._applyState(me.$options.state, me.$options.stateParams);\n        me.$el.css('display', 'block');\n        // me._applyIndex(me.$options.initialIndex);\n        me._triggerEvent(\"init\");\n    };\n\n    LobiPanel.prototype = {\n        _processInput: function (options) {\n            var me = this;\n            if (!options) {\n                options = {};\n            }\n\n\n            this.storageObject = options.storageObject || new StorageLocal();\n            if (!me.hasRandomId) {\n                me.storage = this.storageObject.getPanelStorage(me.innerId);\n            }\n            var opts = me._getOptionsFromAttributes();\n//            window.console.log(opts);\n            options = $.extend({}, $.fn.lobiPanel.DEFAULTS, me.storage, options, opts);\n            var objects = ['unpin', 'reload', 'expand', 'minimize', 'close', 'editTitle'];\n            for (var i = 0; i < objects.length; i++) {\n                var prop = objects[i];\n                if (typeof options[prop] === 'object') {\n                    options[prop] = $.extend({}, $.fn.lobiPanel.DEFAULTS[prop], options[prop], opts[prop]);\n                }\n            }\n            return options;\n        },\n        _init: function () {\n            var me = this;\n            me.$el.addClass('lobipanel');\n\n            me.$heading.append(me._generateControls());\n//------------------------------------------------------------------------------\n            var parent = me.$el.parent();\n            me._appendInnerIdToParent(parent, me.innerId);\n            me._enableSorting();\n            me._onToggleIconsBtnClick();\n            me._enableResponsiveness();\n            me._setBodyHeight();\n            if (me.$options.autoload) {\n                me.load();\n            }\n            var maxWidth = 'calc(100% - ' + me.$heading.find('.dropdown-menu').children().length * me.$heading.find('.dropdown-menu li').first().outerWidth() + \"px)\";\n            me.$heading.find('.panel-title').css('max-width', maxWidth);\n\n            if (me.getParam('panelTitle')) {\n                me.$heading.find('.panel-title').html(me.getParam('panelTitle'));\n            }\n\n            var style = me.getParam('panelStyle');\n            if (style) {\n                me.applyStyle(style.bg, style.text);\n            }\n\n            // me.savepanelPositions();\n            // me._triggerEvent(\"init\");\n        },\n        /**\n         * Checks if panel is initialized. Panel is initialized if it has\n         * lobipanel class and data-inner-id=\"\" attribute\n         *\n         * @returns {boolean}\n         */\n        isPanelInit: function () {\n            var me = this;\n            return me.$el.hasClass('lobipanel') && me.$el.data('inner-id');\n        },\n\n        /**\n         * Checks if panel is pinned or unpinned\n         *\n         * @returns {Boolean}\n         */\n        isPinned: function () {\n            var me = this;\n            return !me.$el.hasClass('panel-unpin');\n        },\n\n        /**\n         * Pin the panel\n         *\n         * @returns {LobiPanel}\n         */\n        pin: function () {\n            var me = this;\n\n            //disable resize functionality\n            me.disableResize();\n            me.disableDrag();\n\n            //remove on panel click event (which brings the panel into front)\n            me._offPanelClick();\n            //remove panel-unpin class\n            me.$el.removeClass('panel-unpin')\n            //save current position, z-index and size to use it for later unpin\n                .attr('old-style', me.$el.attr('style'))\n                // .removeAttr('style')\n                .css('position', 'relative');\n\n            var toRemoveProperties = [\n                'position',\n                'z-index',\n                'left',\n                'top',\n                'width',\n                'height'\n            ];\n\n            for (var i in toRemoveProperties) {\n                me.$el.css(toRemoveProperties[i], '');\n            }\n\n            me.$body.css({\n                width: '',\n                height: ''\n            });\n            me._setBodyHeight();\n            me._insertInParent();\n            me._enableSorting();\n            return me;\n        },\n\n        /**\n         * Unpin the panel\n         *\n         * @returns {LobiPanel}\n         */\n        unpin: function () {\n            var me = this;\n            if (me.$el.hasClass(\"panel-collapsed\")) {\n                return me;\n            }\n            me._disableSorting();\n            if (me.$el.attr('old-style')) {\n                me.$el.attr('style', me.$el.attr('old-style'));\n            } else {\n                var width = me.$el.width();\n                var height = me.$el.height();\n                var left = Math.max(0, (($(window).width() - me.$el.outerWidth()) / 2));\n                var top = Math.max(0, ($(document).scrollTop() + ($(window).height() - me.$el.outerHeight()) / 2));\n                me.$el.css({\n                    left: left,\n                    top: top,\n                    width: width,\n                    height: height\n                });\n            }\n            var res = me._getMaxZIndex();\n            me.$el.css('z-index', res['z-index'] + 1);\n            me._onPanelClick();\n\n            me.$el.addClass('panel-unpin');\n            $('body').append(me.$el);\n\n            var panelWidth = me._getAvailableWidth(me.$el.width());\n            var panelHeight = me._getAvailableHeight(me.$el.height());\n            me.$el.css({\n                position: 'absolute',\n                width: panelWidth,\n                height: panelHeight\n            });\n            //we give .panel-body to width and height in order .panel-body to start scroling\n            var bHeight = me._calculateBodyHeight(panelHeight);\n            var bWidth = me._calculateBodyWidth(panelWidth);\n            me.$body.css({\n                width: bWidth,\n                height: bHeight\n            });\n\n            if (me.$options.draggable) {\n                me.enableDrag();\n            }\n            if (me.$options.resize !== 'none') {\n                me.enableResize();\n            }\n            return me;\n        },\n\n        /**\n         * Toggles (pin or unpin) the panel\n         *\n         * @returns {LobiPanel}\n         */\n        togglePin: function () {\n            var me = this;\n            if (this.isPinned()) {\n                this.unpin();\n            } else {\n                this.pin();\n            }\n            return me;\n        },\n\n        /**\n         * Checks if panel is minimized or not. It does not matter if panel is pinned or not\n         *\n         * @returns {Boolean}\n         */\n        isMinimized: function () {\n            var me = this;\n            return me.$el.hasClass('panel-minimized') || me.$el.hasClass('panel-collapsed');\n        },\n\n        /**\n         * Minimize the panel. If panel is pinned it is minimized on its place\n         * if panel is unpinned it is minimized at the bottom of the page\n         *\n         * @returns {LobiPanel}\n         */\n        minimize: function () {\n            var me = this;\n            me._triggerEvent(\"beforeMinimize\");\n            if (me.isMinimized()) {\n                return me;\n            }\n            if (me.isPinned()) {\n                me.$body.slideUp();\n                me.$el.find('.panel-footer').slideUp();\n                me.$el.addClass('panel-collapsed');\n                me._saveState('collapsed');\n                me._changeClassOfControl(me.$heading.find('[data-func=\"minimize\"]'));\n            } else {\n                me.disableTooltips();\n                //get footer where we need to put panel\n                var footer = me._getFooterForMinimizedPanels();\n                //find other panels which are already inside footer\n                var children = footer.find('>*');\n                var left, top;\n                //get top coordinate of footer\n                top = footer.offset().top;\n                //if there are no other panels inside footer, this panel will be first\n                //and its left coordinate will be footer's left coordinate\n                if (children.length === 0) {\n                    left = footer.offset().left;\n                } else {\n                    //if there exist panels inside footer, then this panel's left\n                    //coordinate will be last panel's (in footer) right coordinate\n                    var ch = $(children[children.length - 1]);\n                    left = ch.offset().left + ch.width();\n                }\n                //if panel was not expanded and it was jus unpin we need to save\n                //panel's style\n                if (!me.$el.hasClass('panel-expanded')) {\n                    me.$el.attr('old-style', me.$el.attr('style'));\n                }\n                me.$el.animate({\n                    left: left,\n                    top: top,\n                    width: 200,\n                    height: footer.height()\n                }, 100, function () {\n                    //if panel was expanded on full screen before we minimize it\n                    //after minimization we remove 'panel-expanded' class and we change icon\n                    if (me.$el.hasClass('panel-expanded')) {\n                        me.$el.removeClass('panel-expanded');\n                        me.$el.find('.panel-heading [data-func=expand] .' + LobiPanel.PRIVATE_OPTIONS.iconClass)\n                            .removeClass(me.$options.expand.icon2)\n                            .addClass(me.$options.expand.icon)\n                        ;\n                    }\n                    //we add 'panel-minimized' class\n                    me.$el.addClass('panel-minimized');\n                    me.$el.removeAttr('style');\n                    me.disableDrag();\n                    me.disableResize();\n                    me._expandOnHeaderClick();\n                    //animation was made and panel is positioned in place we it must be\n                    //so we append panel into footer\n                    footer.append(me.$el);\n                    $('body').addClass('lobipanel-minimized');\n                    var maxWidth = 'calc(100% - ' + me.$heading.find('.dropdown-menu li>a:visible').length * me.$heading.find('.dropdown-menu li>a:visible').first().outerWidth() + \"px)\";\n                    me.$heading.find('.panel-title').css('max-width', maxWidth);\n                    me._saveState('minimized');\n                    me._triggerEvent(\"onMinimize\");\n                });\n            }\n            return me;\n        },\n\n        /**\n         * Maximize the panel. This method works for minimized panel.\n         * If panel is pinned it's maximized on its place.\n         * If panel is unpinned it's maximized on position from which it was minimized\n         *\n         * @returns {LobiPanel}\n         */\n        maximize: function () {\n            var me = this;\n            me._triggerEvent(\"beforeMaximize\");\n            if (!me.isMinimized()) {\n                return me;\n            }\n            if (me.isPinned()) {\n                me.$body.slideDown();\n                me.$el.find('.panel-footer').slideDown();\n                me.$el.removeClass('panel-collapsed');\n                me._saveState('pinned');\n                me._changeClassOfControl(me.$heading.find('[data-func=\"minimize\"]'));\n                me._triggerEvent(\"onMaximize\");\n            } else {\n                me.enableTooltips();\n                //we get css style which was saved before minimization\n                var css = me.$el.attr('old-style').getCss();\n                //we give panel these css properties, coz animation work\n                me.$el.css({\n                    position: css.position || 'fixed',\n                    'z-index': css['z-index'],\n                    left: me.$el.offset().left,\n                    top: me.$el.offset().top,\n                    width: me.$el.width(),\n                    height: me.$el.height()\n                });\n                //we append panel into body\n                $('body').append(me.$el);\n                //It is not possible to make animations to these propeties and we remove it\n                delete css['position'];\n                delete css['z-index'];\n//            css['position'] = 'absolute';\n                //and we animate panel to its saved style\n                me.$el.animate(css, 100, function () {\n                    //we remove position property from style, before 'panel-unpin'\n                    //class has it to absolute\n                    me.$el.css('position', '');\n                    me.$el.removeClass('panel-minimized');\n                    //as panel is already in its place we remove 'old-style' property\n                    me.$el.removeAttr('old-style');\n                    if (me.$options.draggable) {\n                        me.enableDrag();\n                    }\n                    me.enableResize();\n                    me._removeExpandOnHeaderClick();\n                    //If there are no other elements inside footer, remove it also\n                    var footer = me._getFooterForMinimizedPanels();\n                    if (footer.children().length === 0) {\n                        footer.remove();\n                    }\n                    $('body').removeClass('lobipanel-minimized')\n                        .addClass('lobipanel-minimized');\n                    var maxWidth = 'calc(100% - ' + me.$heading.find('.dropdown-menu li').length * me.$heading.find('.dropdown-menu li').first().outerWidth() + \"px)\";\n                    me.$heading.find('.panel-title').css('max-width', maxWidth);\n                    me._updateUnpinnedState();\n                    me._triggerEvent(\"onMaximize\");\n                });\n            }\n            return me;\n        },\n\n        /**\n         * Toggles (minimize or maximize) the panel state.\n         *\n         * @returns {LobiPanel}\n         */\n        toggleMinimize: function () {\n            var me = this;\n            if (me.isMinimized()) {\n                me.maximize();\n            } else {\n                me.minimize();\n            }\n            return me;\n        },\n\n        /**\n         * Checks if panel is on full screen\n         *\n         * @returns {Boolean}\n         */\n        isOnFullScreen: function () {\n            var me = this;\n            return me.$el.hasClass('panel-expanded');\n        },\n\n        /**\n         * Expands the panel to full screen size\n         *\n         * @returns {LobiPanel}\n         */\n        toFullScreen: function () {\n            var me = this;\n            me._triggerEvent(\"beforeFullScreen\");\n            if (me.$el.hasClass(\"panel-collapsed\")) {\n                return me;\n            }\n            me.$el.attr('data-index', me.$el.index());\n            me._changeClassOfControl(me.$heading.find('[data-func=\"expand\"]'));\n            me.$el.css('position', 'fixed');\n            var res = me._getMaxZIndex();\n            //if panel is pinned or minimized, its position is not absolute and\n            //animation will not work correctly so we change its position and\n            //other css properties and we append panel into body\n            if (me.isPinned() || me.isMinimized()) {\n                me.enableTooltips();\n                me.$el.css({\n                    \"z-index\": res[\"z-index\"] + 1,\n                    left: me.$el.offset().left,\n                    top: me.$el.offset().top - $(window).scrollTop(),\n                    width: me.$el.width(),\n                    height: me.$el.height()\n                });\n                $('body').append(me.$el);\n                //If we are expanding panel to full screen from footer and in footer there are no more elements\n                //remove footer also\n                var footer = me._getFooterForMinimizedPanels();\n                if (footer.children().length === 0) {\n                    footer.remove();\n                }\n            } else {\n                me.$body.css({\n                    width: '',\n                    height: ''\n                });\n                me._setBodyHeight();\n            }\n            //if panel is not minimized we save its style property, because when\n            //toSmallSize() method is called panel needs to have style, it had before calling method\n            // toFullScreen()\n            if (!me.isMinimized()) {\n                me.$el.attr('old-style', me.$el.attr('style'));\n                me.disableResize();\n            } else {\n                me.$el.removeClass('panel-minimized');\n                me._removeExpandOnHeaderClick();\n            }\n            //get toolbar\n            var toolbar = $('.' + LobiPanel.PRIVATE_OPTIONS.toolbarClass);\n            var toolbarHeight = toolbar.outerHeight() || 0;\n            me.$el.animate({\n                width: $(window).width(),\n                height: $(window).height() - toolbarHeight,\n                left: 0,\n                top: 0\n            }, me.$options.expandAnimation, function () {\n                me.$el.css({\n                    width: '',\n                    height: '',\n                    right: 0,\n                    bottom: toolbarHeight\n                });\n                me.$el.addClass('panel-expanded');\n                $('body').css('overflow', 'hidden');\n                me.$body.css({\n                    width: me._calculateBodyWidth(me.$el.width()),\n                    height: me._calculateBodyHeight(me.$el.height())\n                });\n                me.disableDrag();\n                if (me.isPinned()) {\n                    me._disableSorting();\n                }\n                me._saveState('fullscreen');\n                me._triggerEvent(\"onFullScreen\");\n            });\n            return me;\n        },\n\n        /**\n         * Collapse the panel to small size\n         *\n         * @returns {LobiPanel}\n         */\n        toSmallSize: function () {\n            var me = this;\n            me._triggerEvent(\"beforeSmallSize\");\n            me._changeClassOfControl(me.$heading.find('[data-func=\"expand\"]'));\n            var css = me.$el.attr('old-style').getCss();\n\n            var toRemoveProperties = [\n                'position',\n                'z-index',\n                'left',\n                'top',\n                'width',\n                'height'\n            ];\n\n            //we get css properties from old-style (saved before expanding)\n            //and we animate panel to this css properties\n            me.$el.animate({\n                position: 'absolute',\n                left: css.left,\n                top: css.top,\n                width: css.width,\n                height: css.height,\n                right: css.right,\n                bottom: css.bottom\n            }, me.$options.collapseAnimation, function () {\n                //we remove old-style as we do not need it\n                me.$el.removeAttr('old-style');\n                //if panel is pinned we also remove its style attribute and we\n                //append panel in its parent element\n                if (!me.$el.hasClass('panel-unpin')) {\n                    for (var i in toRemoveProperties) {\n                        me.$el.css(toRemoveProperties[i], '');\n                    }\n                    // me.$el.removeAttr('style');\n                    me._insertInParent();\n                    me._enableSorting();\n                } else {\n                    if (me.$options.draggable) {\n                        me.enableDrag();\n                    }\n                    me.enableResize();\n                }\n                me.$el.removeClass('panel-expanded');\n                $('body').css('overflow', 'auto');\n                var bWidth = '';\n                var bHeight = '';\n                if (!me.isPinned()) {\n                    bWidth = me._calculateBodyWidth(me.getWidth());\n                    bHeight = me._calculateBodyHeight(me.getHeight());\n                } else if (me.$options.bodyHeight !== 'auto') {\n                    bHeight = me.$options.bodyHeight;\n                }\n                if (me.isPinned()) {\n                    me._saveState('pinned');\n                } else {\n                    me._updateUnpinnedState();\n                }\n                me.$body.css({\n                    width: bWidth,\n                    height: bHeight\n                });\n                me._triggerEvent(\"onSmallSize\");\n            });\n            return me;\n        },\n\n        /**\n         * Toggles (changes to full screen size or to small size) the panel size\n         *\n         * @returns {LobiPanel}\n         */\n        toggleSize: function () {\n            var me = this;\n            if (me.isOnFullScreen()) {\n                me.toSmallSize();\n            } else {\n                me.toFullScreen();\n            }\n            return me;\n        },\n\n        /**\n         * Closes the panel. Removes it from document\n         *\n         * @param {number} animationDuration\n         * @returns {LobiPanel}\n         */\n        close: function (animationDuration) {\n            var me = this,\n                animationDuration = animationDuration === undefined ? 100 : animationDuration;\n            me._triggerEvent('beforeClose');\n            me.$el.hide(animationDuration, function () {\n                if (me.isOnFullScreen()) {\n                    $('body').css('overflow', 'auto');\n                }\n                me._triggerEvent('onClose');\n                me.$el.remove();\n                var footer = me._getFooterForMinimizedPanels();\n                if (footer.children().length === 0) {\n                    footer.remove();\n                }\n            });\n            return me;\n        },\n\n        /**\n         * Moves unpinned panel to given position.\n         * This method will do nothing if panel is pinned\n         *\n         * @param {number} left\n         * @param {number} top\n         * @param {number} animationDuration\n         * @returns {LobiPanel}\n         */\n        setPosition: function (left, top, animationDuration) {\n            var me = this,\n                animationDuration = animationDuration === undefined ? 100 : animationDuration;\n\n            //this method works only if panel is not pinned\n            if (me.isPinned()) {\n                return me;\n            }\n            me.$el.animate({\n                'left': left,\n                'top': top\n            }, animationDuration);\n            return me;\n        },\n\n        /**\n         * Set the width of the panel\n         *\n         * @param {number} w\n         * @param {number} animationDuration\n         * @returns {LobiPanel}\n         */\n        setWidth: function (w, animationDuration) {\n            var me = this,\n                animationDuration = animationDuration === undefined ? 100 : animationDuration;\n            if (me.isPinned()) {\n                return me;\n            }\n            var bWidth = me._calculateBodyWidth(w);\n            me.$el.animate({\n                width: w\n            }, animationDuration);\n            me.$body.animate({\n                width: bWidth\n            }, animationDuration);\n            return me;\n        },\n\n        /**\n         * Set the height of the panel\n         *\n         * @param {number} h\n         * @param {number} animationDuration\n         * @returns {LobiPanel}\n         */\n        setHeight: function (h, animationDuration) {\n            var me = this,\n                animationDuration = animationDuration === undefined ? 100 : animationDuration;\n            if (me.isPinned()) {\n                return me;\n            }\n            var bHeight = me._calculateBodyHeight(h);\n            me.$el.animate({\n                height: h\n            }, animationDuration);\n            me.$body.animate({\n                height: bHeight\n            }, animationDuration);\n            return me;\n        },\n\n        /**\n         * Set size (width and height) of the panel\n         *\n         * @param {number} w\n         * @param {number} h\n         * @param {number} animationDuration\n         * @returns {LobiPanel}\n         */\n        setSize: function (w, h, animationDuration) {\n            var me = this,\n                animationDuration = animationDuration === undefined ? 100 : animationDuration;\n            if (me.isPinned()) {\n                return me;\n            }\n            var bHeight = me._calculateBodyHeight(h);\n            var bWidth = me._calculateBodyWidth(w);\n            me.$el.animate({\n                height: h,\n                width: w\n            }, animationDuration);\n            me.$body.animate({\n                height: bHeight,\n                width: bWidth\n            }, animationDuration);\n            return me;\n        },\n\n        /**\n         * Get the position of the panel.\n         * Returns object where x is left coordinate and y is top coordinate\n         *\n         * @returns {Object}\n         */\n        getPosition: function () {\n            var me = this;\n            var offset = me.$el.offset();\n            return {\n                x: offset.left,\n                y: offset.top\n            };\n        },\n\n        /**\n         * Get width of the panel\n         *\n         * @returns {number}\n         */\n        getWidth: function () {\n            var me = this;\n            return me.$el.width();\n        },\n\n        /**\n         * Get height of the panel\n         *\n         * @returns {number}\n         */\n        getHeight: function () {\n            var me = this;\n            return me.$el.height();\n        },\n\n        /**\n         * If panel is overlapped by another panel this panel will be shown on front\n         * (this panel will overlap other panels)\n         *\n         * @returns {LobiPanel}\n         */\n        bringToFront: function () {\n            var me = this;\n            me._triggerEvent(\"beforeToFront\");\n            var res = me._getMaxZIndex();\n            if (res['id'] === me.$el.data('inner-id')) {\n                return me;\n            }\n            me.$el.css('z-index', res['z-index'] + 1);\n            me._triggerEvent(\"onToFront\");\n            return me;\n        },\n\n        /**\n         * Enable dragging of panel\n         *\n         * @returns {LobiPanel}\n         */\n        enableDrag: function () {\n            var me = this;\n            me.$el.draggable({\n                handle: '.panel-heading',\n                containment: me.$options.constrain,\n                start: function () {\n                    me.$el.css('position', 'absolute');\n                },\n                stop: function () {\n                    me.$el.css('position', '');\n                    me._updateUnpinnedState();\n                }\n            });\n            return me;\n        },\n\n        /**\n         * Disable dragging of the panel\n         *\n         * @returns {LobiPanel}\n         */\n        disableDrag: function () {\n            var me = this;\n            if (me.$el.hasClass('ui-draggable')) {\n                me.$el.draggable(\"destroy\");\n            }\n            return me;\n        },\n\n        /**\n         * Enable resize of the panel\n         *\n         * @returns {LobiPanel}\n         */\n        enableResize: function () {\n            var me = this;\n            var handles = false;\n            if (me.$options.resize === 'vertical') {\n                handles = 'n, s';\n            } else if (me.$options.resize === 'horizontal') {\n                handles = 'e, w';\n            } else if (me.$options.resize === 'both') {\n                handles = 'all';\n            }\n            if (!handles) {\n                return me;\n            }\n            me.$el.resizable({\n                minWidth: me.$options.minWidth,\n                maxWidth: me.$options.maxWidth,\n                minHeight: me.$options.minHeight,\n                maxHeight: me.$options.maxHeight,\n                handles: handles,\n                start: function () {\n                    me.$el.disableSelection();\n                    me._triggerEvent('resizeStart');\n                },\n                stop: function () {\n                    me.$el.enableSelection();\n                    me._triggerEvent('resizeStop');\n                },\n                resize: function () {\n                    var bHeight = me._calculateBodyHeight(me.$el.height());\n                    var bWidth = me._calculateBodyWidth(me.$el.width());\n                    me.$body.css({\n                        width: bWidth,\n                        height: bHeight\n                    });\n                    me._updateUnpinnedState();\n                    me._triggerEvent(\"onResize\");\n                }\n            });\n            return me;\n        },\n\n        /**\n         * Disable resize of the panel\n         *\n         * @returns {LobiPanel}\n         */\n        disableResize: function () {\n            var me = this;\n            if (me.$el.hasClass('ui-resizable')) {\n                me.$el.resizable(\"destroy\");\n            }\n            return me;\n        },\n\n        /**\n         * Start spinner of the panel loading\n         *\n         * @returns {LobiPanel}\n         */\n        startLoading: function () {\n            var me = this;\n            var spinner = me._generateWindow8Spinner();\n            me.$el.append(spinner);\n            var sp = spinner.find('.spinner');\n            sp.css('margin-top', 50);\n            return me;\n        },\n\n        /**\n         * Stop spinner of the panel loading\n         *\n         * @returns {LobiPanel}\n         */\n        stopLoading: function () {\n            var me = this;\n            me.$el.find('.spinner-wrapper').remove();\n            return me;\n        },\n\n        /**\n         * Set url. This url will be used to load data when Reload button is clicked\n         * or user calls .load() method without url parameter\n         *\n         * @param {string} url\n         * @returns {LobiPanel}\n         */\n        setLoadUrl: function (url) {\n            var me = this;\n            me.$options.loadUrl = url;\n            return me;\n        },\n\n        /**\n         * Load data into .panel-body.\n         * params object is in format\n         * {\n         *      url: '', //Optional: load url\n         *      data: 'PlainObject or String', //Optional: A plain object or string of parameters which is sent to the server with the request.\n         *      callback: 'function' //Optional: callback function which is called when load is finished\n         * }\n         *\n         * @param {Object} params\n         * @returns {LobiPanel}\n         */\n        load: function (params) {\n            var me = this;\n            params = params || {};\n            if (typeof params === 'string') {\n                params = {url: params};\n            }\n            var url = params.url || me.$options.loadUrl,\n                data = params.data || {},\n                callback = params.callback || null;\n\n            if (!url) {\n                return me;\n            }\n            me._triggerEvent(\"beforeLoad\");\n            me.startLoading();\n            me.$body.load(url, data, function (result, status, xhr) {\n                if (callback && typeof callback === 'function') {\n                    me.callback(result, status, xhr);\n                }\n                me.stopLoading();\n                me._triggerEvent(\"loaded\", result, status, xhr);\n            });\n            return me;\n        },\n\n        /**\n         * Destroy the LobiPanel instance\n         *\n         * @returns {jQuery}\n         */\n        destroy: function () {\n            var me = this;\n            me.disableDrag();\n            me.disableResize();\n            me.$options.sortable = false;\n            me._enableSorting();\n            me._removeInnerIdFromParent(me.innerId);\n            me.$el.removeClass('lobipanel')\n                .removeAttr('data-inner-id')\n                .removeAttr('data-index')\n                .removeData('lobiPanel');\n            me.$heading.find('.dropdown').remove();\n            return me.$el;\n        },\n\n        /**\n         * Creates input field to edit panel title\n         *\n         * @returns {LobiPanel}\n         */\n        startTitleEditing: function () {\n            var me = this;\n            var title = me.$heading.find('.panel-title').text().trim();\n            var input = $('<input value=\"' + title + '\"/>');\n            input.on('keydown', function (ev) {\n                if (ev.which === 13) {\n                    me.finishTitleEditing();\n                } else if (ev.which === 27) {\n                    me.cancelTitleEditing();\n                }\n            });\n            me.$heading.find('.panel-title')\n                .data('old-title', title)\n                .html(\"\").append(input);\n            input[0].focus();\n            input[0].select();\n            me._changeClassOfControl(me.$heading.find('[data-func=\"editTitle\"]'));\n            return me;\n        },\n\n        /**\n         * Check if panel title is being edited (if it is in edit process)\n         *\n         * @returns {Boolean}\n         */\n        isTitleEditing: function () {\n            var me = this;\n            return me.$heading.find('.panel-title input').length > 0;\n        },\n\n        /**\n         * Cancel the panel new title and return to previous title when it is changed but not saved\n         *\n         * @returns {LobiPanel}\n         */\n        cancelTitleEditing: function () {\n            var me = this;\n            var title = me.$heading.find('.panel-title');\n            title.html(title.data('old-title'))\n                .find('input').remove();\n            me._changeClassOfControl(me.$heading.find('[data-func=\"editTitle\"]'));\n            return me;\n        },\n\n        /**\n         * Finish the panel title editing process and save new title\n         *\n         * @returns {LobiPanel}\n         */\n        finishTitleEditing: function () {\n            var me = this,\n                input = me.$heading.find('input');\n            if (me._triggerEvent('beforeTitleChange', input.val()) === false) {\n                return me;\n            }\n\n            me.saveParam('panelTitle', input.val());\n            me.$heading.find('.panel-title').html(input.val());\n            input.remove();\n            me._changeClassOfControl(me.$heading.find('[data-func=\"editTitle\"]'));\n            me._triggerEvent('onTitleChange', input.val());\n            return me;\n        },\n\n        /**\n         * Enable tooltips on panel controls\n         *\n         * @returns {LobiPanel}\n         */\n        enableTooltips: function () {\n            var me = this;\n            if ($(window).width() < 768) {\n                return me;\n            }\n            var controls = me.$heading.find('.dropdown-menu>li>a');\n            controls.each(function (index, el) {\n                var $el = $(el);\n                $el.attr('data-toggle', 'tooltip')\n                    .attr('data-title', $el.data('tooltip'))\n                    .attr('data-placement', 'bottom')\n                ;\n            });\n            controls.each(function (ind, el) {\n                $(el).tooltip({\n                    container: 'body',\n                    template: '<div class=\"tooltip lobipanel-tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n                });\n            });\n            return me;\n        },\n\n        /**\n         * Disable tooltips on panel controls\n         *\n         * @returns {LobiPanel}\n         */\n        disableTooltips: function () {\n            var me = this;\n            var $links = me.$heading.find('.dropdown-menu>li>a');\n            $links.each(function (ind, el) {\n                var bsTooltip = $(el).data('bs.tooltip');\n                if (bsTooltip) {\n                    $(el).tooltip('destroy');\n                }\n            });\n            // me.$heading.find('.dropdown-menu>li>a').tooltip('destroy');\n            return me;\n        },\n\n        _generateControls: function () {\n            var me = this;\n            var dropdown = me._generateDropdown();\n            var menu = dropdown.find('.dropdown-menu');\n            if (me.$options.editTitle !== false) {\n                menu.append(me._generateEditTitle());\n            }\n            if (me.$options.unpin !== false) {\n                menu.append(me._generateUnpin());\n            }\n            if (me.$options.reload !== false) {\n                menu.append(me._generateReload());\n            }\n            if (me.$options.minimize !== false) {\n                menu.append(me._generateMinimize());\n            }\n            if (me.$options.expand !== false) {\n                menu.append(me._generateExpand());\n            }\n            if (me.$options.changeStyle !== false) {\n                menu.append(me._generateChangeStyle());\n            }\n            if (me.$options.close !== false) {\n                menu.append(me._generateClose());\n            }\n            menu.find('>li>a').on('click', function (ev) {\n                ev.preventDefault();\n                ev.stopPropagation();\n            });\n            return dropdown;\n        },\n        _generateDropdown: function () {\n            var me = this;\n            return $('<div class=\"dropdown\"'+(me.$options.forAngularJs ? ' uib-dropdown' : '')+'></div>')\n                .append('<ul class=\"dropdown-menu dropdown-menu-right\"'+(me.$options.forAngularJs ? ' uib-dropdown-menu' : '')+'></ul>')\n                .append('<div class=\"dropdown-toggle\"'+(me.$options.forAngularJs ? ' uib-dropdown-toggle' : ' data-toggle=\"dropdown\"')+'><span class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + me.$options.toggleIcon + '\"></div>');\n        },\n        _generateEditTitle: function () {\n            var me = this;\n            var options = me.$options.editTitle;\n            var control = $('<a data-func=\"editTitle\"></a>');\n            control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                control.attr('data-tooltip', options.tooltip);\n            }\n\n            me._attachEditTitleClickListener(control);\n            return $('<li></li>').append(control);\n        },\n        _attachEditTitleClickListener: function (control) {\n            var me = this;\n            control.on('mousedown', function (ev) {\n                ev.stopPropagation();\n            });\n            control.on('click', function (ev) {\n                ev.stopPropagation();\n                me.hideTooltip(control);\n                if (me.isTitleEditing()) {\n                    me.finishTitleEditing();\n                } else {\n                    me.startTitleEditing();\n                }\n            });\n        },\n\n        hideTooltip: function ($el) {\n            var bsTooltip = $el.data('bs.tooltip');\n\n            if (bsTooltip) {\n                $el.tooltip('hide');\n            }\n            return this;\n        },\n        _generateUnpin: function () {\n            var me = this;\n            var options = me.$options.unpin;\n            var control = $('<a data-func=\"unpin\"></a>');\n            control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                control.attr('data-tooltip', options.tooltip);\n            }\n            me._attachUnpinClickListener(control);\n            return $('<li></li>').append(control);\n        },\n        _attachUnpinClickListener: function (control) {\n            var me = this;\n            //hide the tooltip\n            control.on('mousedown', function (ev) {\n                ev.stopPropagation();\n            });\n            control.on('click', function () {\n                me.hideTooltip(control);\n                me.doTogglePin();\n            });\n        },\n        _generateReload: function () {\n            var me = this;\n            var options = me.$options.reload;\n            var control = $('<a data-func=\"reload\"></a>');\n            control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                control.attr('data-tooltip', options.tooltip);\n            }\n            me._attachReloadClickListener(control);\n            return $('<li></li>').append(control);\n        },\n        _attachReloadClickListener: function (control) {\n            var me = this;\n            control.on('mousedown', function (ev) {\n                ev.stopPropagation();\n            });\n            control.on('click', function () {\n                me.hideTooltip(control);\n                me.load();\n            });\n        },\n        _generateMinimize: function () {\n            var me = this;\n            var options = me.$options.minimize;\n            var control = $('<a data-func=\"minimize\"></a>');\n            control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                control.attr('data-tooltip', options.tooltip);\n            }\n            me._attachMinimizeClickListener(control);\n            return $('<li></li>').append(control);\n        },\n        _attachMinimizeClickListener: function (control) {\n            var me = this;\n            control.on('mousedown', function (ev) {\n                ev.stopPropagation();\n            });\n            control.on('click', function (ev) {\n                ev.stopPropagation();\n                me.hideTooltip(control);\n                me.toggleMinimize();\n            });\n        },\n        _generateExpand: function () {\n            var me = this;\n            var options = me.$options.expand;\n            var control = $('<a data-func=\"expand\"></a>');\n            control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                control.attr('data-tooltip', options.tooltip);\n            }\n            me._attachExpandClickListener(control);\n            return $('<li></li>').append(control);\n        },\n        _generateChangeStyle: function () {\n            var me = this;\n            var options = me.$options.changeStyle;\n            var $control = $('<a data-func=\"changeStyle\"></a>');\n            $control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                $control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                $control.attr('data-tooltip', options.tooltip);\n            }\n            // me._attachExpandClickListener(control);\n\n            var $dropdown = $('<li class=\"style-change-item\"></li>').append($control);\n\n            var $menu = $('<div>', {\n                'class': 'style-list'\n            }).appendTo($dropdown);\n\n            if (me.$options.styles) {\n                for (var i = 0; i < me.$options.styles.length; i++) {\n                    var style = me.$options.styles[i];\n                    $menu.append('<div class=\"style-item style-primary\" style=\"background-color: ' +\n                        style.bg + '\" data-bg=\"' + style.bg + '\" data-text=\"' + style.text + '\"></div>');\n                }\n            }\n            $menu.find('.style-item').on('click', function () {\n                var $item = $(this);\n                me.saveParam('panelStyle', {\n                    bg: $item.data('bg'),\n                    text: $item.data('text')\n                });\n                me.applyStyle($item.data('bg'), $item.data('text'));\n                $menu.removeClass('opened');\n            });\n\n            $control.on('click', function () {\n                var $this = $(this);\n                var $parent = $this.closest('.style-change-item');\n                $parent.find('.style-list').toggleClass('opened');\n            });\n\n            return $dropdown;\n        },\n\n        applyStyle: function (color, text) {\n            var me = this;\n            me.$heading.css('background-color', color);\n            me.$heading.css('border-color', color);\n            me.$heading.css('color', text);\n            me.$el.css('border-color', color);\n        },\n\n        _createDropdownForStyleChange: function () {\n            var me = this;\n            var $dropdown = $('<div>', {\n                'class': 'dropdown'\n            }).append(\n                $('<button>', {\n                    'type': 'button',\n                    'data-toggle': 'dropdown',\n                    'class': 'btn btn-default btn-xs',\n                    'html': '<i class=\"glyphicon glyphicon-th\"></i>'\n                })\n            );\n            var $menu = $('<div>', {\n                'class': 'dropdown-menu dropdown-menu-right'\n            }).appendTo($dropdown);\n\n            for (var i = 0; i < 0; i++) {\n                var st = me.$globalOptions.listStyles[i];\n                var st = 'primary';\n                $('<div class=\"' + st + '\"></div>')\n                    .on('mousedown', function (ev) {\n                        ev.stopPropagation()\n                    })\n                    .click(function () {\n                        var classes = me.$el[0].className.split(' ');\n                        var oldClass = null;\n                        for (var i = 0; i < classes.length; i++) {\n                            if (me.$globalOptions.listStyles.indexOf(classes[i]) > -1) {\n                                oldClass = classes[i];\n                            }\n                        }\n                        me.$el.removeClass(me.$globalOptions.listStyles.join(\" \"))\n                            .addClass(this.className);\n\n                        me._triggerEvent('styleChange', [me, oldClass, this.className]);\n\n                    })\n                    .appendTo($menu);\n            }\n\n            return $dropdown;\n        },\n        _attachExpandClickListener: function (control) {\n            var me = this;\n            control.on('mousedown', function (ev) {\n                ev.stopPropagation();\n            });\n            control.on('click', function (ev) {\n                ev.stopPropagation();\n                me.hideTooltip(control);\n                me.toggleSize();\n            });\n        },\n        _generateClose: function () {\n            var me = this;\n            var options = me.$options.close;\n            var control = $('<a data-func=\"close\"></a>');\n            control.append('<i class=\"' + LobiPanel.PRIVATE_OPTIONS.iconClass + ' ' + options.icon + '\"></i>');\n            if (options.tooltip && typeof options.tooltip === 'string') {\n                control.append('<span class=\"control-title\">' + options.tooltip + '</span>');\n                control.attr('data-tooltip', options.tooltip);\n            }\n            me._attachCloseClickListener(control);\n            return $('<li></li>').append(control);\n        },\n        _attachCloseClickListener: function (control) {\n            var me = this;\n            control.on('mousedown', function (ev) {\n                ev.stopPropagation();\n            });\n            control.on('click', function (ev) {\n                ev.stopPropagation();\n                me.hideTooltip(control);\n                me.close();\n            });\n        },\n        _getMaxZIndex: function () {\n            var me = this;\n            var panels = $('.lobipanel.panel-unpin:not(.panel-minimized.panel-expanded)'),\n                style,\n                max,\n                cur;\n            if (panels.length === 0) {\n                return {\n                    \"id\": \"\",\n                    \"z-index\": LobiPanel.PRIVATE_OPTIONS.initialZIndex\n                };\n            }\n            style = $(panels[0]).attr('style');\n            var id = $(panels[0]).data('inner-id');\n            if (!style) {\n                max = LobiPanel.PRIVATE_OPTIONS.initialZIndex;\n            } else {\n                max = style.getCss()['z-index'];\n            }\n            for (var i = 1; i < panels.length; i++) {\n                style = $(panels[i]).attr('style');\n                if (!style) {\n                    cur = 0;\n                } else {\n                    cur = style.getCss()['z-index'];\n                }\n                if (cur > max) {\n                    id = $(panels[i]).data('inner-id');\n                    max = cur;\n                }\n            }\n            return {\n                \"id\": id,\n                \"z-index\": parseInt(max, 10)\n            };\n        },\n        _onPanelClick: function () {\n            var me = this;\n            me.$el.on('mousedown.lobiPanel', function () {\n                if (me.isPinned() ||\n                    me.isMinimized() ||\n                    me.isOnFullScreen()) {\n                    return false;\n                }\n                me.bringToFront();\n            });\n        },\n        _offPanelClick: function () {\n            var me = this;\n            me.$el.off('mousedown.lobiPanel');\n        },\n        _changeClassOfControl: function (el) {\n            var me = this;\n            el = $(el);\n            var opts = me.$options[el.attr('data-func')];\n            if (!opts.icon) {\n                return;\n            }\n            el.find('.' + LobiPanel.PRIVATE_OPTIONS.iconClass).toggleClass(opts.icon).toggleClass(opts.icon2);\n        },\n        _getFooterForMinimizedPanels: function () {\n            var me = this;\n            //we grab footer where minimized panels should go\n            var minimizedCtr = $('.' + LobiPanel.PRIVATE_OPTIONS.toolbarClass);\n            //if panel does not exist we create it and append to body\n            if (minimizedCtr.length === 0) {\n                minimizedCtr = $('<div class=\"' + LobiPanel.PRIVATE_OPTIONS.toolbarClass + '\"></div>');\n                $('body').append(minimizedCtr);\n            }\n            return minimizedCtr;\n        },\n        _expandOnHeaderClick: function () {\n            var me = this;\n            me.$heading.on('click.lobiPanel', function () {\n                me.maximize();\n                me.bringToFront();\n            });\n        },\n        _removeExpandOnHeaderClick: function () {\n            var me = this;\n            me.$heading.off('click.lobiPanel');\n        },\n        _getAvailableWidth: function (calcWidth) {\n            var me = this;\n            if (me.$options.maxWidth) {\n                calcWidth = Math.min(calcWidth, me.$options.maxWidth);\n            }\n            if (me.$options.minWidth) {\n                calcWidth = Math.max(calcWidth, me.$options.minWidth);\n            }\n            return calcWidth;\n        },\n        _getAvailableHeight: function (calcHeight) {\n            var me = this;\n            if (me.$options.maxHeight) {\n                calcHeight = Math.min(calcHeight, me.$options.maxHeight);\n            }\n            if (me.$options.minHeight) {\n                calcHeight = Math.max(calcHeight, me.$options.minHeight);\n            }\n            return calcHeight;\n        },\n        _calculateBodyHeight: function (h) {\n            var me = this;\n            return h - me.$heading.outerHeight() - me.$el.find('.panel-footer').outerHeight();\n        },\n        _calculateBodyWidth: function (w) {\n            var me = this;\n            return w - 2;\n        },\n        _appendInnerIdToParent: function (parent, innerId) {\n            var me = this;\n            //If this is first lobipanel element of its parent\n            if (parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr) === undefined) {\n                parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr, innerId);\n            }\n            //This means that parent already has LobiPanel instance\n            else {\n                //if parent already has panel innerId than we do nothing\n                if (parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr).indexOf(innerId) > -1) {\n                    return;\n                }\n                var innerIds = parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr);\n                parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr, innerIds + \" \" + innerId);\n            }\n            me.$el.attr('data-index', me.$el.index());\n        },\n        _insertInParent: function () {\n            var me = this;\n            //find its parent element\n            var parent = $('[' + LobiPanel.PRIVATE_OPTIONS.parentAttr + '~=' + me.innerId + ']');\n            me.$el.insertAt(me.$el.attr('data-index'), parent);\n        },\n        _generateWindow8Spinner: function () {\n            var me = this;\n            var template = ['<div class=\"spinner spinner-windows8\">',\n                '<div class=\"wBall\">',\n                '<div class=\"wInnerBall\">',\n                '</div>',\n                '</div>',\n                '<div class=\"wBall\">',\n                '<div class=\"wInnerBall\">',\n                '</div>',\n                '</div>',\n                '<div class=\"wBall\">',\n                '<div class=\"wInnerBall\">',\n                '</div>',\n                '</div>',\n                '<div class=\"wBall\">',\n                '<div class=\"wInnerBall\">',\n                '</div>',\n                '</div>',\n                '<div class=\"wBall\">',\n                '<div class=\"wInnerBall\">',\n                '</div>',\n                '</div>',\n                '</div>'].join(\"\");\n            return $('<div class=\"spinner-wrapper\">' + template + '</div>');\n        },\n        _enableSorting: function () {\n            var me = this;\n            var parent = me.$el.parent();\n            if (parent.hasClass('ui-sortable')) {\n                parent.sortable(\"destroy\");\n            }\n            if (me.$options.sortable) {\n                me.$el.addClass('lobipanel-sortable');\n                parent.addClass('lobipanel-parent-sortable');\n            } else {\n                me.$el.removeClass('lobipanel-sortable');\n            }\n            parent.sortable({\n                connectWith: '.lobipanel-parent-sortable',\n                items: '.lobipanel-sortable',\n                handle: '.panel-heading',\n                cursor: 'move',\n                placeholder: 'lobipanel-placeholder',\n                forcePlaceholderSize: true,\n                opacity: 0.7,\n                revert: 300,\n                update: function (event, ui) {\n                    me.savepanelPositions();\n                    var $panel = ui.item;\n\n                    var innerId = $panel.data('inner-id');\n                    me._removeInnerIdFromParent(innerId);\n                    me._appendInnerIdToParent(ui.item.parent(), innerId);\n                    me._triggerEvent('dragged');\n                }\n            });\n        },\n\n        savepanelPositions: function () {\n            var me = this;\n            var $parents = $('.lobipanel-parent-sortable');\n            $parents.each(function (index, parent) {\n                var $parent = $(parent);\n\n                var parentInnerId = $parent.data('inner-id');\n                if (!parentInnerId) {\n                    console.error(\"Panel does not have parent id \", $parent);\n                    return;\n                }\n                var $childPanels = $parent.find('.lobipanel');\n                var positions = {};\n                $childPanels.each(function (index, el) {\n                    var $el = $(el);\n                    positions[$el.data('inner-id')] = index;\n                });\n                me.storageObject.saveChildPositions(parentInnerId, positions);\n            });\n        },\n\n        _disableSorting: function () {\n            var me = this;\n            var parent = me.$el.parent();\n            if (parent.hasClass('ui-sortable')) {\n                parent.sortable(\"destroy\");\n            }\n        },\n        _removeInnerIdFromParent: function (innerId) {\n            var me = this;\n            var parent = $('[' + LobiPanel.PRIVATE_OPTIONS.parentAttr + '~=' + innerId + ']');\n            if (parent.length) {\n                var innerIds = parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr).replace(innerId, '').trim().replace(/\\s{2,}/g, ' ');\n                parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr, innerIds);\n            }\n        },\n        _onToggleIconsBtnClick: function () {\n            var me = this;\n            me.$heading.find('.toggle-controls').on('click.lobiPanel', function () {\n                me.$el.toggleClass(\"controls-expanded\");\n            });\n        },\n        _adjustForScreenSize: function () {\n            var me = this;\n            me.disableTooltips();\n            if ($(window).width() > 768 && me.$options.tooltips) {\n                me.enableTooltips();\n            }\n            if (me.isOnFullScreen()) {\n                me.$body.css({\n                    width: me._calculateBodyWidth(me.$el.width()),\n                    height: me._calculateBodyHeight(me.$el.height())\n                });\n            }\n        },\n        _enableResponsiveness: function () {\n            var me = this;\n            me._adjustForScreenSize();\n            $(window).on('resize.lobiPanel', function () {\n                me._adjustForScreenSize();\n            });\n        },\n        _setBodyHeight: function () {\n            var me = this;\n            if (me.$options.bodyHeight !== 'auto') {\n                me.$body.css({\n                    'height': me.$options.bodyHeight,\n                    overflow: 'auto'\n                });\n            }\n        },\n        _getOptionsFromAttributes: function () {\n            var me = this;\n            var $el = me.$el;\n            var options = {};\n            for (var key in $.fn.lobiPanel.DEFAULTS) {\n                var k = key.toDash();\n                var val = $el.data(k);\n                if (val !== undefined) {\n                    if (typeof $.fn.lobiPanel.DEFAULTS[key] !== 'object') {\n                        options[key] = val;\n                    } else {\n                        options[key] = eval('(' + val + ')');\n                    }\n                }\n            }\n            return options;\n        },\n        _saveState: function (state, params) {\n            var me = this;\n            // console.log(\"Save state \", state, params);\n            if (!me.hasRandomId && me.$options.stateful) {\n                me.storage.state = state;\n                if (params) {\n                    me.storage.stateParams = params;\n                }\n\n                me._saveLocalStorage(me.storage);\n            }\n        },\n        getParam: function (key, value) {\n            var me = this;\n            // console.log(\"Save state \", state, params);\n            return me.storage[key];\n        },\n        saveParam: function (key, value) {\n            var me = this;\n            // console.log(\"Save state \", state, params);\n            me.storage[key] = value;\n\n            me._saveLocalStorage(me.storage);\n        },\n        _saveLocalStorage: function (storage) {\n            var me = this;\n            me.storageObject.savePanelParams(me.innerId, storage);\n        },\n        _applyState: function (state, params) {\n            var me = this;\n            switch (state) {\n                case 'pinned':\n                    if (!me.hasRandomId) {\n                        var allPanelPositions = me.storageObject.getAllPanelPositions();\n                        // console.log(allPanelPositions);\n                        for (var i in allPanelPositions) {\n                            var panelPositions = allPanelPositions[i];\n                            var innerParentId = i;\n                            var $parent = $('.lobipanel-parent-sortable[data-inner-id=' + innerParentId + ']');\n                            for (var j in panelPositions) {\n                                var $panel = $('[data-inner-id=' + j + ']');\n                                me._removeInnerIdFromParent($panel.data('inner-id'));\n                                me._appendInnerIdToParent($parent, $panel.data('inner-id'));\n                                if (!$panel.hasClass('panel-unpin') && !$panel.hasClass('panel-expanded')) {\n                                    $panel.insertAt(panelPositions[j], $parent);\n                                }\n                            }\n                        }\n                    }\n                    // if (params && params.index !== null && params.index !== undefined) {\n                    //     me._applyIndex(params.index);\n                    // }\n                    break;\n                case 'unpinned':\n                    me.unpin();\n                    me.setPosition(params.left, params.top, 0);\n                    me.setSize(params.width, params.height, 0);\n                    break;\n                case 'minimized':\n                    me.unpin();\n                    me.minimize();\n                    break;\n                case 'collapsed':\n                    me.minimize();\n                    break;\n                case 'fullscreen':\n                    me.toFullScreen();\n                    break;\n                default:\n                    break;\n            }\n        },\n        _applyIndex: function (index) {\n            var me = this;\n            if (index !== null) {\n                me.$el.insertAt(index, me.$el.parent());\n            }\n        },\n        _triggerEvent: function (eventType) {\n            var me = this;\n            var args = Array.prototype.slice.call(arguments, 1);\n            args.unshift(me);\n\n            me.$el.trigger(eventType + '.lobiPanel', args);\n            if (me.$options[eventType] && typeof me.$options[eventType] === 'function') {\n                return me.$options[eventType].apply(me, args);\n            }\n\n            return true;\n        },\n        doPin: function () {\n            var me = this;\n            if (me._triggerEvent(\"beforePin\") !== false) {\n                me.pin();\n                me._saveState('pinned');\n                me._triggerEvent(\"onPin\");\n            }\n            return me;\n        },\n        doUnpin: function () {\n            var me = this;\n            if (me._triggerEvent('beforeUnpin') !== false) {\n                me.unpin();\n                me._updateUnpinnedState();\n                me._triggerEvent('onUnpin');\n            }\n            return me;\n        },\n        doTogglePin: function () {\n            var me = this;\n            if (this.isPinned()) {\n                this.doUnpin();\n            } else {\n                this.doPin();\n            }\n            return me;\n        },\n        _updateUnpinnedState: function () {\n            var me = this;\n            me._saveState('unpinned', me.getAlignment());\n        },\n        getAlignment: function () {\n            var me = this;\n            return {\n                top: me.$el.css('top'),\n                left: me.$el.css('left'),\n                width: me.$el.css('width'),\n                height: me.$el.css('height')\n            };\n        }\n    };\n\n    $.fn.lobiPanel = function (option) {\n        var args = arguments,\n            ret = null;\n        this.each(function () {\n\n            var $this = $(this);\n            var data = $this.data('lobiPanel');\n            var options = typeof option === 'object' && option;\n\n            if (!data) {\n                $this.data('lobiPanel', (data = new LobiPanel($this, options)));\n            }\n            if (typeof option === 'string') {\n                args = Array.prototype.slice.call(args, 1);\n                ret = data[option].apply(data, args);\n            }\n        });\n        return ret;\n    };\n    $.fn.lobiPanelParent = function (option) {\n        this.each(function (index, parent) {\n            var $parent = $(parent);\n            if (!$parent.hasClass('ui-sortable')) {\n                $parent.sortable({\n                    connectWith: '.lobipanel-parent-sortable',\n                    items: '.lobipanel-sortable',\n                    handle: '.panel-heading',\n                    cursor: 'move',\n                    placeholder: 'lobipanel-placeholder',\n                    forcePlaceholderSize: true,\n                    opacity: 0.7,\n                    revert: 300,\n                    update: function (event, ui) {\n                        console.log(ui);\n                        // me.savepanelPositions();\n                        //\n                        // // me._removeInnerIdFromParent(innerId);\n                        // // me._appendInnerIdToParent(ui.item.parent(), innerId);\n                        // me._triggerEvent('dragged');\n                    }\n                });\n            }\n        });\n        return this;\n    };\n    LobiPanel.PRIVATE_OPTIONS = {\n        //We need to know what is the parent of the panel, that's why we add\n        //this attribute to parent element and it contains space seperated inner-ids of all its child lobipanel\n        parentAttr: 'data-lobipanel-child-inner-id',\n        toolbarClass: 'lobipanel-minimized-toolbar', //This class is added to container which contains all minimized panels\n        //First instance on lobiPanel will get this z-index css property.\n        //Every next instance will get 1 + previous z-index\n        initialZIndex: 10000,\n        //This class is attached to every panel-control icon\n        iconClass: 'panel-control-icon'\n    };\n    $.fn.lobiPanel.DEFAULTS = {\n        //Makes <b>unpinned</b> panel draggable\n        //Warning!!! This requires jquery ui draggable widget to be included\n        draggable: true,\n        //Makes <b>pinned</b> panels sortable\n        //Warning!!! This requires jquery ui sortable widget to be included\n        sortable: false,\n        //jquery ui sortable plugin option.\n        //To avoid any problems this option must be same for all panels which are direct children of their parent\n        connectWith: '.ui-sortable',\n        //This parameter accepts string ['both', 'vertical', 'horizontal', 'none']. none means disable resize\n        resize: 'both',\n        //Minimum width <b>unpin, resizable</b> panel can have.\n        minWidth: 200,\n        //Minimum height <b>unpin, resizable</b> panel can have.\n        minHeight: 100,\n        //Maximum width <b>unpin, resizable</b> panel can have.\n        maxWidth: 1200,\n        //Maximum height <b>unpin, resizable</b> panel can have.\n        maxHeight: 700,\n        //The url which will be used to load content. If not provided reload button will do nothing\n        loadUrl: \"\",\n        //If loadUrl is provided plugin will load content as soon as plugin is initialized\n        autoload: true,\n        bodyHeight: 'auto',\n        //This will enable tooltips on panel controls\n        tooltips: true,\n        forAngularJs: false,\n        toggleIcon: 'glyphicon glyphicon-cog',\n        expandAnimation: 100,\n        collapseAnimation: 100,\n        state: 'pinned', // Initial state of the panel. Available options: pinned, unpinned, collapsed, minimized, fullscreen\n        initialIndex: null, // Initial index of the panel among its siblings\n        stateful: false, // If you set this to true you must specify data-inner-id. Plugin will save (in localStorage) it's states such as\n                         // pinned, unpinned, collapsed, minimized, fullscreen, position among it's siblings\n                         // and apply them when you reload the browser\n        constrain: 'document', // 'parent', 'document', 'window'\n        unpin: {\n            icon: 'glyphicon glyphicon-move', //You can user glyphicons if you do not want to use font-awesome\n            tooltip: 'Unpin'               //tooltip text, If you want to disable tooltip, set it to false\n        },\n        reload: {\n            icon: 'glyphicon glyphicon-refresh', //You can user glyphicons if you do not want to use font-awesome\n            tooltip: 'Reload'           //tooltip text, If you want to disable tooltip, set it to false\n        },\n        minimize: {\n            icon: 'glyphicon glyphicon-minus', //icon is shown when panel is not minimized\n            icon2: 'glyphicon glyphicon-plus', //icon2 is shown when panel is minimized\n            tooltip: 'Minimize'         //tooltip text, If you want to disable tooltip, set it to false\n        },\n        expand: {\n            icon: 'glyphicon glyphicon-resize-full', //icon is shown when panel is not on full screen\n            icon2: 'glyphicon glyphicon-resize-small', //icon2 is shown when pane is on full screen state\n            tooltip: 'Fullscreen'       //tooltip text, If you want to disable tooltip, set it to false\n        },\n        changeStyle: {\n            icon: 'glyphicon glyphicon-th', //icon is shown when panel is not on full screen\n            tooltip: 'Style'       //tooltip text, If you want to disable tooltip, set it to false\n        },\n        close: {\n            icon: 'glyphicon glyphicon-remove', //You can user glyphicons if you do not want to use font-awesome\n            tooltip: 'Close'            //tooltip text, If you want to disable tooltip, set it to false\n        },\n        editTitle: {\n            icon: 'glyphicon glyphicon-pencil',\n            icon2: 'glyphicon glyphicon-floppy-disk',\n            tooltip: 'Edit title'\n        },\n        styles: [\n            {\n                bg: '#d9534f',\n                text: '#FFF'\n            },\n            {\n                bg: '#f0ad4e',\n                text: '#FFF'\n            },\n            {\n                bg: '#337ab7',\n                text: '#FFF'\n            },\n            {\n                bg: '#5bc0de',\n                text: '#FFF'\n            },\n            {\n                bg: '#4753e4',\n                text: '#FFF'\n            },\n            {\n                bg: '#9e4aea',\n                text: '#FFF'\n            }\n        ],\n        storageObject: null,\n\n        // Events\n        /**\n         * @event beforeTitleChange\n         * Fires before title change happens. Returning false will prevent title change from happening.\n         * @param {LobiPanel} The <code>LobiPanel</code> instance\n         */\n        beforeTitleChange: null\n    };\n\n    $('.lobipanel').lobiPanel();\n\n    var $parent = $('.lobipanel-parent-sortable');\n    $parent.lobiPanelParent();\n});\n\n"
  },
  {
    "path": "less/loading-animation.less",
    "content": ".spinner-wrapper{\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background-color: rgba(255, 255, 255, 0.5);\n}\n.spinner-windows8{\n    position: relative;\n    display: block;\n    margin: 0 auto;\n    width: 50px;\n    height:50px;\n    margin-top: 100px;\n    .wBall {\n        position: absolute;\n        width: 48px;\n        height: 48px;\n        opacity: 0;\n        -moz-transform: rotate(225deg);\n        -moz-animation: orbit 2.75s infinite;\n        -webkit-transform: rotate(225deg);\n        -webkit-animation: orbit 2.75s infinite;\n        -ms-transform: rotate(225deg);\n        -ms-animation: orbit 2.75s infinite;\n        -o-transform: rotate(225deg);\n        -o-animation: orbit 2.75s infinite;\n        transform: rotate(225deg);\n        animation: orbit 2.75s infinite;\n        .wInnerBall{\n            position: absolute;\n            width: 6px;\n            height: 6px;\n            background: #000000;\n            left:0px;\n            top:0px;\n            -moz-border-radius: 6px;\n            -webkit-border-radius: 6px;\n            -ms-border-radius: 6px;\n            -o-border-radius: 6px;\n            border-radius: 6px;\n            z-index: 2;\n        }\n        &:first-child {\n            -moz-animation-delay: 0.6s;\n            -webkit-animation-delay: 0.6s;\n            -ms-animation-delay: 0.6s;\n            -o-animation-delay: 0.6s;\n            animation-delay: 0.6s;\n        }\n        &:nth-child(2) {\n            -moz-animation-delay: 0.12s;\n            -webkit-animation-delay: 0.12s;\n            -ms-animation-delay: 0.12s;\n            -o-animation-delay: 0.12s;\n            animation-delay: 0.12s;\n        }\n        &:nth-child(3) {\n            -moz-animation-delay: 0.24s;\n            -webkit-animation-delay: 0.24s;\n            -ms-animation-delay: 0.24s;\n            -o-animation-delay: 0.24s;\n            animation-delay: 0.24s;\n        }\n        &:nth-child(4) {\n            -moz-animation-delay: 0.36s;\n            -webkit-animation-delay: 0.36s;\n            -ms-animation-delay: 0.36s;\n            -o-animation-delay: 0.36s;\n            animation-delay: 0.36s;\n        }\n        &:nth-child(5) {\n            -moz-animation-delay: 0.48s;\n            -webkit-animation-delay: 0.48s;\n            -ms-animation-delay: 0.48s;\n            -o-animation-delay: 0.48s;\n            animation-delay: 0.48s;\n        }\n    }\n}\n\n@-moz-keyframes orbit {\n    0% {\n        opacity: 1;\n        z-index:99;\n        -moz-transform: rotate(180deg);\n        -moz-animation-timing-function: ease-out;\n    }\n\n    7% {\n        opacity: 1;\n        -moz-transform: rotate(300deg);\n        -moz-animation-timing-function: linear;\n        -moz-origin:0%;\n    }\n\n    30% {\n        opacity: 1;\n        -moz-transform:rotate(410deg);\n        -moz-animation-timing-function: ease-in-out;\n        -moz-origin:7%;\n    }\n\n    39% {\n        opacity: 1;\n        -moz-transform: rotate(645deg);\n        -moz-animation-timing-function: linear;\n        -moz-origin:30%;\n    }\n\n    70% {\n        opacity: 1;\n        -moz-transform: rotate(770deg);\n        -moz-animation-timing-function: ease-out;\n        -moz-origin:39%;\n    }\n\n    75% {\n        opacity: 1;\n        -moz-transform: rotate(900deg);\n        -moz-animation-timing-function: ease-out;\n        -moz-origin:70%;\n    }\n\n    76% {\n        opacity: 0;\n        -moz-transform:rotate(900deg);\n    }\n\n    100% {\n        opacity: 0;\n        -moz-transform: rotate(900deg);\n    }\n\n}\n\n@-webkit-keyframes orbit {\n    0% {\n        opacity: 1;\n        z-index:99;\n        -webkit-transform: rotate(180deg);\n        -webkit-animation-timing-function: ease-out;\n    }\n\n    7% {\n        opacity: 1;\n        -webkit-transform: rotate(300deg);\n        -webkit-animation-timing-function: linear;\n        -webkit-origin:0%;\n    }\n\n    30% {\n        opacity: 1;\n        -webkit-transform:rotate(410deg);\n        -webkit-animation-timing-function: ease-in-out;\n        -webkit-origin:7%;\n    }\n\n    39% {\n        opacity: 1;\n        -webkit-transform: rotate(645deg);\n        -webkit-animation-timing-function: linear;\n        -webkit-origin:30%;\n    }\n\n    70% {\n        opacity: 1;\n        -webkit-transform: rotate(770deg);\n        -webkit-animation-timing-function: ease-out;\n        -webkit-origin:39%;\n    }\n\n    75% {\n        opacity: 1;\n        -webkit-transform: rotate(900deg);\n        -webkit-animation-timing-function: ease-out;\n        -webkit-origin:70%;\n    }\n\n    76% {\n        opacity: 0;\n        -webkit-transform:rotate(900deg);\n    }\n\n    100% {\n        opacity: 0;\n        -webkit-transform: rotate(900deg);\n    }\n\n}\n\n@-ms-keyframes orbit {\n    0% {\n        opacity: 1;\n        z-index:99;\n        -ms-transform: rotate(180deg);\n        -ms-animation-timing-function: ease-out;\n    }\n\n    7% {\n        opacity: 1;\n        -ms-transform: rotate(300deg);\n        -ms-animation-timing-function: linear;\n        -ms-origin:0%;\n    }\n\n    30% {\n        opacity: 1;\n        -ms-transform:rotate(410deg);\n        -ms-animation-timing-function: ease-in-out;\n        -ms-origin:7%;\n    }\n\n    39% {\n        opacity: 1;\n        -ms-transform: rotate(645deg);\n        -ms-animation-timing-function: linear;\n        -ms-origin:30%;\n    }\n\n    70% {\n        opacity: 1;\n        -ms-transform: rotate(770deg);\n        -ms-animation-timing-function: ease-out;\n        -ms-origin:39%;\n    }\n\n    75% {\n        opacity: 1;\n        -ms-transform: rotate(900deg);\n        -ms-animation-timing-function: ease-out;\n        -ms-origin:70%;\n    }\n\n    76% {\n        opacity: 0;\n        -ms-transform:rotate(900deg);\n    }\n\n    100% {\n        opacity: 0;\n        -ms-transform: rotate(900deg);\n    }\n\n}\n\n@-o-keyframes orbit {\n    0% {\n        opacity: 1;\n        z-index:99;\n        -o-transform: rotate(180deg);\n        -o-animation-timing-function: ease-out;\n    }\n\n    7% {\n        opacity: 1;\n        -o-transform: rotate(300deg);\n        -o-animation-timing-function: linear;\n        -o-origin:0%;\n    }\n\n    30% {\n        opacity: 1;\n        -o-transform:rotate(410deg);\n        -o-animation-timing-function: ease-in-out;\n        -o-origin:7%;\n    }\n\n    39% {\n        opacity: 1;\n        -o-transform: rotate(645deg);\n        -o-animation-timing-function: linear;\n        -o-origin:30%;\n    }\n\n    70% {\n        opacity: 1;\n        -o-transform: rotate(770deg);\n        -o-animation-timing-function: ease-out;\n        -o-origin:39%;\n    }\n\n    75% {\n        opacity: 1;\n        -o-transform: rotate(900deg);\n        -o-animation-timing-function: ease-out;\n        -o-origin:70%;\n    }\n\n    76% {\n        opacity: 0;\n        -o-transform:rotate(900deg);\n    }\n\n    100% {\n        opacity: 0;\n        -o-transform: rotate(900deg);\n    }\n\n}\n\n@keyframes orbit {\n    0% {\n        opacity: 1;\n        z-index:99;\n        transform: rotate(180deg);\n        animation-timing-function: ease-out;\n    }\n\n    7% {\n        opacity: 1;\n        transform: rotate(300deg);\n        animation-timing-function: linear;\n        origin:0%;\n    }\n\n    30% {\n        opacity: 1;\n        transform:rotate(410deg);\n        animation-timing-function: ease-in-out;\n        origin:7%;\n    }\n\n    39% {\n        opacity: 1;\n        transform: rotate(645deg);\n        animation-timing-function: linear;\n        origin:30%;\n    }\n\n    70% {\n        opacity: 1;\n        transform: rotate(770deg);\n        animation-timing-function: ease-out;\n        origin:39%;\n    }\n\n    75% {\n        opacity: 1;\n        transform: rotate(900deg);\n        animation-timing-function: ease-out;\n        origin:70%;\n    }\n\n    76% {\n        opacity: 0;\n        transform:rotate(900deg);\n    }\n\n    100% {\n        opacity: 0;\n        transform: rotate(900deg);\n    }\n\n}"
  },
  {
    "path": "less/lobipanel.less",
    "content": "\n@import \"../bower_components/bootstrap/less/variables.less\";\n@import \"../bower_components/bootstrap/less/mixins.less\";\n\n@import \"variables.less\";\n@import \"loading-animation.less\";\n@import \"main.less\";"
  },
  {
    "path": "less/main.less",
    "content": ".tooltip {\n    z-index: 20000;\n}\n\nbody.lobipanel-minimized {\n    padding-bottom: @lobipanel-toolbar-height;\n}\n\n.lobipanel {\n    position: relative;\n    margin-bottom: @lobipanel-panel-margin-bottom;\n    > .panel-heading {\n        padding: 5px;\n        position: relative;\n        .border-top-radius(0px);\n        > .panel-title {\n            float: left;\n            max-width: calc(%(~\"100% - %a\", @lobipanel-panel-control-width));\n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            font-size: @lobipanel-panel-title-font-size;\n            line-height: @lobipanel-panel-title-line-height;\n            padding-left: @lobipanel-panel-title-padding-horizontal;\n            h1, h2, h3, h4, h5, h6 {\n                margin: 0;\n                line-height: @lobipanel-panel-title-line-height;\n            }\n            input {\n                color: inherit;\n                line-height: @lobipanel-panel-title-line-height;\n                border-radius: 2px;\n                padding: 0 5px;\n                width: 100%;\n                background-color: rgba(0, 0, 0, 0.2);\n                border: 1px solid transparent;\n                outline: 0;\n                &:focus {\n                    background-color: rgba(0, 0, 0, 0.15);\n                }\n            }\n        }\n        .dropdown {\n            display: inline-block;\n            float: right;\n            position: relative;\n            .dropdown-menu {\n                left: auto;\n                right: 0;\n                min-width: 0;\n                margin-top: 0;\n                border-radius: 0;\n                > li > a {\n                    .control-title {\n                        display: inline-block;\n                        margin-left: 15px;\n                    }\n                }\n                .style-change-item {\n                position: relative;\n                .style-list {\n                    position: absolute;\n                    background: #f5f5f5;\n                    box-shadow: 2px 2px 12px rgba(0, 0, 0, 0.3);\n                    padding: @lobipanel-style-change-list-padding;\n                    display: none;\n                    width: @lobipanel-style-change-item-count-in-a-row * @lobipanel-style-change-item-size\n                            + (@lobipanel-style-change-item-count-in-a-row * 2) * @lobipanel-style-change-item-margin\n                            + @lobipanel-style-change-list-padding * 2;\n                    top: 100%;\n                    right: 0;\n                    z-index: 2;\n                    .style-item{\n                        cursor: pointer;\n                        display: inline-block;\n                        width: @lobipanel-style-change-item-size;\n                        height: @lobipanel-style-change-item-size;\n                        margin: @lobipanel-style-change-item-margin;\n                        border: 2px solid #f5f5f5;\n                        &:hover{\n                            border-color: #FFF;\n                        }\n\n                        &:active{\n                            box-shadow: inset 2px 2px 10px rgba(0, 0, 0, 0.3);\n                        }\n                    }\n                    &.opened{\n                        display: block;\n                    }\n                }\n            }\n            }\n            .dropdown-toggle {\n                border: none;\n                outline: 0;\n                background-color: transparent;\n                text-align: center;\n                padding: 0;\n                width: @lobipanel-panel-control-width;\n                font-size: @lobipanel-panel-control-font-size;\n                .transition(all @lobipanel-transition-duration);\n                .panel-control-icon {\n                    top: 0;\n                    line-height: @lobipanel-panel-title-line-height;\n                }\n                &:hover,\n                &:hover:focus {\n                    text-shadow: @lobipanel-panel-control-hover-text-shadow;\n                    background-color: @lobipanel-panel-control-hover-bg;\n                }\n            }\n            &.open {\n                .dropdown-toggle {\n                    text-shadow: @lobipanel-panel-control-hover-text-shadow;\n                    background-color: @lobipanel-panel-control-hover-bg;\n                }\n            }\n        }\n        .clearfix();\n    }\n    @media screen and (min-width: @screen-sm-min) {\n        .panel-heading {\n            .panel-title {\n                max-width: calc(%(~\"100% - %a\", @lobipanel-panel-control-width * 6));\n            }\n            .lobipanel-dropdown-screen-lg();\n        }\n    }\n    > .panel-body {\n        overflow: auto;\n        position: relative;\n    }\n    .panel-loader {\n        position: absolute;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        background-color: #fff;\n        opacity: 0.8;\n    }\n    &.panel-collapsed {\n        > .panel-heading {\n            border-bottom: none;\n            .dropdown {\n                .dropdown-menu {\n                    > li {\n                        > a {\n                            &[data-func=\"unpin\"],\n                            &[data-func=\"reload\"] {\n                                display: none;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    &.panel-expanded,\n    &.panel-unpin,\n    &.panel-minimized.panel-unpin {\n        margin-bottom: 0;\n    }\n    &.panel-unpin {\n        overflow: hidden;\n        position: absolute;\n        z-index: @lobipanel-basic-z-index;\n        .box-shadow(@lobipanel-panel-unpin-box-shadow);\n        > .panel-heading {\n            cursor: move;\n        }\n        &.panel-minimized {\n            float: left;\n            position: static;\n            border-radius: 0;\n            .box-shadow(none);\n            min-width: @lobipanel-panel-minimized-min-width;\n            margin-right: @lobipanel-panel-minimized-margin-right;\n            > .panel-heading {\n                padding: 0;\n                cursor: pointer;\n                border-bottom: none;\n                .panel-title {\n                    max-width: calc(%(~\"100% - %a\", @lobipanel-panel-control-width * 2));\n                    h1, h2, h3, h4, h5, h6 {\n                        overflow: hidden;\n                        text-overflow: ellipsis;\n                    }\n                }\n                .lobipanel-dropdown-screen-lg();\n                .dropdown {\n                    .dropdown-menu {\n                        > li {\n                            > a {\n                                display: none;\n                                &[data-func=\"close\"],\n                                &[data-func=\"expand\"] {\n                                    display: inline-block;\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n            > .panel-body,\n            > .panel-footer {\n                display: none !important;\n            }\n        }\n    }\n    &.panel-expanded {\n        > .panel-heading {\n            cursor: default;\n            .dropdown {\n                .dropdown-menu {\n                    > li {\n                        > a {\n                            &[data-func=\"unpin\"],\n                            &[data-func=\"minimize\"] {\n                                display: none;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        &.panel-unpin {\n            > .panel-heading {\n                .panel-control[data-func=\"minimize\"] {\n                    display: block;\n                }\n            }\n        }\n    }\n}\n\n.lobipanel-minimized-toolbar {\n    position: fixed;\n    height: @lobipanel-toolbar-height;\n    padding: @lobipanel-toolbar-padding;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    z-index: 20000;\n    background: @lobipanel-toolbar-bg;\n}\n\n.lobipanel-placeholder {\n    background-color: #f9f5d1;\n    border: 1px dashed #919191;\n    margin-bottom: @lobipanel-panel-margin-bottom;\n}\n\n.lobipanel-dropdown-screen-lg() {\n    .dropdown {\n        .dropdown-menu {\n            position: static;\n            display: inline-block;\n            border: none;\n            padding: 0;\n            margin: 0;\n            min-width: 0;\n            width: auto;\n            .box-shadow(none);\n            background: transparent;\n            > li {\n                display: inline-block;\n                > a {\n                    cursor: pointer;\n                    color: inherit;\n                    padding: 0;\n                    outline: 0;\n                    text-align: center;\n                    width: @lobipanel-panel-control-width;\n                    font-size: @lobipanel-panel-control-font-size;\n                    .transition(all @lobipanel-transition-duration);\n                    .panel-control-icon {\n                        top: 0;\n                        line-height: @lobipanel-panel-title-line-height;\n                    }\n                    .control-title {\n                        display: none;\n                    }\n                    &:hover, &:focus:hover {\n                        text-shadow: @lobipanel-panel-control-hover-text-shadow;\n                        background-color: @lobipanel-panel-control-hover-bg;\n                    }\n                    &:focus {\n                        text-shadow: none;\n                        background-color: transparent;\n                    }\n                }\n            }\n        }\n        .dropdown-toggle {\n            display: none;\n        }\n    }\n}\n\n.lobipanel-parent-sortable {\n    min-height: 20px;\n}"
  },
  {
    "path": "less/variables.less",
    "content": "\n@lobipanel-basic-z-index                    : 10000;\n@lobipanel-panel-title-padding-horizontal   : 15px;\n@lobipanel-panel-title-font-size            : 16px;\n@lobipanel-panel-title-line-height          : 30px;\n@lobipanel-panel-margin-bottom              : 15px;\n@lobipanel-transition-duration              : 0.2s;\n@lobipanel-panel-control-font-size          : 14px;\n@lobipanel-panel-control-width              : 30px;\n@lobipanel-panel-control-border-left        : 1px solid rgba(0, 0, 0, 0.05);\n@lobipanel-panel-control-hover-bg           : rgba(0, 0, 0, 0.15);\n@lobipanel-panel-control-hover-text-shadow  : 2px 2px 5px rgba(0, 0, 0, 0.6);\n@lobipanel-panel-unpin-box-shadow           : 2px 2px 15px 5px rgba(10, 10, 10, 0.5);\n@lobipanel-panel-minimized-min-width        : 170px;\n@lobipanel-panel-minimized-margin-right     : 5px;\n@lobipanel-toolbar-height                   : 36px;\n@lobipanel-toolbar-padding                  : 2px;\n@lobipanel-toolbar-bg                       : rgba(34, 115, 182, 0.51);\n\n@lobipanel-resize-width                     : 10px;\n@lobipanel-resize-height                    : @lobipanel-resize-width;\n@lobipanel-resize-offset                    : -@lobipanel-resize-width/2;\n\n@lobipanel-style-change-list-padding:       4px;\n@lobipanel-style-change-item-size:          24px;\n@lobipanel-style-change-item-margin:        2px;\n@lobipanel-style-change-item-count-in-a-row:3;\n"
  },
  {
    "path": "lib/font-awesome/css/font-awesome.css",
    "content": "/*!\n *  Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n/* FONT PATH\n * -------------------------- */\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('../fonts/fontawesome-webfont.eot?v=4.4.0');\n  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n.fa {\n  display: inline-block;\n  font: normal normal normal 14px/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n  font-size: 1.33333333em;\n  line-height: 0.75em;\n  vertical-align: -15%;\n}\n.fa-2x {\n  font-size: 2em;\n}\n.fa-3x {\n  font-size: 3em;\n}\n.fa-4x {\n  font-size: 4em;\n}\n.fa-5x {\n  font-size: 5em;\n}\n.fa-fw {\n  width: 1.28571429em;\n  text-align: center;\n}\n.fa-ul {\n  padding-left: 0;\n  margin-left: 2.14285714em;\n  list-style-type: none;\n}\n.fa-ul > li {\n  position: relative;\n}\n.fa-li {\n  position: absolute;\n  left: -2.14285714em;\n  width: 2.14285714em;\n  top: 0.14285714em;\n  text-align: center;\n}\n.fa-li.fa-lg {\n  left: -1.85714286em;\n}\n.fa-border {\n  padding: .2em .25em .15em;\n  border: solid 0.08em #eeeeee;\n  border-radius: .1em;\n}\n.fa-pull-left {\n  float: left;\n}\n.fa-pull-right {\n  float: right;\n}\n.fa.fa-pull-left {\n  margin-right: .3em;\n}\n.fa.fa-pull-right {\n  margin-left: .3em;\n}\n/* Deprecated as of 4.4.0 */\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n.fa.pull-left {\n  margin-right: .3em;\n}\n.fa.pull-right {\n  margin-left: .3em;\n}\n.fa-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n  animation: fa-spin 2s infinite linear;\n}\n.fa-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n  animation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n.fa-rotate-90 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg);\n}\n.fa-rotate-180 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n  -webkit-transform: rotate(180deg);\n  -ms-transform: rotate(180deg);\n  transform: rotate(180deg);\n}\n.fa-rotate-270 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\n  -webkit-transform: rotate(270deg);\n  -ms-transform: rotate(270deg);\n  transform: rotate(270deg);\n}\n.fa-flip-horizontal {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);\n  -webkit-transform: scale(-1, 1);\n  -ms-transform: scale(-1, 1);\n  transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n  -webkit-transform: scale(1, -1);\n  -ms-transform: scale(1, -1);\n  transform: scale(1, -1);\n}\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n  filter: none;\n}\n.fa-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.fa-stack-1x,\n.fa-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.fa-stack-1x {\n  line-height: inherit;\n}\n.fa-stack-2x {\n  font-size: 2em;\n}\n.fa-inverse {\n  color: #ffffff;\n}\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n.fa-glass:before {\n  content: \"\\f000\";\n}\n.fa-music:before {\n  content: \"\\f001\";\n}\n.fa-search:before {\n  content: \"\\f002\";\n}\n.fa-envelope-o:before {\n  content: \"\\f003\";\n}\n.fa-heart:before {\n  content: \"\\f004\";\n}\n.fa-star:before {\n  content: \"\\f005\";\n}\n.fa-star-o:before {\n  content: \"\\f006\";\n}\n.fa-user:before {\n  content: \"\\f007\";\n}\n.fa-film:before {\n  content: \"\\f008\";\n}\n.fa-th-large:before {\n  content: \"\\f009\";\n}\n.fa-th:before {\n  content: \"\\f00a\";\n}\n.fa-th-list:before {\n  content: \"\\f00b\";\n}\n.fa-check:before {\n  content: \"\\f00c\";\n}\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n  content: \"\\f00d\";\n}\n.fa-search-plus:before {\n  content: \"\\f00e\";\n}\n.fa-search-minus:before {\n  content: \"\\f010\";\n}\n.fa-power-off:before {\n  content: \"\\f011\";\n}\n.fa-signal:before {\n  content: \"\\f012\";\n}\n.fa-gear:before,\n.fa-cog:before {\n  content: \"\\f013\";\n}\n.fa-trash-o:before {\n  content: \"\\f014\";\n}\n.fa-home:before {\n  content: \"\\f015\";\n}\n.fa-file-o:before {\n  content: \"\\f016\";\n}\n.fa-clock-o:before {\n  content: \"\\f017\";\n}\n.fa-road:before {\n  content: \"\\f018\";\n}\n.fa-download:before {\n  content: \"\\f019\";\n}\n.fa-arrow-circle-o-down:before {\n  content: \"\\f01a\";\n}\n.fa-arrow-circle-o-up:before {\n  content: \"\\f01b\";\n}\n.fa-inbox:before {\n  content: \"\\f01c\";\n}\n.fa-play-circle-o:before {\n  content: \"\\f01d\";\n}\n.fa-rotate-right:before,\n.fa-repeat:before {\n  content: \"\\f01e\";\n}\n.fa-refresh:before {\n  content: \"\\f021\";\n}\n.fa-list-alt:before {\n  content: \"\\f022\";\n}\n.fa-lock:before {\n  content: \"\\f023\";\n}\n.fa-flag:before {\n  content: \"\\f024\";\n}\n.fa-headphones:before {\n  content: \"\\f025\";\n}\n.fa-volume-off:before {\n  content: \"\\f026\";\n}\n.fa-volume-down:before {\n  content: \"\\f027\";\n}\n.fa-volume-up:before {\n  content: \"\\f028\";\n}\n.fa-qrcode:before {\n  content: \"\\f029\";\n}\n.fa-barcode:before {\n  content: \"\\f02a\";\n}\n.fa-tag:before {\n  content: \"\\f02b\";\n}\n.fa-tags:before {\n  content: \"\\f02c\";\n}\n.fa-book:before {\n  content: \"\\f02d\";\n}\n.fa-bookmark:before {\n  content: \"\\f02e\";\n}\n.fa-print:before {\n  content: \"\\f02f\";\n}\n.fa-camera:before {\n  content: \"\\f030\";\n}\n.fa-font:before {\n  content: \"\\f031\";\n}\n.fa-bold:before {\n  content: \"\\f032\";\n}\n.fa-italic:before {\n  content: \"\\f033\";\n}\n.fa-text-height:before {\n  content: \"\\f034\";\n}\n.fa-text-width:before {\n  content: \"\\f035\";\n}\n.fa-align-left:before {\n  content: \"\\f036\";\n}\n.fa-align-center:before {\n  content: \"\\f037\";\n}\n.fa-align-right:before {\n  content: \"\\f038\";\n}\n.fa-align-justify:before {\n  content: \"\\f039\";\n}\n.fa-list:before {\n  content: \"\\f03a\";\n}\n.fa-dedent:before,\n.fa-outdent:before {\n  content: \"\\f03b\";\n}\n.fa-indent:before {\n  content: \"\\f03c\";\n}\n.fa-video-camera:before {\n  content: \"\\f03d\";\n}\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n  content: \"\\f03e\";\n}\n.fa-pencil:before {\n  content: \"\\f040\";\n}\n.fa-map-marker:before {\n  content: \"\\f041\";\n}\n.fa-adjust:before {\n  content: \"\\f042\";\n}\n.fa-tint:before {\n  content: \"\\f043\";\n}\n.fa-edit:before,\n.fa-pencil-square-o:before {\n  content: \"\\f044\";\n}\n.fa-share-square-o:before {\n  content: \"\\f045\";\n}\n.fa-check-square-o:before {\n  content: \"\\f046\";\n}\n.fa-arrows:before {\n  content: \"\\f047\";\n}\n.fa-step-backward:before {\n  content: \"\\f048\";\n}\n.fa-fast-backward:before {\n  content: \"\\f049\";\n}\n.fa-backward:before {\n  content: \"\\f04a\";\n}\n.fa-play:before {\n  content: \"\\f04b\";\n}\n.fa-pause:before {\n  content: \"\\f04c\";\n}\n.fa-stop:before {\n  content: \"\\f04d\";\n}\n.fa-forward:before {\n  content: \"\\f04e\";\n}\n.fa-fast-forward:before {\n  content: \"\\f050\";\n}\n.fa-step-forward:before {\n  content: \"\\f051\";\n}\n.fa-eject:before {\n  content: \"\\f052\";\n}\n.fa-chevron-left:before {\n  content: \"\\f053\";\n}\n.fa-chevron-right:before {\n  content: \"\\f054\";\n}\n.fa-plus-circle:before {\n  content: \"\\f055\";\n}\n.fa-minus-circle:before {\n  content: \"\\f056\";\n}\n.fa-times-circle:before {\n  content: \"\\f057\";\n}\n.fa-check-circle:before {\n  content: \"\\f058\";\n}\n.fa-question-circle:before {\n  content: \"\\f059\";\n}\n.fa-info-circle:before {\n  content: \"\\f05a\";\n}\n.fa-crosshairs:before {\n  content: \"\\f05b\";\n}\n.fa-times-circle-o:before {\n  content: \"\\f05c\";\n}\n.fa-check-circle-o:before {\n  content: \"\\f05d\";\n}\n.fa-ban:before {\n  content: \"\\f05e\";\n}\n.fa-arrow-left:before {\n  content: \"\\f060\";\n}\n.fa-arrow-right:before {\n  content: \"\\f061\";\n}\n.fa-arrow-up:before {\n  content: \"\\f062\";\n}\n.fa-arrow-down:before {\n  content: \"\\f063\";\n}\n.fa-mail-forward:before,\n.fa-share:before {\n  content: \"\\f064\";\n}\n.fa-expand:before {\n  content: \"\\f065\";\n}\n.fa-compress:before {\n  content: \"\\f066\";\n}\n.fa-plus:before {\n  content: \"\\f067\";\n}\n.fa-minus:before {\n  content: \"\\f068\";\n}\n.fa-asterisk:before {\n  content: \"\\f069\";\n}\n.fa-exclamation-circle:before {\n  content: \"\\f06a\";\n}\n.fa-gift:before {\n  content: \"\\f06b\";\n}\n.fa-leaf:before {\n  content: \"\\f06c\";\n}\n.fa-fire:before {\n  content: \"\\f06d\";\n}\n.fa-eye:before {\n  content: \"\\f06e\";\n}\n.fa-eye-slash:before {\n  content: \"\\f070\";\n}\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n  content: \"\\f071\";\n}\n.fa-plane:before {\n  content: \"\\f072\";\n}\n.fa-calendar:before {\n  content: \"\\f073\";\n}\n.fa-random:before {\n  content: \"\\f074\";\n}\n.fa-comment:before {\n  content: \"\\f075\";\n}\n.fa-magnet:before {\n  content: \"\\f076\";\n}\n.fa-chevron-up:before {\n  content: \"\\f077\";\n}\n.fa-chevron-down:before {\n  content: \"\\f078\";\n}\n.fa-retweet:before {\n  content: \"\\f079\";\n}\n.fa-shopping-cart:before {\n  content: \"\\f07a\";\n}\n.fa-folder:before {\n  content: \"\\f07b\";\n}\n.fa-folder-open:before {\n  content: \"\\f07c\";\n}\n.fa-arrows-v:before {\n  content: \"\\f07d\";\n}\n.fa-arrows-h:before {\n  content: \"\\f07e\";\n}\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n  content: \"\\f080\";\n}\n.fa-twitter-square:before {\n  content: \"\\f081\";\n}\n.fa-facebook-square:before {\n  content: \"\\f082\";\n}\n.fa-camera-retro:before {\n  content: \"\\f083\";\n}\n.fa-key:before {\n  content: \"\\f084\";\n}\n.fa-gears:before,\n.fa-cogs:before {\n  content: \"\\f085\";\n}\n.fa-comments:before {\n  content: \"\\f086\";\n}\n.fa-thumbs-o-up:before {\n  content: \"\\f087\";\n}\n.fa-thumbs-o-down:before {\n  content: \"\\f088\";\n}\n.fa-star-half:before {\n  content: \"\\f089\";\n}\n.fa-heart-o:before {\n  content: \"\\f08a\";\n}\n.fa-sign-out:before {\n  content: \"\\f08b\";\n}\n.fa-linkedin-square:before {\n  content: \"\\f08c\";\n}\n.fa-thumb-tack:before {\n  content: \"\\f08d\";\n}\n.fa-external-link:before {\n  content: \"\\f08e\";\n}\n.fa-sign-in:before {\n  content: \"\\f090\";\n}\n.fa-trophy:before {\n  content: \"\\f091\";\n}\n.fa-github-square:before {\n  content: \"\\f092\";\n}\n.fa-upload:before {\n  content: \"\\f093\";\n}\n.fa-lemon-o:before {\n  content: \"\\f094\";\n}\n.fa-phone:before {\n  content: \"\\f095\";\n}\n.fa-square-o:before {\n  content: \"\\f096\";\n}\n.fa-bookmark-o:before {\n  content: \"\\f097\";\n}\n.fa-phone-square:before {\n  content: \"\\f098\";\n}\n.fa-twitter:before {\n  content: \"\\f099\";\n}\n.fa-facebook-f:before,\n.fa-facebook:before {\n  content: \"\\f09a\";\n}\n.fa-github:before {\n  content: \"\\f09b\";\n}\n.fa-unlock:before {\n  content: \"\\f09c\";\n}\n.fa-credit-card:before {\n  content: \"\\f09d\";\n}\n.fa-feed:before,\n.fa-rss:before {\n  content: \"\\f09e\";\n}\n.fa-hdd-o:before {\n  content: \"\\f0a0\";\n}\n.fa-bullhorn:before {\n  content: \"\\f0a1\";\n}\n.fa-bell:before {\n  content: \"\\f0f3\";\n}\n.fa-certificate:before {\n  content: \"\\f0a3\";\n}\n.fa-hand-o-right:before {\n  content: \"\\f0a4\";\n}\n.fa-hand-o-left:before {\n  content: \"\\f0a5\";\n}\n.fa-hand-o-up:before {\n  content: \"\\f0a6\";\n}\n.fa-hand-o-down:before {\n  content: \"\\f0a7\";\n}\n.fa-arrow-circle-left:before {\n  content: \"\\f0a8\";\n}\n.fa-arrow-circle-right:before {\n  content: \"\\f0a9\";\n}\n.fa-arrow-circle-up:before {\n  content: \"\\f0aa\";\n}\n.fa-arrow-circle-down:before {\n  content: \"\\f0ab\";\n}\n.fa-globe:before {\n  content: \"\\f0ac\";\n}\n.fa-wrench:before {\n  content: \"\\f0ad\";\n}\n.fa-tasks:before {\n  content: \"\\f0ae\";\n}\n.fa-filter:before {\n  content: \"\\f0b0\";\n}\n.fa-briefcase:before {\n  content: \"\\f0b1\";\n}\n.fa-arrows-alt:before {\n  content: \"\\f0b2\";\n}\n.fa-group:before,\n.fa-users:before {\n  content: \"\\f0c0\";\n}\n.fa-chain:before,\n.fa-link:before {\n  content: \"\\f0c1\";\n}\n.fa-cloud:before {\n  content: \"\\f0c2\";\n}\n.fa-flask:before {\n  content: \"\\f0c3\";\n}\n.fa-cut:before,\n.fa-scissors:before {\n  content: \"\\f0c4\";\n}\n.fa-copy:before,\n.fa-files-o:before {\n  content: \"\\f0c5\";\n}\n.fa-paperclip:before {\n  content: \"\\f0c6\";\n}\n.fa-save:before,\n.fa-floppy-o:before {\n  content: \"\\f0c7\";\n}\n.fa-square:before {\n  content: \"\\f0c8\";\n}\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n  content: \"\\f0c9\";\n}\n.fa-list-ul:before {\n  content: \"\\f0ca\";\n}\n.fa-list-ol:before {\n  content: \"\\f0cb\";\n}\n.fa-strikethrough:before {\n  content: \"\\f0cc\";\n}\n.fa-underline:before {\n  content: \"\\f0cd\";\n}\n.fa-table:before {\n  content: \"\\f0ce\";\n}\n.fa-magic:before {\n  content: \"\\f0d0\";\n}\n.fa-truck:before {\n  content: \"\\f0d1\";\n}\n.fa-pinterest:before {\n  content: \"\\f0d2\";\n}\n.fa-pinterest-square:before {\n  content: \"\\f0d3\";\n}\n.fa-google-plus-square:before {\n  content: \"\\f0d4\";\n}\n.fa-google-plus:before {\n  content: \"\\f0d5\";\n}\n.fa-money:before {\n  content: \"\\f0d6\";\n}\n.fa-caret-down:before {\n  content: \"\\f0d7\";\n}\n.fa-caret-up:before {\n  content: \"\\f0d8\";\n}\n.fa-caret-left:before {\n  content: \"\\f0d9\";\n}\n.fa-caret-right:before {\n  content: \"\\f0da\";\n}\n.fa-columns:before {\n  content: \"\\f0db\";\n}\n.fa-unsorted:before,\n.fa-sort:before {\n  content: \"\\f0dc\";\n}\n.fa-sort-down:before,\n.fa-sort-desc:before {\n  content: \"\\f0dd\";\n}\n.fa-sort-up:before,\n.fa-sort-asc:before {\n  content: \"\\f0de\";\n}\n.fa-envelope:before {\n  content: \"\\f0e0\";\n}\n.fa-linkedin:before {\n  content: \"\\f0e1\";\n}\n.fa-rotate-left:before,\n.fa-undo:before {\n  content: \"\\f0e2\";\n}\n.fa-legal:before,\n.fa-gavel:before {\n  content: \"\\f0e3\";\n}\n.fa-dashboard:before,\n.fa-tachometer:before {\n  content: \"\\f0e4\";\n}\n.fa-comment-o:before {\n  content: \"\\f0e5\";\n}\n.fa-comments-o:before {\n  content: \"\\f0e6\";\n}\n.fa-flash:before,\n.fa-bolt:before {\n  content: \"\\f0e7\";\n}\n.fa-sitemap:before {\n  content: \"\\f0e8\";\n}\n.fa-umbrella:before {\n  content: \"\\f0e9\";\n}\n.fa-paste:before,\n.fa-clipboard:before {\n  content: \"\\f0ea\";\n}\n.fa-lightbulb-o:before {\n  content: \"\\f0eb\";\n}\n.fa-exchange:before {\n  content: \"\\f0ec\";\n}\n.fa-cloud-download:before {\n  content: \"\\f0ed\";\n}\n.fa-cloud-upload:before {\n  content: \"\\f0ee\";\n}\n.fa-user-md:before {\n  content: \"\\f0f0\";\n}\n.fa-stethoscope:before {\n  content: \"\\f0f1\";\n}\n.fa-suitcase:before {\n  content: \"\\f0f2\";\n}\n.fa-bell-o:before {\n  content: \"\\f0a2\";\n}\n.fa-coffee:before {\n  content: \"\\f0f4\";\n}\n.fa-cutlery:before {\n  content: \"\\f0f5\";\n}\n.fa-file-text-o:before {\n  content: \"\\f0f6\";\n}\n.fa-building-o:before {\n  content: \"\\f0f7\";\n}\n.fa-hospital-o:before {\n  content: \"\\f0f8\";\n}\n.fa-ambulance:before {\n  content: \"\\f0f9\";\n}\n.fa-medkit:before {\n  content: \"\\f0fa\";\n}\n.fa-fighter-jet:before {\n  content: \"\\f0fb\";\n}\n.fa-beer:before {\n  content: \"\\f0fc\";\n}\n.fa-h-square:before {\n  content: \"\\f0fd\";\n}\n.fa-plus-square:before {\n  content: \"\\f0fe\";\n}\n.fa-angle-double-left:before {\n  content: \"\\f100\";\n}\n.fa-angle-double-right:before {\n  content: \"\\f101\";\n}\n.fa-angle-double-up:before {\n  content: \"\\f102\";\n}\n.fa-angle-double-down:before {\n  content: \"\\f103\";\n}\n.fa-angle-left:before {\n  content: \"\\f104\";\n}\n.fa-angle-right:before {\n  content: \"\\f105\";\n}\n.fa-angle-up:before {\n  content: \"\\f106\";\n}\n.fa-angle-down:before {\n  content: \"\\f107\";\n}\n.fa-desktop:before {\n  content: \"\\f108\";\n}\n.fa-laptop:before {\n  content: \"\\f109\";\n}\n.fa-tablet:before {\n  content: \"\\f10a\";\n}\n.fa-mobile-phone:before,\n.fa-mobile:before {\n  content: \"\\f10b\";\n}\n.fa-circle-o:before {\n  content: \"\\f10c\";\n}\n.fa-quote-left:before {\n  content: \"\\f10d\";\n}\n.fa-quote-right:before {\n  content: \"\\f10e\";\n}\n.fa-spinner:before {\n  content: \"\\f110\";\n}\n.fa-circle:before {\n  content: \"\\f111\";\n}\n.fa-mail-reply:before,\n.fa-reply:before {\n  content: \"\\f112\";\n}\n.fa-github-alt:before {\n  content: \"\\f113\";\n}\n.fa-folder-o:before {\n  content: \"\\f114\";\n}\n.fa-folder-open-o:before {\n  content: \"\\f115\";\n}\n.fa-smile-o:before {\n  content: \"\\f118\";\n}\n.fa-frown-o:before {\n  content: \"\\f119\";\n}\n.fa-meh-o:before {\n  content: \"\\f11a\";\n}\n.fa-gamepad:before {\n  content: \"\\f11b\";\n}\n.fa-keyboard-o:before {\n  content: \"\\f11c\";\n}\n.fa-flag-o:before {\n  content: \"\\f11d\";\n}\n.fa-flag-checkered:before {\n  content: \"\\f11e\";\n}\n.fa-terminal:before {\n  content: \"\\f120\";\n}\n.fa-code:before {\n  content: \"\\f121\";\n}\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n  content: \"\\f122\";\n}\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n  content: \"\\f123\";\n}\n.fa-location-arrow:before {\n  content: \"\\f124\";\n}\n.fa-crop:before {\n  content: \"\\f125\";\n}\n.fa-code-fork:before {\n  content: \"\\f126\";\n}\n.fa-unlink:before,\n.fa-chain-broken:before {\n  content: \"\\f127\";\n}\n.fa-question:before {\n  content: \"\\f128\";\n}\n.fa-info:before {\n  content: \"\\f129\";\n}\n.fa-exclamation:before {\n  content: \"\\f12a\";\n}\n.fa-superscript:before {\n  content: \"\\f12b\";\n}\n.fa-subscript:before {\n  content: \"\\f12c\";\n}\n.fa-eraser:before {\n  content: \"\\f12d\";\n}\n.fa-puzzle-piece:before {\n  content: \"\\f12e\";\n}\n.fa-microphone:before {\n  content: \"\\f130\";\n}\n.fa-microphone-slash:before {\n  content: \"\\f131\";\n}\n.fa-shield:before {\n  content: \"\\f132\";\n}\n.fa-calendar-o:before {\n  content: \"\\f133\";\n}\n.fa-fire-extinguisher:before {\n  content: \"\\f134\";\n}\n.fa-rocket:before {\n  content: \"\\f135\";\n}\n.fa-maxcdn:before {\n  content: \"\\f136\";\n}\n.fa-chevron-circle-left:before {\n  content: \"\\f137\";\n}\n.fa-chevron-circle-right:before {\n  content: \"\\f138\";\n}\n.fa-chevron-circle-up:before {\n  content: \"\\f139\";\n}\n.fa-chevron-circle-down:before {\n  content: \"\\f13a\";\n}\n.fa-html5:before {\n  content: \"\\f13b\";\n}\n.fa-css3:before {\n  content: \"\\f13c\";\n}\n.fa-anchor:before {\n  content: \"\\f13d\";\n}\n.fa-unlock-alt:before {\n  content: \"\\f13e\";\n}\n.fa-bullseye:before {\n  content: \"\\f140\";\n}\n.fa-ellipsis-h:before {\n  content: \"\\f141\";\n}\n.fa-ellipsis-v:before {\n  content: \"\\f142\";\n}\n.fa-rss-square:before {\n  content: \"\\f143\";\n}\n.fa-play-circle:before {\n  content: \"\\f144\";\n}\n.fa-ticket:before {\n  content: \"\\f145\";\n}\n.fa-minus-square:before {\n  content: \"\\f146\";\n}\n.fa-minus-square-o:before {\n  content: \"\\f147\";\n}\n.fa-level-up:before {\n  content: \"\\f148\";\n}\n.fa-level-down:before {\n  content: \"\\f149\";\n}\n.fa-check-square:before {\n  content: \"\\f14a\";\n}\n.fa-pencil-square:before {\n  content: \"\\f14b\";\n}\n.fa-external-link-square:before {\n  content: \"\\f14c\";\n}\n.fa-share-square:before {\n  content: \"\\f14d\";\n}\n.fa-compass:before {\n  content: \"\\f14e\";\n}\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n  content: \"\\f150\";\n}\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n  content: \"\\f151\";\n}\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n  content: \"\\f152\";\n}\n.fa-euro:before,\n.fa-eur:before {\n  content: \"\\f153\";\n}\n.fa-gbp:before {\n  content: \"\\f154\";\n}\n.fa-dollar:before,\n.fa-usd:before {\n  content: \"\\f155\";\n}\n.fa-rupee:before,\n.fa-inr:before {\n  content: \"\\f156\";\n}\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n  content: \"\\f157\";\n}\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n  content: \"\\f158\";\n}\n.fa-won:before,\n.fa-krw:before {\n  content: \"\\f159\";\n}\n.fa-bitcoin:before,\n.fa-btc:before {\n  content: \"\\f15a\";\n}\n.fa-file:before {\n  content: \"\\f15b\";\n}\n.fa-file-text:before {\n  content: \"\\f15c\";\n}\n.fa-sort-alpha-asc:before {\n  content: \"\\f15d\";\n}\n.fa-sort-alpha-desc:before {\n  content: \"\\f15e\";\n}\n.fa-sort-amount-asc:before {\n  content: \"\\f160\";\n}\n.fa-sort-amount-desc:before {\n  content: \"\\f161\";\n}\n.fa-sort-numeric-asc:before {\n  content: \"\\f162\";\n}\n.fa-sort-numeric-desc:before {\n  content: \"\\f163\";\n}\n.fa-thumbs-up:before {\n  content: \"\\f164\";\n}\n.fa-thumbs-down:before {\n  content: \"\\f165\";\n}\n.fa-youtube-square:before {\n  content: \"\\f166\";\n}\n.fa-youtube:before {\n  content: \"\\f167\";\n}\n.fa-xing:before {\n  content: \"\\f168\";\n}\n.fa-xing-square:before {\n  content: \"\\f169\";\n}\n.fa-youtube-play:before {\n  content: \"\\f16a\";\n}\n.fa-dropbox:before {\n  content: \"\\f16b\";\n}\n.fa-stack-overflow:before {\n  content: \"\\f16c\";\n}\n.fa-instagram:before {\n  content: \"\\f16d\";\n}\n.fa-flickr:before {\n  content: \"\\f16e\";\n}\n.fa-adn:before {\n  content: \"\\f170\";\n}\n.fa-bitbucket:before {\n  content: \"\\f171\";\n}\n.fa-bitbucket-square:before {\n  content: \"\\f172\";\n}\n.fa-tumblr:before {\n  content: \"\\f173\";\n}\n.fa-tumblr-square:before {\n  content: \"\\f174\";\n}\n.fa-long-arrow-down:before {\n  content: \"\\f175\";\n}\n.fa-long-arrow-up:before {\n  content: \"\\f176\";\n}\n.fa-long-arrow-left:before {\n  content: \"\\f177\";\n}\n.fa-long-arrow-right:before {\n  content: \"\\f178\";\n}\n.fa-apple:before {\n  content: \"\\f179\";\n}\n.fa-windows:before {\n  content: \"\\f17a\";\n}\n.fa-android:before {\n  content: \"\\f17b\";\n}\n.fa-linux:before {\n  content: \"\\f17c\";\n}\n.fa-dribbble:before {\n  content: \"\\f17d\";\n}\n.fa-skype:before {\n  content: \"\\f17e\";\n}\n.fa-foursquare:before {\n  content: \"\\f180\";\n}\n.fa-trello:before {\n  content: \"\\f181\";\n}\n.fa-female:before {\n  content: \"\\f182\";\n}\n.fa-male:before {\n  content: \"\\f183\";\n}\n.fa-gittip:before,\n.fa-gratipay:before {\n  content: \"\\f184\";\n}\n.fa-sun-o:before {\n  content: \"\\f185\";\n}\n.fa-moon-o:before {\n  content: \"\\f186\";\n}\n.fa-archive:before {\n  content: \"\\f187\";\n}\n.fa-bug:before {\n  content: \"\\f188\";\n}\n.fa-vk:before {\n  content: \"\\f189\";\n}\n.fa-weibo:before {\n  content: \"\\f18a\";\n}\n.fa-renren:before {\n  content: \"\\f18b\";\n}\n.fa-pagelines:before {\n  content: \"\\f18c\";\n}\n.fa-stack-exchange:before {\n  content: \"\\f18d\";\n}\n.fa-arrow-circle-o-right:before {\n  content: \"\\f18e\";\n}\n.fa-arrow-circle-o-left:before {\n  content: \"\\f190\";\n}\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n  content: \"\\f191\";\n}\n.fa-dot-circle-o:before {\n  content: \"\\f192\";\n}\n.fa-wheelchair:before {\n  content: \"\\f193\";\n}\n.fa-vimeo-square:before {\n  content: \"\\f194\";\n}\n.fa-turkish-lira:before,\n.fa-try:before {\n  content: \"\\f195\";\n}\n.fa-plus-square-o:before {\n  content: \"\\f196\";\n}\n.fa-space-shuttle:before {\n  content: \"\\f197\";\n}\n.fa-slack:before {\n  content: \"\\f198\";\n}\n.fa-envelope-square:before {\n  content: \"\\f199\";\n}\n.fa-wordpress:before {\n  content: \"\\f19a\";\n}\n.fa-openid:before {\n  content: \"\\f19b\";\n}\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n  content: \"\\f19c\";\n}\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n  content: \"\\f19d\";\n}\n.fa-yahoo:before {\n  content: \"\\f19e\";\n}\n.fa-google:before {\n  content: \"\\f1a0\";\n}\n.fa-reddit:before {\n  content: \"\\f1a1\";\n}\n.fa-reddit-square:before {\n  content: \"\\f1a2\";\n}\n.fa-stumbleupon-circle:before {\n  content: \"\\f1a3\";\n}\n.fa-stumbleupon:before {\n  content: \"\\f1a4\";\n}\n.fa-delicious:before {\n  content: \"\\f1a5\";\n}\n.fa-digg:before {\n  content: \"\\f1a6\";\n}\n.fa-pied-piper:before {\n  content: \"\\f1a7\";\n}\n.fa-pied-piper-alt:before {\n  content: \"\\f1a8\";\n}\n.fa-drupal:before {\n  content: \"\\f1a9\";\n}\n.fa-joomla:before {\n  content: \"\\f1aa\";\n}\n.fa-language:before {\n  content: \"\\f1ab\";\n}\n.fa-fax:before {\n  content: \"\\f1ac\";\n}\n.fa-building:before {\n  content: \"\\f1ad\";\n}\n.fa-child:before {\n  content: \"\\f1ae\";\n}\n.fa-paw:before {\n  content: \"\\f1b0\";\n}\n.fa-spoon:before {\n  content: \"\\f1b1\";\n}\n.fa-cube:before {\n  content: \"\\f1b2\";\n}\n.fa-cubes:before {\n  content: \"\\f1b3\";\n}\n.fa-behance:before {\n  content: \"\\f1b4\";\n}\n.fa-behance-square:before {\n  content: \"\\f1b5\";\n}\n.fa-steam:before {\n  content: \"\\f1b6\";\n}\n.fa-steam-square:before {\n  content: \"\\f1b7\";\n}\n.fa-recycle:before {\n  content: \"\\f1b8\";\n}\n.fa-automobile:before,\n.fa-car:before {\n  content: \"\\f1b9\";\n}\n.fa-cab:before,\n.fa-taxi:before {\n  content: \"\\f1ba\";\n}\n.fa-tree:before {\n  content: \"\\f1bb\";\n}\n.fa-spotify:before {\n  content: \"\\f1bc\";\n}\n.fa-deviantart:before {\n  content: \"\\f1bd\";\n}\n.fa-soundcloud:before {\n  content: \"\\f1be\";\n}\n.fa-database:before {\n  content: \"\\f1c0\";\n}\n.fa-file-pdf-o:before {\n  content: \"\\f1c1\";\n}\n.fa-file-word-o:before {\n  content: \"\\f1c2\";\n}\n.fa-file-excel-o:before {\n  content: \"\\f1c3\";\n}\n.fa-file-powerpoint-o:before {\n  content: \"\\f1c4\";\n}\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n  content: \"\\f1c5\";\n}\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n  content: \"\\f1c6\";\n}\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n  content: \"\\f1c7\";\n}\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n  content: \"\\f1c8\";\n}\n.fa-file-code-o:before {\n  content: \"\\f1c9\";\n}\n.fa-vine:before {\n  content: \"\\f1ca\";\n}\n.fa-codepen:before {\n  content: \"\\f1cb\";\n}\n.fa-jsfiddle:before {\n  content: \"\\f1cc\";\n}\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n  content: \"\\f1cd\";\n}\n.fa-circle-o-notch:before {\n  content: \"\\f1ce\";\n}\n.fa-ra:before,\n.fa-rebel:before {\n  content: \"\\f1d0\";\n}\n.fa-ge:before,\n.fa-empire:before {\n  content: \"\\f1d1\";\n}\n.fa-git-square:before {\n  content: \"\\f1d2\";\n}\n.fa-git:before {\n  content: \"\\f1d3\";\n}\n.fa-y-combinator-square:before,\n.fa-yc-square:before,\n.fa-hacker-news:before {\n  content: \"\\f1d4\";\n}\n.fa-tencent-weibo:before {\n  content: \"\\f1d5\";\n}\n.fa-qq:before {\n  content: \"\\f1d6\";\n}\n.fa-wechat:before,\n.fa-weixin:before {\n  content: \"\\f1d7\";\n}\n.fa-send:before,\n.fa-paper-plane:before {\n  content: \"\\f1d8\";\n}\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n  content: \"\\f1d9\";\n}\n.fa-history:before {\n  content: \"\\f1da\";\n}\n.fa-circle-thin:before {\n  content: \"\\f1db\";\n}\n.fa-header:before {\n  content: \"\\f1dc\";\n}\n.fa-paragraph:before {\n  content: \"\\f1dd\";\n}\n.fa-sliders:before {\n  content: \"\\f1de\";\n}\n.fa-share-alt:before {\n  content: \"\\f1e0\";\n}\n.fa-share-alt-square:before {\n  content: \"\\f1e1\";\n}\n.fa-bomb:before {\n  content: \"\\f1e2\";\n}\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n  content: \"\\f1e3\";\n}\n.fa-tty:before {\n  content: \"\\f1e4\";\n}\n.fa-binoculars:before {\n  content: \"\\f1e5\";\n}\n.fa-plug:before {\n  content: \"\\f1e6\";\n}\n.fa-slideshare:before {\n  content: \"\\f1e7\";\n}\n.fa-twitch:before {\n  content: \"\\f1e8\";\n}\n.fa-yelp:before {\n  content: \"\\f1e9\";\n}\n.fa-newspaper-o:before {\n  content: \"\\f1ea\";\n}\n.fa-wifi:before {\n  content: \"\\f1eb\";\n}\n.fa-calculator:before {\n  content: \"\\f1ec\";\n}\n.fa-paypal:before {\n  content: \"\\f1ed\";\n}\n.fa-google-wallet:before {\n  content: \"\\f1ee\";\n}\n.fa-cc-visa:before {\n  content: \"\\f1f0\";\n}\n.fa-cc-mastercard:before {\n  content: \"\\f1f1\";\n}\n.fa-cc-discover:before {\n  content: \"\\f1f2\";\n}\n.fa-cc-amex:before {\n  content: \"\\f1f3\";\n}\n.fa-cc-paypal:before {\n  content: \"\\f1f4\";\n}\n.fa-cc-stripe:before {\n  content: \"\\f1f5\";\n}\n.fa-bell-slash:before {\n  content: \"\\f1f6\";\n}\n.fa-bell-slash-o:before {\n  content: \"\\f1f7\";\n}\n.fa-trash:before {\n  content: \"\\f1f8\";\n}\n.fa-copyright:before {\n  content: \"\\f1f9\";\n}\n.fa-at:before {\n  content: \"\\f1fa\";\n}\n.fa-eyedropper:before {\n  content: \"\\f1fb\";\n}\n.fa-paint-brush:before {\n  content: \"\\f1fc\";\n}\n.fa-birthday-cake:before {\n  content: \"\\f1fd\";\n}\n.fa-area-chart:before {\n  content: \"\\f1fe\";\n}\n.fa-pie-chart:before {\n  content: \"\\f200\";\n}\n.fa-line-chart:before {\n  content: \"\\f201\";\n}\n.fa-lastfm:before {\n  content: \"\\f202\";\n}\n.fa-lastfm-square:before {\n  content: \"\\f203\";\n}\n.fa-toggle-off:before {\n  content: \"\\f204\";\n}\n.fa-toggle-on:before {\n  content: \"\\f205\";\n}\n.fa-bicycle:before {\n  content: \"\\f206\";\n}\n.fa-bus:before {\n  content: \"\\f207\";\n}\n.fa-ioxhost:before {\n  content: \"\\f208\";\n}\n.fa-angellist:before {\n  content: \"\\f209\";\n}\n.fa-cc:before {\n  content: \"\\f20a\";\n}\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n  content: \"\\f20b\";\n}\n.fa-meanpath:before {\n  content: \"\\f20c\";\n}\n.fa-buysellads:before {\n  content: \"\\f20d\";\n}\n.fa-connectdevelop:before {\n  content: \"\\f20e\";\n}\n.fa-dashcube:before {\n  content: \"\\f210\";\n}\n.fa-forumbee:before {\n  content: \"\\f211\";\n}\n.fa-leanpub:before {\n  content: \"\\f212\";\n}\n.fa-sellsy:before {\n  content: \"\\f213\";\n}\n.fa-shirtsinbulk:before {\n  content: \"\\f214\";\n}\n.fa-simplybuilt:before {\n  content: \"\\f215\";\n}\n.fa-skyatlas:before {\n  content: \"\\f216\";\n}\n.fa-cart-plus:before {\n  content: \"\\f217\";\n}\n.fa-cart-arrow-down:before {\n  content: \"\\f218\";\n}\n.fa-diamond:before {\n  content: \"\\f219\";\n}\n.fa-ship:before {\n  content: \"\\f21a\";\n}\n.fa-user-secret:before {\n  content: \"\\f21b\";\n}\n.fa-motorcycle:before {\n  content: \"\\f21c\";\n}\n.fa-street-view:before {\n  content: \"\\f21d\";\n}\n.fa-heartbeat:before {\n  content: \"\\f21e\";\n}\n.fa-venus:before {\n  content: \"\\f221\";\n}\n.fa-mars:before {\n  content: \"\\f222\";\n}\n.fa-mercury:before {\n  content: \"\\f223\";\n}\n.fa-intersex:before,\n.fa-transgender:before {\n  content: \"\\f224\";\n}\n.fa-transgender-alt:before {\n  content: \"\\f225\";\n}\n.fa-venus-double:before {\n  content: \"\\f226\";\n}\n.fa-mars-double:before {\n  content: \"\\f227\";\n}\n.fa-venus-mars:before {\n  content: \"\\f228\";\n}\n.fa-mars-stroke:before {\n  content: \"\\f229\";\n}\n.fa-mars-stroke-v:before {\n  content: \"\\f22a\";\n}\n.fa-mars-stroke-h:before {\n  content: \"\\f22b\";\n}\n.fa-neuter:before {\n  content: \"\\f22c\";\n}\n.fa-genderless:before {\n  content: \"\\f22d\";\n}\n.fa-facebook-official:before {\n  content: \"\\f230\";\n}\n.fa-pinterest-p:before {\n  content: \"\\f231\";\n}\n.fa-whatsapp:before {\n  content: \"\\f232\";\n}\n.fa-server:before {\n  content: \"\\f233\";\n}\n.fa-user-plus:before {\n  content: \"\\f234\";\n}\n.fa-user-times:before {\n  content: \"\\f235\";\n}\n.fa-hotel:before,\n.fa-bed:before {\n  content: \"\\f236\";\n}\n.fa-viacoin:before {\n  content: \"\\f237\";\n}\n.fa-train:before {\n  content: \"\\f238\";\n}\n.fa-subway:before {\n  content: \"\\f239\";\n}\n.fa-medium:before {\n  content: \"\\f23a\";\n}\n.fa-yc:before,\n.fa-y-combinator:before {\n  content: \"\\f23b\";\n}\n.fa-optin-monster:before {\n  content: \"\\f23c\";\n}\n.fa-opencart:before {\n  content: \"\\f23d\";\n}\n.fa-expeditedssl:before {\n  content: \"\\f23e\";\n}\n.fa-battery-4:before,\n.fa-battery-full:before {\n  content: \"\\f240\";\n}\n.fa-battery-3:before,\n.fa-battery-three-quarters:before {\n  content: \"\\f241\";\n}\n.fa-battery-2:before,\n.fa-battery-half:before {\n  content: \"\\f242\";\n}\n.fa-battery-1:before,\n.fa-battery-quarter:before {\n  content: \"\\f243\";\n}\n.fa-battery-0:before,\n.fa-battery-empty:before {\n  content: \"\\f244\";\n}\n.fa-mouse-pointer:before {\n  content: \"\\f245\";\n}\n.fa-i-cursor:before {\n  content: \"\\f246\";\n}\n.fa-object-group:before {\n  content: \"\\f247\";\n}\n.fa-object-ungroup:before {\n  content: \"\\f248\";\n}\n.fa-sticky-note:before {\n  content: \"\\f249\";\n}\n.fa-sticky-note-o:before {\n  content: \"\\f24a\";\n}\n.fa-cc-jcb:before {\n  content: \"\\f24b\";\n}\n.fa-cc-diners-club:before {\n  content: \"\\f24c\";\n}\n.fa-clone:before {\n  content: \"\\f24d\";\n}\n.fa-balance-scale:before {\n  content: \"\\f24e\";\n}\n.fa-hourglass-o:before {\n  content: \"\\f250\";\n}\n.fa-hourglass-1:before,\n.fa-hourglass-start:before {\n  content: \"\\f251\";\n}\n.fa-hourglass-2:before,\n.fa-hourglass-half:before {\n  content: \"\\f252\";\n}\n.fa-hourglass-3:before,\n.fa-hourglass-end:before {\n  content: \"\\f253\";\n}\n.fa-hourglass:before {\n  content: \"\\f254\";\n}\n.fa-hand-grab-o:before,\n.fa-hand-rock-o:before {\n  content: \"\\f255\";\n}\n.fa-hand-stop-o:before,\n.fa-hand-paper-o:before {\n  content: \"\\f256\";\n}\n.fa-hand-scissors-o:before {\n  content: \"\\f257\";\n}\n.fa-hand-lizard-o:before {\n  content: \"\\f258\";\n}\n.fa-hand-spock-o:before {\n  content: \"\\f259\";\n}\n.fa-hand-pointer-o:before {\n  content: \"\\f25a\";\n}\n.fa-hand-peace-o:before {\n  content: \"\\f25b\";\n}\n.fa-trademark:before {\n  content: \"\\f25c\";\n}\n.fa-registered:before {\n  content: \"\\f25d\";\n}\n.fa-creative-commons:before {\n  content: \"\\f25e\";\n}\n.fa-gg:before {\n  content: \"\\f260\";\n}\n.fa-gg-circle:before {\n  content: \"\\f261\";\n}\n.fa-tripadvisor:before {\n  content: \"\\f262\";\n}\n.fa-odnoklassniki:before {\n  content: \"\\f263\";\n}\n.fa-odnoklassniki-square:before {\n  content: \"\\f264\";\n}\n.fa-get-pocket:before {\n  content: \"\\f265\";\n}\n.fa-wikipedia-w:before {\n  content: \"\\f266\";\n}\n.fa-safari:before {\n  content: \"\\f267\";\n}\n.fa-chrome:before {\n  content: \"\\f268\";\n}\n.fa-firefox:before {\n  content: \"\\f269\";\n}\n.fa-opera:before {\n  content: \"\\f26a\";\n}\n.fa-internet-explorer:before {\n  content: \"\\f26b\";\n}\n.fa-tv:before,\n.fa-television:before {\n  content: \"\\f26c\";\n}\n.fa-contao:before {\n  content: \"\\f26d\";\n}\n.fa-500px:before {\n  content: \"\\f26e\";\n}\n.fa-amazon:before {\n  content: \"\\f270\";\n}\n.fa-calendar-plus-o:before {\n  content: \"\\f271\";\n}\n.fa-calendar-minus-o:before {\n  content: \"\\f272\";\n}\n.fa-calendar-times-o:before {\n  content: \"\\f273\";\n}\n.fa-calendar-check-o:before {\n  content: \"\\f274\";\n}\n.fa-industry:before {\n  content: \"\\f275\";\n}\n.fa-map-pin:before {\n  content: \"\\f276\";\n}\n.fa-map-signs:before {\n  content: \"\\f277\";\n}\n.fa-map-o:before {\n  content: \"\\f278\";\n}\n.fa-map:before {\n  content: \"\\f279\";\n}\n.fa-commenting:before {\n  content: \"\\f27a\";\n}\n.fa-commenting-o:before {\n  content: \"\\f27b\";\n}\n.fa-houzz:before {\n  content: \"\\f27c\";\n}\n.fa-vimeo:before {\n  content: \"\\f27d\";\n}\n.fa-black-tie:before {\n  content: \"\\f27e\";\n}\n.fa-fonticons:before {\n  content: \"\\f280\";\n}\n"
  },
  {
    "path": "lib/highlight/github.css",
    "content": "/*\n\ngithub.com style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #333;\n  background: #f8f8f8;\n  -webkit-text-size-adjust: none;\n}\n\n.hljs-comment,\n.diff .hljs-header,\n.hljs-javadoc {\n  color: #998;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.nginx .hljs-title,\n.hljs-subst,\n.hljs-request,\n.hljs-status {\n  color: #333;\n  font-weight: bold;\n}\n\n.hljs-number,\n.hljs-hexcolor,\n.ruby .hljs-constant {\n  color: #008080;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.hljs-dartdoc,\n.tex .hljs-formula {\n  color: #d14;\n}\n\n.hljs-title,\n.hljs-id,\n.scss .hljs-preprocessor {\n  color: #900;\n  font-weight: bold;\n}\n\n.hljs-list .hljs-keyword,\n.hljs-subst {\n  font-weight: normal;\n}\n\n.hljs-class .hljs-title,\n.hljs-type,\n.vhdl .hljs-literal,\n.tex .hljs-command {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword {\n  color: #000080;\n  font-weight: normal;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body {\n  color: #008080;\n}\n\n.hljs-regexp {\n  color: #009926;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.lisp .hljs-keyword,\n.clojure .hljs-keyword,\n.scheme .hljs-keyword,\n.tex .hljs-special,\n.hljs-prompt {\n  color: #990073;\n}\n\n.hljs-built_in {\n  color: #0086b3;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-doctype,\n.hljs-shebang,\n.hljs-cdata {\n  color: #999;\n  font-weight: bold;\n}\n\n.hljs-deletion {\n  background: #fdd;\n}\n\n.hljs-addition {\n  background: #dfd;\n}\n\n.diff .hljs-change {\n  background: #0086b3;\n}\n\n.hljs-chunk {\n  color: #aaa;\n}\n"
  },
  {
    "path": "lib/highlight/highlight.pack.js",
    "content": "!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define([],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+\" \"+(e.parentNode?e.parentNode.className:\"\")).split(/\\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,\"\")}),n.filter(function(e){return N(e)||/no(-?)highlight/.test(e)})[0]}function o(e,n){var t={};for(var r in e)t[r]=e[r];if(n)for(var r in n)t[r]=n[r];return t}function i(e){var n=[];return function r(e,a){for(var o=e.firstChild;o;o=o.nextSibling)3==o.nodeType?a+=o.nodeValue.length:1==o.nodeType&&(n.push({event:\"start\",offset:a,node:o}),a=r(o,a),t(o).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:o}));return a}(e,0),n}function c(e,r,a){function o(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function i(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}l+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function c(e){l+=\"</\"+t(e)+\">\"}function u(e){(\"start\"==e.event?i:c)(e.node)}for(var s=0,l=\"\",f=[];e.length||r.length;){var g=o();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(c);do u(g.splice(0,1)[0]),g=o();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(i)}else\"start\"==g[0].event?f.push(g[0].node):f.pop(),u(g.splice(0,1)[0])}return l+n(a.substr(s))}function u(e){function n(e){return e&&e.source||e}function t(t,r){return RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var c={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");c[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?u(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){u(e,a.k[e])}),a.k=c}a.lR=t(a.l||/\\b[A-Za-z0-9_]+\\b/,!0),i&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&i.tE&&(a.tE+=(a.e?\"|\":\"\")+i.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var l=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,o){function i(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function c(e,n){return r(e.eR,n)?e:e.eW?c(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=x.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?\"\":E.classPrefix,o='<span class=\"'+a,i=t?\"\":\"</span>\";return o+=e+'\">',o+n+i}function d(){if(!w.k)return n(y);var e=\"\",t=0;w.lR.lastIndex=0;for(var r=w.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(w,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=w.lR.lastIndex,r=w.lR.exec(y)}return e+n(y.substr(t))}function h(){if(w.sL&&!R[w.sL])return n(y);var e=w.sL?s(w.sL,y,!0,L[w.sL]):l(y);return w.r>0&&(B+=e.r),\"continuous\"==w.subLanguageMode&&(L[w.sL]=e.top),p(e.language,e.value,!1,!0)}function v(){return void 0!==w.sL?h():d()}function b(e,t){var r=e.cN?p(e.cN,\"\",!0):\"\";e.rB?(M+=r,y=\"\"):e.eB?(M+=n(t)+r,y=\"\"):(M+=r,y=t),w=Object.create(e,{parent:{value:w}})}function m(e,t){if(y+=e,void 0===t)return M+=v(),0;var r=i(t,w);if(r)return M+=v(),b(r,t),r.rB?0:t.length;var a=c(w,t);if(a){var o=w;o.rE||o.eE||(y+=t),M+=v();do w.cN&&(M+=\"</span>\"),B+=w.r,w=w.parent;while(w!=a.parent);return o.eE&&(M+=n(t)),y=\"\",a.starts&&b(a.starts,\"\"),o.rE?0:t.length}if(f(t,w))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(w.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var x=N(e);if(!x)throw new Error('Unknown language: \"'+e+'\"');u(x);for(var w=o||x,L={},M=\"\",k=w;k!=x;k=k.parent)k.cN&&(M=p(k.cN,\"\",!0)+M);var y=\"\",B=0;try{for(var C,j,I=0;;){if(w.t.lastIndex=I,C=w.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}m(t.substr(I));for(var k=w;k.parent;k=k.parent)k.cN&&(M+=\"</span>\");return{r:B,value:M,language:e,top:w}}catch(A){if(-1!=A.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw A}}function l(e,t){t=t||E.languages||Object.keys(R);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return E.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,E.tabReplace)})),E.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function g(e,n,t){var r=n?x[n]:t,a=[e.trim()];return e.match(/(\\s|^)hljs(\\s|$)/)||a.push(\"hljs\"),r&&a.push(r),a.join(\" \").trim()}function p(e){var n=a(e);if(!/no(-?)highlight/.test(n)){var t;E.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,o=n?s(n,r,!0):l(r),u=i(t);if(u.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=o.value,o.value=c(u,i(p),r)}o.value=f(o.value),e.innerHTML=o.value,e.className=g(e.className,n,o.language),e.result={language:o.language,re:o.r},o.second_best&&(e.second_best={language:o.second_best.language,re:o.second_best.r})}}function d(e){E=o(E,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function v(){addEventListener(\"DOMContentLoaded\",h,!1),addEventListener(\"load\",h,!1)}function b(n,t){var r=R[n]=t(e);r.aliases&&r.aliases.forEach(function(e){x[e]=n})}function m(){return Object.keys(R)}function N(e){return R[e]||R[x[e]]}var E={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},R={},x={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=v,e.registerLanguage=b,e.listLanguages=m,e.getLanguage=N,e.inherit=o,e.IR=\"[a-zA-Z][a-zA-Z0-9_]*\",e.UIR=\"[a-zA-Z_][a-zA-Z0-9_]*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.CLCM={cN:\"comment\",b:\"//\",e:\"$\",c:[e.PWM]},e.CBCM={cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\",c:[e.PWM]},e.HCM={cN:\"comment\",b:\"#\",e:\"$\",c:[e.PWM]},e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"css\",function(e){var c=\"[a-zA-Z-][a-zA-Z0-9_-]*\",a={cN:\"function\",b:c+\"\\\\(\",rB:!0,eE:!0,e:\"\\\\(\"};return{cI:!0,i:\"[=/|']\",c:[e.CBCM,{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\"},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"pseudo\",b:\":(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\\\"\\\\']+\"},{cN:\"at_rule\",b:\"@(font-face|page)\",l:\"[a-z-]+\",k:\"font-face page\"},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",c:[{cN:\"keyword\",b:/\\S+/},{b:/\\s/,eW:!0,eE:!0,r:0,c:[a,e.ASM,e.QSM,e.CSSNM]}]},{cN:\"tag\",b:c,r:0},{cN:\"rules\",b:\"{\",e:\"}\",i:\"[^\\\\s]\",r:0,c:[e.CBCM,{cN:\"rule\",b:\"[^\\\\s]\",rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:!0,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:!0,eE:!0,c:[a,e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"hexcolor\",b:\"#[0-9A-Fa-f]+\"},{cN:\"important\",b:\"!important\"}]}}]}]}]}});hljs.registerLanguage(\"xml\",function(){var t=\"[A-Za-z0-9\\\\._:-]+\",e={b:/<\\?(php)?(?!\\w)/,e:/\\?>/,sL:\"php\",subLanguageMode:\"continuous\"},c={eW:!0,i:/</,r:0,c:[e,{cN:\"attribute\",b:t,r:0},{b:\"=\",r:0,c:[{cN:\"value\",c:[e],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/[^\\s\\/>]+/}]}]}]};return{aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xsl\",\"plist\"],cI:!0,c:[{cN:\"doctype\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"comment\",b:\"<!--\",e:\"-->\",r:10},{cN:\"cdata\",b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{title:\"style\"},c:[c],starts:{e:\"</style>\",rE:!0,sL:\"css\"}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{title:\"script\"},c:[c],starts:{e:\"</script>\",rE:!0,sL:\"javascript\"}},e,{cN:\"pi\",b:/<\\?\\w+/,e:/\\?>/,r:10},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"title\",b:/[^ \\/><\\n\\t]+/,r:0},c]}]}});hljs.registerLanguage(\"javascript\",function(r){return{aliases:[\"js\"],k:{keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document\"},c:[{cN:\"pi\",r:10,v:[{b:/^\\s*('|\")use strict('|\")/},{b:/^\\s*('|\")use asm('|\")/}]},r.ASM,r.QSM,r.CLCM,r.CBCM,r.CNM,{b:\"(\"+r.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[r.CLCM,r.CBCM,r.RM,{b:/</,e:/>;/,r:0,sL:\"xml\"}],r:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[r.inherit(r.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:\"params\",b:/\\(/,e:/\\)/,c:[r.CLCM,r.CBCM],i:/[\"'\\(]/}],i:/\\[|%/},{b:/\\$[(.]/},{b:\"\\\\.\"+r.IR,r:0}]}});"
  },
  {
    "path": "lib/jquery.ui.touch-punch.js",
    "content": "/*!\n * jQuery UI Touch Punch 0.2.3\n *\n * Copyright 2011–2014, Dave Furfero\n * Dual licensed under the MIT or GPL Version 2 licenses.\n *\n * Depends:\n *  jquery.ui.widget.js\n *  jquery.ui.mouse.js\n */\n(function ($) {\n\n  // Detect touch support\n  $.support.touch = 'ontouchend' in document;\n\n  // Ignore browsers without touch support\n  if (!$.support.touch) {\n    return;\n  }\n\n  var mouseProto = $.ui.mouse.prototype,\n      _mouseInit = mouseProto._mouseInit,\n      _mouseDestroy = mouseProto._mouseDestroy,\n      touchHandled;\n\n  /**\n   * Simulate a mouse event based on a corresponding touch event\n   * @param {Object} event A touch event\n   * @param {String} simulatedType The corresponding mouse event\n   */\n  function simulateMouseEvent (event, simulatedType) {\n\n    // Ignore multi-touch events\n    if (event.originalEvent.touches.length > 1) {\n      return;\n    }\n\n    event.preventDefault();\n\n    var touch = event.originalEvent.changedTouches[0],\n        simulatedEvent = document.createEvent('MouseEvents');\n    \n    // Initialize the simulated mouse event using the touch event's coordinates\n    simulatedEvent.initMouseEvent(\n      simulatedType,    // type\n      true,             // bubbles                    \n      true,             // cancelable                 \n      window,           // view                       \n      1,                // detail                     \n      touch.screenX,    // screenX                    \n      touch.screenY,    // screenY                    \n      touch.clientX,    // clientX                    \n      touch.clientY,    // clientY                    \n      false,            // ctrlKey                    \n      false,            // altKey                     \n      false,            // shiftKey                   \n      false,            // metaKey                    \n      0,                // button                     \n      null              // relatedTarget              \n    );\n\n    // Dispatch the simulated event to the target element\n    event.target.dispatchEvent(simulatedEvent);\n  }\n\n  /**\n   * Handle the jQuery UI widget's touchstart events\n   * @param {Object} event The widget element's touchstart event\n   */\n  mouseProto._touchStart = function (event) {\n\n    var self = this;\n\n    // Ignore the event if another widget is already being handled\n    if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0])) {\n      return;\n    }\n\n    // Set the flag to prevent other widgets from inheriting the touch event\n    touchHandled = true;\n\n    // Track movement to determine if interaction was a click\n    self._touchMoved = false;\n\n    // Simulate the mouseover event\n    simulateMouseEvent(event, 'mouseover');\n\n    // Simulate the mousemove event\n    simulateMouseEvent(event, 'mousemove');\n\n    // Simulate the mousedown event\n    simulateMouseEvent(event, 'mousedown');\n  };\n\n  /**\n   * Handle the jQuery UI widget's touchmove events\n   * @param {Object} event The document's touchmove event\n   */\n  mouseProto._touchMove = function (event) {\n\n    // Ignore event if not handled\n    if (!touchHandled) {\n      return;\n    }\n\n    // Interaction was not a click\n    this._touchMoved = true;\n\n    // Simulate the mousemove event\n    simulateMouseEvent(event, 'mousemove');\n  };\n\n  /**\n   * Handle the jQuery UI widget's touchend events\n   * @param {Object} event The document's touchend event\n   */\n  mouseProto._touchEnd = function (event) {\n\n    // Ignore event if not handled\n    if (!touchHandled) {\n      return;\n    }\n\n    // Simulate the mouseup event\n    simulateMouseEvent(event, 'mouseup');\n\n    // Simulate the mouseout event\n    simulateMouseEvent(event, 'mouseout');\n\n    // If the touch interaction did not move, it should trigger a click\n    if (!this._touchMoved) {\n\n      // Simulate the click event\n      simulateMouseEvent(event, 'click');\n    }\n\n    // Unset the flag to allow other widgets to inherit the touch event\n    touchHandled = false;\n  };\n\n  /**\n   * A duck punch of the $.ui.mouse _mouseInit method to support touch events.\n   * This method extends the widget with bound touch event handlers that\n   * translate touch events to mouse events and pass them to the widget's\n   * original mouse event handling methods.\n   */\n  mouseProto._mouseInit = function () {\n    \n    var self = this;\n\n    // Delegate the touch handlers to the widget's element\n    self.element.bind({\n      touchstart: $.proxy(self, '_touchStart'),\n      touchmove: $.proxy(self, '_touchMove'),\n      touchend: $.proxy(self, '_touchEnd')\n    });\n\n    // Call the original $.ui.mouse init method\n    _mouseInit.call(self);\n  };\n\n  /**\n   * Remove the touch event handlers\n   */\n  mouseProto._mouseDestroy = function () {\n    \n    var self = this;\n\n    // Delegate the touch handlers to the widget's element\n    self.element.unbind({\n      touchstart: $.proxy(self, '_touchStart'),\n      touchmove: $.proxy(self, '_touchMove'),\n      touchend: $.proxy(self, '_touchEnd')\n    });\n\n    // Call the original $.ui.mouse destroy method\n    _mouseDestroy.call(self);\n  };\n\n})(jQuery);"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"lobipanel\",\n  \"version\": \"1.0.0\",\n  \"description\": \"jQuery plugin for bootstrap panels. It extends panels with several common and useful functions.\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/arboshiki/lobipanel\"\n  },\n  \"keywords\": [\n    \"jQuery plugin\",\n    \"bootstrap\",\n    \"floating panels\",\n    \"minimizable\",\n    \"bootstrap panels\",\n    \"ajax loading\"\n  ],\n  \"author\": {\n    \"name\": \"Zura Sekhniashvili\",\n    \"email\": \"zurasekhniashvili@gmail.com\",\n    \"url\": \"https://github.com/arboshiki\"\n  },\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"gulp\": \"^3.9.1\",\n    \"gulp-clean-css\": \"^3.9.0\",\n    \"gulp-concat\": \"^2.6.1\",\n    \"gulp-copy\": \"^1.0.1\",\n    \"gulp-cssnano\": \"^2.1.2\",\n    \"gulp-less\": \"^3.3.2\",\n    \"gulp-rename\": \"^1.2.2\",\n    \"gulp-uglify\": \"^3.0.0\",\n    \"path\": \"^0.12.7\"\n  },\n  \"dependencies\": {\n    \"bootstrap\": \"^3.3.7\",\n    \"jquery\": \"^3.2.1\"\n  }\n}\n"
  }
]