diff --git a/README.md b/README.md index 07d609e..b63cd9e 100644 --- a/README.md +++ b/README.md @@ -159,3 +159,54 @@ Please note: > > The other parameters are pretty self-explanatory +## [traxo-xx's WebGUI plugin](https://github.com/StarryPy/StarryPy_plugins/tree/master/plugins/web_gui) +> If activated, this give you a web-GUI to administrate your StarryPy server. Still in a very alpha-ish state, which is why it is deactivated by default. For now it only has some basic functions ( I will add more soon), but those should work. Well, except for the chat... the order old messages get's f**ked up when you reload the dashboard. I'll try to fix that soon. When it's activated you can log in to the GUI with the name of the server owner and the password you set in the config file. + +> ### Required Python packages: + +> * tornado + +> ### Add the following block to your config file: + +> ```javascript + "web_gui": { + "auto_activate": false, + "cookie_token": "", + "log_path": "webgui.log", + "log_path_access": "webgui_access.log", + "ownerpassword": "!!PUT A PASSWORD HERE", + "port": 8083, + "remember_cookie_token": true, + "restart_script": "", + "serverurl": "localhost" + }, +>``` + +> **cookie_token**: A secure token for Cookies. Leave this blank. The plugin will fill it. +> **ownerpassword**: Password for the web-GUI. +> **port**: The port the web-GUI will listen on. +> **remember_cookie_token**: If set to true, you will stay logged in until you log out (even after you restart StarryPy). If set to false, a new cookie_token will be generated on every start of StarryPy. +> **restart_script**: Path to a script to restart starbound and/or StarryPy. +> **serverurl**: URL or IP of your StarryPy server. + +> ### Credits: + +> DevOOPS Bootstrap 3 Admin theme https://github.com/devoopsme/devoops/ + +> jQuery-Knob http://anthonyterrien.com/knob/ (MIT or GPL) 1.2.5 +> D3 http://d3js.org/ 3.4.1 AS IS +> Select2 https://github.com/ivaynberg/select2 3.4.5 GPL2 +> Bootstrap Validator https://github.com/nghuuphuoc/bootstrapvalidator 0.2.3 MIT +> TinyMCE http://www.tinymce.com 4.0.16 GPL2 +> jQuery Timepicker http://trentrichardson.com/examples/timepicker/ 1.4.3 MIT +> xCharts http://tenxer.github.io/xcharts/ 0.3.0 AS IS +> Fancybox http://fancyapps.com/fancybox/ 2.1.5 ? +> Widen FineUploader https://github.com/Widen/fine-uploader (GPL3) v 4.3.1 +> Datatables http://datatables.net 1.9.4 GPL or BSD +> jQuery-UI 1.10.4 +> Twitter Bootstrap http://getbootstrap.com 3.1.0 +> Flot www.flotcharts.org 0.8.2 AS IS +> Fullcalendar http://arshaw.com/fullcalendar 2.0..0beta MIT +> Moment http://momentjs.com/ 2.5.1 MIT +> Justified Gallery https://github.com/miromannino/Justified-Gallery 2.1 Creative Commons 3.0 +> Morris Charts http://www.oesmith.co.uk/morris.js/ v0.4.3 MIT diff --git a/plugins/web_gui/__init__.py b/plugins/web_gui/__init__.py new file mode 100644 index 0000000..c662274 --- /dev/null +++ b/plugins/web_gui/__init__.py @@ -0,0 +1 @@ +from .web_gui_plugin import WebGuiPlugin \ No newline at end of file diff --git a/plugins/web_gui/static/adminstop.html b/plugins/web_gui/static/adminstop.html new file mode 100644 index 0000000..55cf8e3 --- /dev/null +++ b/plugins/web_gui/static/adminstop.html @@ -0,0 +1,37 @@ + + + + + StarryPy WebGUI + + + + + + + + + + + + +
+
+
+
+
+ {% if handler.error_message == "" %} +

Server is being stopped!

+ {% else %} +

{{ handler.error_message }}

+ {% end %} +
+
+
+
+
+ + \ No newline at end of file diff --git a/plugins/web_gui/static/ajax/dashboard.html b/plugins/web_gui/static/ajax/dashboard.html new file mode 100644 index 0000000..0c3210a --- /dev/null +++ b/plugins/web_gui/static/ajax/dashboard.html @@ -0,0 +1,92 @@ + +
+ +
+
+
+
+
+
+ + Chat +
+ +
+
+
+
+
+ +
+ +
+ +
+
+
+
+
+
+
+ + Online Players +
+ +
+
+
+
+
+ +
+
+
+ + Administration +
+ +
+
+
+
+
+
+
+
+
diff --git a/plugins/web_gui/static/ajax/playeredit.html b/plugins/web_gui/static/ajax/playeredit.html new file mode 100644 index 0000000..ed8fee3 --- /dev/null +++ b/plugins/web_gui/static/ajax/playeredit.html @@ -0,0 +1,85 @@ +
+ +
+
+
+ {% set iconcolour = "#54ae86" if handler.edit_player.logged_in else "#D15E5E" %} +

Edit {{ handler.edit_player.name }}

+ {% if handler.edit_player.logged_in %} + + {% end %} + {% if handler.player_manager.check_bans(handler.edit_player.ip) %} + + {% else %} + + {% end %} + +
+
+ +
+ + {% if handler.error_message != "" %} + {{ handler.error_message }} + {% end %} + + + + + + + + + + + + + + + + + + + + + + + + + +
UUID{{ handler.edit_player.uuid }}
Access Level + +
IP{{ handler.edit_player.ip }}
Last Seen{{ str(handler.edit_player.last_seen).rpartition('.')[0] }}
planet{{ handler.edit_player.planet }}
On Ship{{ handler.edit_player.on_ship }}
+ {% raw xsrf_form_html() %} + +
+ +
+
+
+
+
diff --git a/plugins/web_gui/static/ajax/playerlist.html b/plugins/web_gui/static/ajax/playerlist.html new file mode 100644 index 0000000..008c129 --- /dev/null +++ b/plugins/web_gui/static/ajax/playerlist.html @@ -0,0 +1,37 @@ + + +
+ +
+
+
+ + + + + + + + + + + {% for player in handler.playerlist %} + + {% set iconcolour = "#54ae86" if player.logged_in else "#D15E5E" %} + + + + + + {% end %} + +
NamePlanetAccess LevelLast Seen
{{ player.name }} {% if handler.player_manager.check_bans(player.ip) %} {% end %}{{ player.planet }}{{ player.access_level }}{{ str(player.last_seen).rpartition('.')[0] }}
+
+
+ diff --git a/plugins/web_gui/static/ajax/playerlistonline.html b/plugins/web_gui/static/ajax/playerlistonline.html new file mode 100644 index 0000000..c735003 --- /dev/null +++ b/plugins/web_gui/static/ajax/playerlistonline.html @@ -0,0 +1,36 @@ + + +
+ +
+
+
+ + + + + + + + + + + {% for player in handler.playerlistonline %} + + + + + + + {% end %} + +
NamePlanetAccess LevelLast Seen
{{ player.name }}{{ player.planet }}{{ player.access_level }}{{ str(player.last_seen).rpartition('.')[0] }}
+
+
+ diff --git a/plugins/web_gui/static/ajax/playerquickmenu.html b/plugins/web_gui/static/ajax/playerquickmenu.html new file mode 100644 index 0000000..0deec43 --- /dev/null +++ b/plugins/web_gui/static/ajax/playerquickmenu.html @@ -0,0 +1,10 @@ +{% if handler.edit_player.logged_in %} + +{% end %} + +{% if handler.player_manager.check_bans(handler.edit_player.ip) %} + +{% else %} + +{% end %} + \ No newline at end of file diff --git a/plugins/web_gui/static/ajax/playersonline.html b/plugins/web_gui/static/ajax/playersonline.html new file mode 100644 index 0000000..9549b9b --- /dev/null +++ b/plugins/web_gui/static/ajax/playersonline.html @@ -0,0 +1,3 @@ + {% for player in handler.playerlistonline %} + {{ player.name }}
+ {% end %} \ No newline at end of file diff --git a/plugins/web_gui/static/css/bootstrap-sortable.css b/plugins/web_gui/static/css/bootstrap-sortable.css new file mode 100644 index 0000000..8924f61 --- /dev/null +++ b/plugins/web_gui/static/css/bootstrap-sortable.css @@ -0,0 +1,84 @@ +table.sortable span.sign { + display: block; + position: absolute; + top: 50%; + right: 5px; + font-size: 12px; + margin-top: -10px; + color: #bfbfc1; +} + +table.sortable span.arrow, span.reversed { + border-style: solid; + border-width: 5px; + font-size: 0; + border-color: #ccc transparent transparent transparent; + line-height: 0; + height: 0; + width: 0; + margin-top: -2px; +} + + table.sortable span.arrow.up { + border-color: transparent transparent #ccc transparent; + margin-top: -7px; + } + +table.sortable span.reversed { + border-color: transparent transparent #ccc transparent; + margin-top: -7px; +} + + table.sortable span.reversed.up { + border-color: #ccc transparent transparent transparent; + margin-top: -2px; + } + + + +table.sortable span.az:before { + content: "a .. z"; +} + +table.sortable span.az.up:before { + content: "z .. a"; +} + +table.sortable span.AZ:before { + content: "A .. Z"; +} + +table.sortable span.AZ.up:before { + content: "Z .. A"; +} + +table.sortable span._19:before { + content: "1 .. 9"; +} + +table.sortable span._19.up:before { + content: "9 .. 1"; +} + +table.sortable span.month:before { + content: "jan .. dec"; +} + +table.sortable span.month.up:before { + content: "dec .. jan"; +} + +table.sortable thead th:not([data-defaultsort=disabled]) { + cursor: pointer; + position: relative; + top: 0; + left: 0; +} + +table.sortable thead th:hover:not([data-defaultsort=disabled]) { + background: #efefef; +} + +table.sortable thead th div.mozilla { + position: relative; +} diff --git a/plugins/web_gui/static/css/footer.css b/plugins/web_gui/static/css/footer.css new file mode 100644 index 0000000..7ce6adb --- /dev/null +++ b/plugins/web_gui/static/css/footer.css @@ -0,0 +1,6 @@ +#footer { + position: fixed; + bottom: 0; + padding-left: 10 px; + padding-bottom: 5px; +} \ No newline at end of file diff --git a/plugins/web_gui/static/css/style.min.css b/plugins/web_gui/static/css/style.min.css new file mode 100644 index 0000000..f047d86 --- /dev/null +++ b/plugins/web_gui/static/css/style.min.css @@ -0,0 +1 @@ +body{color:#525252;background:#6aa6d6 url(../img/devoops_pattern_b10.png) 0 0 repeat}.body-expanded,.modal-open{overflow-y:hidden;margin-right:15px}.body-expanded .expanded-panel,.fancybox-margin .expanded-panel,.modal-open .expanded-panel{margin-right:15px}.body-screensaver{overflow:hidden}h1,.h1,h2,.h2,h3,.h3{margin:0}#logo{position:relative;background:#525252 url(../img/devoops_pattern_b10.png) 0 0 repeat}#logo a{color:#fff;font-family:'Righteous',cursive;display:block;font-size:20px;line-height:50px;background:url(../img/logo.png) right 42px no-repeat;-webkit-transition:.5s;-moz-transition:.5s;-o-transition:.5s;transition:.5s}#logo a:hover{background-position:right 25px;text-decoration:none}.navbar{margin:0;border:0;position:fixed;top:0;left:0;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;box-shadow:0 1px 2px #272727;z-index:2000}.body-expanded .navbar{z-index:9}a.show-sidebar{float:left;color:#6d6d6d;-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}a.show-sidebar:hover{color:#000}#sidebar-left{position:relative;z-index:inherit;padding-bottom:3000px !important;margin-bottom:-3000px !important;background:#6aa6d6 url(../img/devoops_pattern_b10.png) 0 0 repeat;-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}#content{position:relative;z-index:10;background:#ebebeb;box-shadow:0 0 6px #131313;padding-bottom:3000px !important;margin-bottom:-2980px !important;overflow:hidden;-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}.full-content{overflow:hidden;padding:0;margin:0}.nav.main-menu,.nav.msg-menu{margin:0 -15px}.nav.main-menu>li>a,.nav.msg-menu>li>a{text-align:center;color:#f0f0f0;min-height:40px;-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background:rgba(0,0,0,0.1)}.nav.main-menu>li>a:hover,.nav.main-menu>li>a:focus,.nav.main-menu>li.active>a,.nav.main-menu .open>a,.nav.main-menu .open>a:hover,.nav.main-menu .open>a:focus,.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover,.dropdown-menu>li.active>a,.nav.msg-menu>li>a:hover,.nav.msg-menu>li>a:focus,.nav.msg-menu>li.active>a,.nav.msg-menu .open>a,.nav.msg-menu .open>a:hover,.nav.msg-menu .open>a:focus{background:rgba(0,0,0,0.1);color:#f0f0f0}.nav.main-menu a.active,.nav.msg-menu a.active{background:rgba(0,0,0,0.2)}.nav.main-menu a.active:hover,.nav.msg-menu a.active:hover{background:rgba(0,0,0,0.2)}.nav.main-menu a.active-parent,.nav.msg-menu a.active-parent{background:rgba(0,0,0,0.3)}.nav.main-menu a.active-parent:hover,.nav.msg-menu a.active-parent:hover{background:rgba(0,0,0,0.3)}.nav.main-menu>li>a>i,.nav.msg-menu>li>a>i{font-size:18px;width:auto;display:block;text-align:center;vertical-align:middle}.main-menu .dropdown-menu{position:absolute;z-index:2001;left:100%;top:0;float:none;margin:0;border:0;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;padding:0;background:#6aa6d6 url(../img/devoops_pattern_b10.png) 0 0 repeat;box-shadow:none;visibility:hidden}.main-menu .active-parent:hover+.dropdown-menu{visibility:visible}.main-menu .active-parent+.dropdown-menu:hover{visibility:visible}.main-menu .dropdown-menu>li>a{padding:9px 15px 9px 40px;color:#f0f0f0}.main-menu .dropdown-menu>li:first-child>a{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0}.main-menu .dropdown-menu>li:last-child>a{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0}#top-panel{line-height:50px;height:50px;background:#ebebeb}#main{margin-top:50px;min-height:800px;overflow:hidden}#search{position:relative;margin-left:20px}#search>input{width:80%;background:#dfdfdf;border:1px solid #c7c7c7;text-shadow:0 1px 1px #EEE;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;color:#686868;line-height:1em;height:30px;padding:0 35px 0 10px;-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}#search>input+i{opacity:0;position:absolute;top:18px;right:10px;color:#fff;-webkit-transition:.4s;-moz-transition:.4s;-o-transition:.4s;transition:.4s}#search>input:focus{width:100%;outline:0}#search>input:focus+i{opacity:1}.panel-menu{margin:0}.top-panel-right{padding-left:0}.panel-menu>li>a{padding:0 5px 0 10px;line-height:50px}.panel-menu>li>a:hover{background:0}.panel-menu a.account{height:50px;padding:5px 0 5px 10px;line-height:18px}.panel-menu i{margin-top:8px;padding:5px;font-size:20px;color:#7bc5d3;line-height:1em;vertical-align:top;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}.panel-menu>li>a:hover>i{background:#f5f5f5}.panel-menu i.pull-right{color:#000;border:0;box-shadow:none;font-size:16px;background:none !important}.panel-menu .badge{margin-top:3px;padding:3px 6px;vertical-align:top;background:#cea9a9}.avatar{width:40px;float:left;margin-right:5px}.avatar>img{width:40px;height:40px;border:1px solid #f8f8f8}.user-mini>span{display:block;font-size:12px;color:#363636;margin-bottom:-4px}.user-mini>span.welcome{font-weight:bold;margin-top:2px}.panel-menu .dropdown-menu{position:absolute !important;background:rgba(0,0,0,0.7) !important;padding:0;border:0;right:0;left:auto;min-width:100%}.panel-menu .dropdown-menu>li>a{padding:5px 10px !important;color:#f0f0f0}.panel-menu .dropdown-menu>li>a>i{border:0;padding:0;margin:0;font-size:14px;width:20px;display:inline-block;text-align:center;vertical-align:middle}.well{padding:15px}.box{display:block;z-index:1999;position:relative;border:1px solid #f8f8f8;box-shadow:0 0 4px #d8d8d8;background:transparent;margin-bottom:20px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.full-content .box{border:0;margin-bottom:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.box-header{-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;color:#363636;font-size:16px;position:relative;overflow:hidden;background:#f5f5f5;border-bottom:1px solid #e4e4e4;height:28px}.box-name,.modal-header-name{padding-left:15px;line-height:28px}.box-name:hover{cursor:move}.box-name>i{margin-right:5px}.box-icons{position:absolute;top:0;right:0;z-index:9}.no-move{display:none}.expanded .no-move{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;display:block}.box-content{position:relative;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;padding:15px;background:#fcfcfc}.box-content.dropbox,.box-content.sortablebox{overflow:hidden}.full-content .box-content{height:100%;position:absolute;width:100%;left:0;top:0}.box-icons a{cursor:pointer;text-decoration:none !important;border-left:1px solid #fafafa;height:26px;line-height:26px;width:28px;display:block;float:left;text-align:center;color:#b8b8b8 !important;-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}.box-icons a.beauty-table-to-json{width:auto;padding:0 10px;font-size:14px}.box-icons a:hover{box-shadow:inset 0 0 1px 0 #cecece}.expanded a.close-link{display:none}#sidebar-left.col-xs-2{opacity:0;width:0;padding:0}.sidebar-show #sidebar-left.col-xs-2{opacity:1;width:16.666666666666664%;padding:0 15px}.sidebar-show #content.col-xs-12{opacity:1;width:83.33333333333334%}.expanded{overflow-y:scroll;border:0;z-index:3000 !important;position:fixed;width:100%;height:100%;top:0;left:0;padding:0;background:rgba(0,0,0,0.2);-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}.expanded-padding{background:rgba(0,0,0,0.7);padding:50px;-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}.no-padding{padding:0 !important}.padding-15{padding:15px !important}.no-padding .table-bordered{border:0;margin:0}.no-padding .table-bordered thead tr th:first-child,.no-padding .table-bordered tbody tr th:first-child,.no-padding .table-bordered tfoot tr th:first-child,.no-padding .table-bordered thead tr td:first-child,.no-padding .table-bordered tbody tr td:first-child,.no-padding .table-bordered tfoot tr td:first-child{border-left:0 !important}.no-padding .table-bordered thead tr th:last-child,.no-padding .table-bordered tbody tr th:last-child,.no-padding .table-bordered tfoot tr th:last-child,.no-padding .table-bordered thead tr td:last-child,.no-padding .table-bordered tbody tr td:last-child,.no-padding .table-bordered tfoot tr td:last-child{border-right:0 !important}.table-heading thead tr{background-color:#f0f0f0;background-image:-webkit-linear-gradient(top,#f0f0f0,#dfdfdf);background-image:-moz-linear-gradient(top,#f0f0f0,#dfdfdf);background-image:-ms-linear-gradient(top,#f0f0f0,#dfdfdf);background-image:-o-linear-gradient(top,#f0f0f0,#dfdfdf);background-image:linear-gradient(to bottom,#f0f0f0,#dfdfdf)}table.no-border-bottom tr:last-child td{border-bottom:0}.dataTables_wrapper{overflow:hidden}.dataTables_wrapper table.table{clear:both;max-width:inherit;margin-bottom:0}.table-datatable *,.table-datatable :after,.table-datatable :before{margin:0;padding:0;-webkit-box-sizing:content-box;box-sizing:content-box;-moz-box-sizing:content-box}.table-datatable label{position:relative;display:block;font-weight:400}.table-datatable tbody td{vertical-align:middle !important}.table-datatable img{margin-right:10px;border:1px solid #f8f8f8;width:40px}.table-datatable .sorting{background:url(../img/sort.png) right center no-repeat;padding-right:16px;cursor:pointer}.table-datatable .sorting_asc{background:url(../img/sort-asc.png) right center no-repeat;padding-right:16px;cursor:pointer}.table-datatable .sorting_desc{background:url(../img/sort-desc.png) right center no-repeat;padding-right:16px;cursor:pointer}div.DTTT_collection_background{z-index:2002}div.DTTT .btn{color:#333 !important;font-size:12px}ul.DTTT_dropdown.dropdown-menu{z-index:2003;background:rgba(0,0,0,0.7) !important;padding:0;border:0;margin:0;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;min-width:157px}ul.DTTT_dropdown.dropdown-menu li{position:relative}ul.DTTT_dropdown.dropdown-menu>li>a{position:relative;display:block;padding:5px 10px !important;color:#f0f0f0 !important}ul.DTTT_dropdown.dropdown-menu>li:first-child>a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}ul.DTTT_dropdown.dropdown-menu>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}ul.DTTT_dropdown.dropdown-menu>li:hover>a{background:rgba(0,0,0,0.3);color:#f0f0f0}.dataTables_wrapper input[type="text"]{display:block;width:90%;height:26px;padding:2px 12px;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;-moz-appearance:none;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}.dataTables_wrapper input[type="text"]:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}#breadcrumb{padding:0;line-height:40px;background:#525252;background:#5a8db6 url(../img/devoops_pattern_b10.png) 0 0 repeat;margin-bottom:20px}.breadcrumb{padding:0 15px;background:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0}.breadcrumb>li>a{color:#d8d8d8}.breadcrumb>li>a:hover,.breadcrumb>li:last-child>a{color:#f8f8f8}.bs-callout{padding:15px;border-left:3px solid #525252;background:#dfdfdf}.bs-callout h4{margin-top:0;margin-bottom:5px;color:#525252}.no-padding .bs-callout{border:0}.page-header{margin:0 0 10px;border-bottom:1px solid #c7c7c7}.box-content .page-header,legend,.full-calendar .page-header{margin:0 0 10px;border-bottom:1px dashed #b6b6b6}.invoice-header{margin:0 0 10px;border-bottom:1px dashed #b6b6b6;display:inline-block}.box-content .form-group,.devoops-modal-inner .form-group{margin-top:15px;margin-bottom:15px}.show-grid [class^="col-"]{padding-top:10px;padding-bottom:10px;background-color:#525252;background-color:rgba(129,199,199,0.2);border:1px solid #ebebeb}.show-grid [class^="col-"]:hover{padding-top:10px;padding-bottom:10px;background-color:rgba(107,134,182,0.2);border:1px solid #ebebeb}.show-grid,.show-grid-forms{margin-bottom:15px}.show-grid-forms [class^="col-"]{padding-top:10px;padding-bottom:10px}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th,td.beauty-hover{background-color:rgba(219,219,219,0.3) !important}.table-hover>tbody>tr:hover>td.beauty-hover:hover{background-color:rgba(219,219,219,0.9) !important}.DTTT.btn-group{position:absolute;top:-28px;right:83px;border-right:1px solid #dbdbdb}.DTTT.btn-group a{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;line-height:1em;font-size:14px;font-weight:bold;outline:0;box-shadow:none !important;padding:6px 12px;margin:0;background:#f7f7f7;border:0}#screensaver{position:fixed;top:0;left:0;width:100%;height:100%;z-index:3000;background:#000;display:none}#screensaver.show{display:block}#canvas{position:relative}#screensaver i{position:absolute;top:50px;right:50px;background:rgba(255,255,255,0.5);line-height:100px;width:100px;height:100px;text-align:center;font-size:60px;color:rgba(0,0,0,0.8);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well pre{padding:0;margin-top:0;margin-bottom:0;background-color:transparent;border:0;white-space:nowrap}.well pre code{white-space:normal}.btn{border-width:1px;border-style:solid;border-width:1px;text-decoration:none;border-color:rgba(0,0,0,0.3);cursor:pointer;outline:0;font-family:"Lucida Grande","Lucida Sans","Lucida Sans Unicode","Segoe UI",Verdana,sans-serif;display:inline-block;vertical-align:top;position:relative;font-size:12px;font-weight:bold;text-align:center;background-color:#a2a2a2;background:#a2a2a2 -moz-linear-gradient(top,rgba(255,255,255,0.6),rgba(255,255,255,0));background:#a2a2a2 -webkit-gradient(linear,0 0,0 100%,from(rgba(255,255,255,0.6)),to(rgba(255,255,255,0)));line-height:24px;margin:0 0 10px 0;padding:0 10px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-moz-user-select:none;-webkit-user-select:none;outline:none !important}.btn-label-left,.btn-label-right{padding:0 10px}.btn-label-left span{position:relative;left:-10px;display:inline-block;padding:0 8px;background:rgba(0,0,0,0.1)}.btn-label-right span{position:relative;right:-10px;display:inline-block;padding:0 8px;background:rgba(0,0,0,0.1)}.btn i{vertical-align:middle}.btn-app{width:80px;height:80px;padding:0;font-size:16px}.btn-app i{font-size:36px;line-height:78px;display:block}.btn-app-sm{width:50px;height:50px;padding:0;font-size:12px}.btn-app-sm i{font-size:18px;line-height:48px;display:block}.btn-circle{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;border:2px solid rgba(0,0,0,0.25)}.btn.active{background-image:none;outline:0;-webkit-box-shadow:none;box-shadow:none}.btn-default,.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active,.progress-bar{background-color:#d8d8d8;border-color:rgba(0,0,0,0.3);color:#929292}.btn-primary,.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active,.table>thead>tr>td.primary,.table>tbody>tr>td.primary,.table>tfoot>tr>td.primary,.table>thead>tr>th.primary,.table>tbody>tr>th.primary,.table>tfoot>tr>th.primary,.table>thead>tr.primary>td,.table>tbody>tr.primary>td,.table>tfoot>tr.primary>td,.table>thead>tr.primary>th,.table>tbody>tr.primary>th,.table>tfoot>tr.primary>th{background-color:#6aa6d6;border-color:rgba(0,0,0,0.3);color:#f8f8f8}.btn-success,.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active,.progress-bar-success,.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#63cc9e;border-color:rgba(0,0,0,0.3);color:#f8f8f8}.btn-info,.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active,.progress-bar-info,.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#7bc5d3;border-color:rgba(0,0,0,0.3);color:#f8f8f8}.btn-warning,.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active,.progress-bar-warning,.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#dfd271;border-color:rgba(0,0,0,0.3);color:#f8f8f8}.btn-danger,.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active,.progress-bar-danger,.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#d15e5e;border-color:rgba(0,0,0,0.3);color:#f8f8f8}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#525252;background-color:#b8b8b8;border-color:rgba(0,0,0,0.3)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary,.table-hover>tbody>tr>td.primary:hover,.table-hover>tbody>tr>th.primary:hover,.table-hover>tbody>tr.primary:hover>td,.table-hover>tbody>tr.primary:hover>th{color:#fff;background-color:#5a8db6;border-color:rgba(0,0,0,0.3)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{color:#fff;background-color:#54ae86;border-color:rgba(0,0,0,0.3)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{color:#fff;background-color:#69a8b4;border-color:rgba(0,0,0,0.3)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{color:#fff;background-color:#beb360;border-color:rgba(0,0,0,0.3)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{color:#fff;background-color:#b25050;border-color:rgba(0,0,0,0.3)}.progress{overflow:visible}.progress-ui{height:10px}.progress-bar{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.progress-bar.ui-widget-content{background:0;border:0;height:100%;position:relative}.progress-bar .ui-state-default{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;height:10px;width:10px;top:0;margin-left:-5px;cursor:pointer;border:0 solid #d3d3d3;outline:none !important;background-color:#f0f0f0;background-image:-webkit-linear-gradient(top,#f0f0f0,#dfdfdf);background-image:-moz-linear-gradient(top,#f0f0f0,#dfdfdf);background-image:-ms-linear-gradient(top,#f0f0f0,#dfdfdf);background-image:-o-linear-gradient(top,#f0f0f0,#dfdfdf);background-image:linear-gradient(to bottom,#f0f0f0,#dfdfdf)}.progress-bar .ui-widget-header{background:#d8d8d8}.progress-bar-primary .ui-widget-header{background:#6aa6d6;color:#f8f8f8}.progress-bar-success .ui-widget-header{background:#63cc9e;color:#f8f8f8}.progress-bar-info .ui-widget-header{background:#7bc5d3;color:#f8f8f8}.progress-bar-warning .ui-widget-header{background:#dfd271;color:#f8f8f8}.progress-bar-danger .ui-widget-header{background:#d15e5e;color:#f8f8f8}.progress-bar .ui-state-default{background:#b8b8b8}.progress-bar-primary .ui-state-default{background:#5a8db6}.progress-bar-success .ui-state-default{background:#54ae86}.progress-bar-info .ui-state-default{background:#69a8b4}.progress-bar-warning .ui-state-default{background:#beb360}.progress-bar-danger .ui-state-default{background:#b25050}.slider-range-min-amount,.slider-range-max-amount,.slider-range-amount{border:0;background:0;outline:none !important}.progress-bar.ui-slider-vertical{width:20px}.progress-bar.ui-slider-vertical .ui-state-default{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;height:20px;width:20px;top:auto;margin-left:0;left:0}#equalizer .progress{height:160px;display:inline-block;margin:15px}.beauty-table{width:100%;border-collapse:separate;border-spacing:0}.beauty-table input{border:1px solid transparent;background:0;font-size:16px;text-align:center;padding:2px 15px !important;width:100%;outline:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.beauty-table input:focus{border:1px solid #dfdfdf;background:#fefefe;font-size:16px;text-align:center;padding:2px 15px !important;width:100%;outline:0}.c{color:#999;display:block}.nt{color:#2f6f9f}.na{color:#4f9fcf}.s{color:#d44950}.radio,.checkbox,.radio-inline,.checkbox-inline{position:relative}.radio label,.checkbox label,.radio-inline label,.checkbox-inline label{font-weight:normal;cursor:pointer;padding-left:8px;-webkit-transition:1s;-moz-transition:1s;-o-transition:1s;transition:1s}.radio+.radio,.checkbox+.checkbox{margin-top:10px}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;clip:rect(0,0,0,0)}.checkbox i,.checkbox-inline i,.radio i,.radio-inline i{cursor:pointer;position:absolute;left:0;top:0;font-size:24px;-webkit-transition:1s;-moz-transition:1s;-o-transition:1s;transition:1s}.checkbox i.small,.checkbox-inline i.small,.radio i.small,.radio-inline i.small{font-size:18px;top:2px}.checkbox input[type=checkbox]:checked+i:before,.checkbox-inline input[type=checkbox]:checked+i:before{content:"\f046"}.radio input[type=radio]:checked+i:before,.radio-inline input[type=radio]:checked+i:before{content:"\f192"}.toggle-switch{position:relative;width:60px}.toggle-switch input{display:none}.toggle-switch label{display:block;overflow:hidden;cursor:pointer;-webkit-border-radius:20px;-moz-border-radius:20px;border-radius:20px}.toggle-switch-inner{width:200%;margin-left:-100%;-webkit-transition:margin .3s ease-in 0;-moz-transition:margin .3s ease-in 0;-o-transition:margin .3s ease-in 0;transition:margin .3s ease-in 0}.toggle-switch-inner:before,.toggle-switch-inner:after{float:left;width:50%;height:20px;padding:0;line-height:20px;font-size:12px;text-shadow:1px 1px 1px #fff;color:#929292;background-color:#f5f5f5;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:20px;-moz-border-radius:20px;border-radius:20px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.toggle-switch-inner:before{content:"ON";padding-left:15px;-webkit-border-radius:20px 0 0 20px;-moz-border-radius:20px 0 0 20px;border-radius:20px 0 0 20px}.toggle-switch-inner:after{content:"OFF";padding-right:15px;text-align:right;-webkit-border-radius:0 20px 20px 0;-moz-border-radius:0 20px 20px 0;border-radius:0 20px 20px 0}.toggle-switch-switch{width:20px;margin:0;border:2px solid #d8d8d8;-webkit-border-radius:20px;-moz-border-radius:20px;border-radius:20px;position:absolute;top:0;bottom:0;right:40px;color:#f8f8f8;line-height:1em;text-shadow:0 0 1px #adadad;text-align:center;-webkit-transition:all .3s ease-in 0;-moz-transition:all .3s ease-in 0;-o-transition:all .3s ease-in 0;transition:all .3s ease-in 0;background-color:#f0f0f0;background-image:-webkit-linear-gradient(top,#f0f0f0,#dfdfdf);background-image:-moz-linear-gradient(top,#f0f0f0,#dfdfdf);background-image:-ms-linear-gradient(top,#f0f0f0,#dfdfdf);background-image:-o-linear-gradient(top,#f0f0f0,#dfdfdf);background-image:linear-gradient(to bottom,#f0f0f0,#dfdfdf)}.toggle-switch input:checked+.toggle-switch-inner{margin-left:0}.toggle-switch input:checked+.toggle-switch-inner+.toggle-switch-switch{right:0}.toggle-switch-danger input:checked+.toggle-switch-inner+.toggle-switch-switch{border:2px solid #d15e5e;background:#d15e5e}.toggle-switch-warning input:checked+.toggle-switch-inner+.toggle-switch-switch{border:2px solid #dfd271;background:#dfd271}.toggle-switch-info input:checked+.toggle-switch-inner+.toggle-switch-switch{border:2px solid #7bc5d3;background:#7bc5d3}.toggle-switch-success input:checked+.toggle-switch-inner+.toggle-switch-switch{border:2px solid #63cc9e;background:#63cc9e}.toggle-switch-primary input:checked+.toggle-switch-inner+.toggle-switch-switch{border:2px solid #6aa6d6;background:#6aa6d6}.select2-container{width:100%}.select2-container .select2-choice{height:30px}.knob-slider{position:relative;text-align:center;display:inline-block;width:100%;margin-bottom:5px}.knob-slider>div{display:inline-block !important}.knob-slider input{outline:none !important}.ipod{background:#dedede;text-align:center;padding:50px 0}.knob-clock{text-align:center}.knob-clock>div{font-size:50px;text-align:center;color:#a2a2a2}.knob{border:0;background:0}.box-pricing:hover{box-shadow:0 0 5px #525252;-webkit-transition:.5s;-moz-transition:.5s;-o-transition:.5s;transition:.5s}.box-pricing .row-fluid>div{padding:18px 15px 8px;line-height:1.428571429;vertical-align:top}.box-pricing .row-fluid.centered>div{background-color:#f5f5f5;padding:8px;text-align:center}.box-pricing .row-fluid.centered>div:nth-child(odd){background-color:#f9f9f9}.box-pricing .box-header{height:80px;padding:10px 0}.box-pricing .box-name{padding:0 10px;text-align:center}.box-pricing .box-name:hover{cursor:inherit}#messages #breadcrumb{margin-bottom:0;position:fixed;width:100%;z-index:2}#messages-menu{position:fixed;top:90px;background:#a5a5a5;margin:0;height:100%;z-index:2}#messages-list{margin-top:40px;padding:0}.one-list-message{background:#f1f1f1;border-bottom:1px solid #CCC;padding:15px 15px 15px 25px;margin:0}.one-list-message .checkbox{margin:0;overflow:hidden;white-space:nowrap}.one-list-message .message-title{overflow:hidden;white-space:nowrap;width:80%}.one-list-message .message-date{overflow:hidden;white-space:nowrap;font-size:11px;line-height:20px;text-align:center;position:absolute;right:10px;font-weight:bold;background:#d8d8d8;padding:0;width:50px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;color:#000}.form-control{height:26px;padding:2px 12px}.input-lg{height:39px}.input-sm{height:18px}.bg-default{background:#d8d8d8 !important}.bg-primary{background:#6aa6d6 !important;color:#f8f8f8 !important}.bg-success{background:#63cc9e !important;color:#f8f8f8 !important}.bg-info{background:#7bc5d3 !important;color:#f8f8f8 !important}.bg-warning{background:#dfd271 !important;color:#f8f8f8 !important}.bg-danger{background:#d15e5e !important;color:#f8f8f8 !important}.txt-default{color:#d8d8d8 !important}.txt-primary{color:#6aa6d6 !important}.txt-success,.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#63cc9e !important}.txt-info{color:#7bc5d3 !important}.txt-warning,.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#dfd271 !important}.txt-danger,.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#d15e5e !important}.has-success .form-control{border-color:#63cc9e}.has-warning .form-control{border-color:#dfd271}.has-error .form-control{border-color:#d15e5e}.has-success .form-control:focus{border-color:#63cc9e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #63cc9e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #63cc9e}.has-warning .form-control:focus{border-color:#dfd271;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dfd271;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dfd271}.has-error .form-control:focus{border-color:#d15e5e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d15e5e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d15e5e}.select2-container-multi .select2-choices{min-height:26px;display:block;height:26px;padding:0 0 0 8px;overflow:hidden;position:relative;border:1px solid #aaa;white-space:nowrap;line-height:26px;color:#444;text-decoration:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-clip:padding-box;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#eee),color-stop(0.5,#fff));background-image:-webkit-linear-gradient(center bottom,#eee 0,#fff 50%);background-image:-moz-linear-gradient(center bottom,#eee 0,#fff 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff',endColorstr = '#eeeeee',GradientType = 0);background-image:linear-gradient(top,#fff 0,#eee 50%)}.select2-container-multi .select2-choices .select2-search-field input{padding:0;margin:0}.has-feedback .form-control-feedback{width:26px;height:26px;line-height:26px}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{min-height:inherit;padding-top:0}.form-horizontal .control-label{padding-top:4px}.input-group-addon{padding:0 6px}.form-group .form-control,.form-group .input-group{margin-bottom:5px}.input-group .form-control{margin:0}#ui-datepicker-div{background:rgba(0,0,0,0.7) !important;border:0}#ui-datepicker-div .ui-widget-header{background:rgba(0,0,0,0.2);border:0;border-bottom:1px solid #686868;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;color:#f8f8f8;padding:1px 0}#ui-datepicker-div.ui-widget-content{color:#f8f8f8 !important}#ui-datepicker-div .ui-state-default,#ui-datepicker-div .ui-widget-content .ui-state-default,#ui-datepicker-div .ui-widget-header .ui-state-default{background:0;border:0;color:#f8f8f8;text-align:center}#ui-datepicker-div .ui-state-hover,#ui-datepicker-div.ui-widget-content .ui-state-hover,#ui-datepicker-div .ui-widget-header .ui-state-hover,#ui-datepicker-div .ui-state-focus,#ui-datepicker-div.ui-widget-content .ui-state-focus,#ui-datepicker-div .ui-widget-header .ui-state-focus,#ui-datepicker-div .ui-state-highlight,#ui-datepicker-div.ui-widget-content .ui-state-highlight,#ui-datepicker-div .ui-widget-header .ui-state-highlight{background:rgba(0,0,0,0.3) !important;border:0;top:2px}#ui-datepicker-div .ui-datepicker-group{border-left:1px solid #686868}#ui-datepicker-div .ui-datepicker-group:first-child{border-left:0}#ui-datepicker-div .ui-datepicker-buttonpane{margin:0}#ui-datepicker-div .ui-datepicker-group table{margin:0 auto !important}.ui-datepicker .ui-datepicker-prev{left:2px !important;cursor:pointer}.ui-datepicker .ui-datepicker-next{right:2px !important;cursor:pointer}.ui-icon-circle-triangle-w{background:url(../img/ui-left.png) 0 0 no-repeat !important}.ui-icon-circle-triangle-e{background:url(../img/ui-right.png) 0 0 no-repeat !important}.ui-icon-circle-arrow-s{background:url(../img/ui-accordion-down.png) 0 0 no-repeat !important}.ui-icon-circle-arrow-e{background:url(../img/ui-accordion-right.png) 0 0 no-repeat !important}#ui-datepicker-div .ui-slider-horizontal{background:rgba(0,0,0,0.5);height:4px;border:0}#ui-datepicker-div .ui-slider-horizontal .ui-slider-handle{background:#d8d8d8 !important;border:1px solid #f8f8f8;height:8px;width:8px;top:-2px;margin-left:-4px;outline:0;cursor:pointer}.ui-spinner-input{margin:0}.ui-spinner .form-control{margin-bottom:0}#tabs.ui-widget-content,#tabs .ui-widget-header{border:0;background:0;padding:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}#tabs .ui-widget-header{border-bottom:1px solid #d8d8d8}#tabs .ui-state-default,#tabs.ui-widget-content .ui-state-default,#tabs .ui-widget-header .ui-state-default{border:0;margin:0 0 -1px 0;background:none !important}#tabs .ui-state-active,#tabs.ui-widget-content .ui-state-active,#tabs .ui-widget-header .ui-state-active{background:none !important}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin:0;padding:0}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{padding:5px 15px;outline:none !important}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{background:#fcfcfc;border:1px solid #d8d8d8;border-bottom:0}.ui-tabs .ui-tabs-nav{padding:0}.ui-tabs .ui-tabs-panel{padding:1em 0}.ui-widget{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.jqstooltip{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;border:0 !important;text-align:center !important;margin:0 !important;width:50px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:0}.ui-accordion .ui-accordion-header{padding:6px 12px;margin:0;top:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.ui-accordion .ui-accordion-icons{padding-left:28px}.ui-accordion-header.ui-state-default{background:#f5f5f5 !important;border:1px solid #fcfcfc;border-left:0;border-right:0}.ui-accordion-header.ui-state-hover,.ui-accordion-header.ui-state-focus{background:#ebebeb !important}.ui-accordion-header.ui-state-active{background:#d8d8d8 !important}.ui-accordion .ui-accordion-content{padding:10px 12px;background:0;border:1px solid #d8d8d8;border-top:0;border-bottom:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}#simple_gallery{text-align:center}#simple_gallery a.fancybox{display:inline-block;padding:5px}#simple_gallery a.fancybox img{width:100%;padding:2px;border:1px solid #979797;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}#simple_gallery a.fancybox img:hover{box-shadow:0 0 10px #c7c7c7}.justifiedGallery{overflow:hidden;width:100%}.jg-row{position:relative;white-space:nowrap}.justifiedGallery .jg-image{position:absolute;display:inline-block;vertical-align:top;margin-left:0}.justifiedGallery .jg-image a{text-decoration:none}.justifiedGallery .jg-image img{border:0}.justifiedGallery .jg-image-label{white-space:normal;font:normal 12px arial;background:#000;color:#fff;position:absolute;left:0;right:0;padding:5px 5px 10px 8px;text-align:left;opacity:0}.ex-tooltip{position:absolute;display:none;z-index:2000}.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style,.ex-tooltip{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:6px 20px;color:#525252;background:rgba(255,255,255,0.8);font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:.25em 0}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:.1em 0}#dashboard-header{margin-bottom:20px}#dashboard_links{padding:0}#dashboard_links .nav{background:#3575a0 url(../img/devoops_pattern_b10.png) 0 0 repeat;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;overflow:hidden}#dashboard_links .nav-stacked>li{border-bottom:1px solid rgba(0,0,0,0.25);border-top:1px solid rgba(255,255,255,0.12);font-size:12px;font-weight:700;line-height:15px;padding:0;margin:0}#dashboard_links .nav-pills>li>a{color:#f8f8f8;display:block;padding:20px 10px 20px 15px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;outline:0}#dashboard_links .nav-pills>li.active{border-top-color:rgba(0,0,0,0.11);position:relative;margin:0}#dashboard_links .nav-pills>li.active>a,#dashboard_links .nav-pills>li.active>a:hover,#dashboard_links .nav-pills>li.active>a:focus,#dashboard_links .nav>li>a:hover,#dashboard_links .nav>li>a:focus{background:rgba(0,0,0,0.1)}#dashboard_links .nav-pills>li.active>a:before{font-family:FontAwesome;content:"\f0da";position:absolute;left:-2px;font-size:30px;color:#f8f8f8}#dashboard_tabs{background:#f8f8f8;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}#dashboard-overview{padding-bottom:15px}.sparkline-dashboard{float:left;margin-right:10px;text-align:center}.sparkline-dashboard-info{float:left;display:block;text-align:center}.sparkline-dashboard-info span{display:block;font-weight:bold;color:#b25050}#ow-marketplace{margin-top:20px}.ow-server{padding-top:8px;padding-bottom:25px}.ow-server:hover{background:#e7e7e7}.ow-server .page-header{padding-bottom:3px}.ow-server h4 i{position:absolute;left:15px}.ow-server small{position:absolute;right:15px;top:51px}.ow-server-bottom{margin-top:25px}.ow-server-bottom .knob-slider{font-size:11px}#ow-server-footer{overflow:hidden;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.ow-settings{position:absolute;top:7px;left:40px;display:none}.ow-settings a{color:#525252}.ow-server:hover .ow-settings{display:block}#ow-server-footer a{display:block;padding:10px 0;border-left:1px solid #f8f8f8;text-decoration:none}#ow-server-footer a:first-child{border-left:0}#ow-server-footer span{display:block}.m-table>thead>tr>th,.m-table>tbody>tr>th,.m-table>tfoot>tr>th,.m-table>thead>tr>td,.m-table>tbody>tr>td,.m-table>tfoot>tr>td{vertical-align:middle;padding:2px 5px}.m-ticker span{display:block;font-size:.8em;line-height:1em}.m-price{text-align:right}.m-change .fa-angle-up{color:#54ae86;font-weight:bold}.m-change .fa-angle-down{color:#b25050;font-weight:bold}#ow-summary{font-size:12px}#ow-summary b{float:right;padding:1px 4px;margin:1px;border:1px solid #d8d8d8;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}#ow-donut{margin:0 0 20px}#ow-donut>div{padding:0}#ow-activity .row{margin:0 0 0 -15px;font-size:13px}#ow-setting{border:1px solid #c7c7c7;padding:0;position:absolute;width:158px;height:28px;top:1px;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;opacity:0;right:-200px;-webkit-transition:.1s;-moz-transition:.1s;-o-transition:.1s;transition:.1s}#ow-marketplace:hover #ow-setting{opacity:1;right:15px}#ow-setting a{text-align:center;float:left;margin-left:10px;color:#d8d8d8;font-size:16px;display:block;line-height:28px;width:20px;height:26px;-webkit-transition:.1s;-moz-transition:.1s;-o-transition:.1s;transition:.1s}#ow-setting a:hover{font-size:16px;color:#222;line-height:24px}#ow-licenced{margin:20px 0}#ow-licenced .row{margin:0}#ow-stat .row{margin:0}#dashboard-clients .one-list-message{background:0;padding:10px 15px}#dashboard-clients .one-list-message:last-child{border-bottom:0}#dashboard-clients .one-list-message .message-date{position:relative;width:auto;right:auto;left:15px;padding:0 15px}.btn+.dropdown-menu{margin-top:-10px;background:rgba(0,0,0,0.7) !important;padding:0;border:0;right:0;left:auto;min-width:100%}.btn+.dropdown-menu>li>a{padding:5px 10px !important;color:#f0f0f0}.v-txt{-moz-transform:rotate(-90deg);-webkit-transform:rotate(-90deg);-o-transform:rotate(-90deg);position:absolute;top:60px;left:-20px;color:#d8d8d8;font-size:18px;box-shadow:0 0 10px #d8d8d8;padding:0 5px}.full-calendar{padding:25px 0;background:#fcfcfc}.external-event{padding:2px 6px;margin:4px 0;background:#f5f5f5}.external-event:hover{cursor:move;background:#6aa6d6;color:#f8f8f8}#add-new-event{background:#ebebeb;margin-bottom:30px;padding:10px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.modal-backdrop{z-index:2000}.modal{z-index:2001}.fc-event{border:1px solid #6aa6d6;background-color:#6aa6d6}.qq-upload-drop-area{position:absolute;background:#fcfcfc;width:100%;height:100%}.qq-upload-button{float:right;margin:20px 15px 0 0}.qq-upload-list{position:relative;z-index:3;margin:60px 15px 0;padding:0;list-style:none}.qq-upload-list li{position:relative;display:inline-block;padding:15px;margin:15px;border:1px solid #e6e6e6;text-align:center;font-size:12px;background:rgba(245,245,245,0.9)}.qq-upload-settings{opacity:0;visibility:hidden;bottom:0;position:absolute;width:100%;left:0;padding:7px 0;background:#FFF;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}.qq-upload-list li:hover .qq-upload-settings{opacity:1;visibility:visible}.qq-upload-list li img{border:1px solid #b4b4b4;margin-bottom:5px}.qq-upload-filename{display:block;overflow:hidden}.qq-upload-file,.qq-upload-size,.qq-upload-status-text{display:block}.qq-dropped-zone{position:absolute;top:5%;left:50%;margin-left:-71px;text-align:center;font-weight:bold}.qq-dropped-zone i{font-size:5em;display:block;color:#f5f5f5;text-shadow:0 -1px 1px #d8d8d8}#page-500 h1,.page-404 h1{font-size:5em}.page-404 .form-inline{margin:40px auto;width:60%;padding:15px;background:#fafafa;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.page-404 .input-group-btn:last-child>.btn,.page-404 .input-group-btn:last-child>.btn-group{margin-left:-1px;margin-bottom:0;height:39px}#page-500 h3,.page-404 h3{margin:5px 0 20px}.preloader{position:absolute;width:100%;height:100%;left:0;background:#ebebeb;z-index:2000}.devoops-getdata{position:absolute;top:25px;left:15px;color:#ebebeb}#page-500,#page-login{position:absolute;height:100%;width:100%}#page-500{background:#ebebeb}#page-500 img{display:block;margin:30px auto}#page-login .logo{position:absolute}#page-login h3{font-size:20px;font-family:'Righteous',cursive}#page-login .text-right{margin-top:15px}#page-login .box{margin-top:15%}.one-result{margin-top:20px}.one-result p{margin:0}.large{font-size:1.25em}.nav-search>li.active>a{background:#f0f0f0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#525252;border-bottom:1px solid #cecece;font-weight:bold}.page-feed .avatar{width:60px;float:left;margin:10px 15px;text-align:center;overflow:hidden}.page-feed .avatar img{width:60px;height:60px;border:1px solid #f8f8f8}.page-feed-content{position:relative;padding:3px 15px 5px;background:#fcfcfc;margin-left:90px;min-height:80px}.page-feed-content small.time{font-style:italic}.page-feed .page-feed-content:before{font-family:FontAwesome;content:"\f0d9";position:absolute;left:-10px;top:15px;font-size:30px;color:#fcfcfc}.likebox{overflow:hidden}.likebox .navbar-nav{margin:0}.likebox .navbar-nav li{margin-right:15px;float:left}.likebox .fa-thumbs-up{color:#6aa6d6}.likebox .fa-thumbs-down{color:#d15e5e}#modalbox{display:none;position:fixed;overflow:auto;overflow-x:hidden;top:0;right:0;bottom:0;left:0;z-index:5000;background:rgba(0,0,0,0.8)}#modalbox .devoops-modal{position:absolute;top:90px;margin-left:-300px;left:50%;border:1px solid #f8f8f8;box-shadow:0 0 20px #6aa6d6;background:transparent;margin-bottom:20px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;width:600px;z-index:6000}#modalbox .devoops-modal-header{color:#363636;font-size:16px;position:relative;overflow:hidden;background:#f5f5f5;border-bottom:1px solid #e4e4e4;height:28px}#modalbox .devoops-modal-inner{position:relative;overflow:hidden;padding:15px;background:#fcfcfc}#modalbox .devoops-modal-bottom{position:relative;overflow:hidden;padding:15px;background:#d8d8d8}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:4px 10px;margin-left:-1px;line-height:1.428571429;color:#969696;text-decoration:none;background-color:#f5f5f5;border:1px solid #d8d8d8}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#8a8a8a;background-color:#eee}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#979797;cursor:not-allowed;background-color:#fcfcfc;border-color:#d8d8d8}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#6aa6d6;border-color:#6aa6d6}.fancybox-nav{position:fixed;width:50%}.fancybox-close{position:fixed;top:20px;right:36px;background:url(../img/times.png) 0 0 no-repeat}.fancybox-prev span{left:21px;background:url(../img/chevron-left.png) 0 0 no-repeat}.fancybox-next span{right:36px;background:url(../img/chevron-right.png) 0 0 no-repeat}#social a{margin:10px 3px;color:#666;display:block;float:left}#event_delete{margin-left:20px}@media(min-width:768px){#sidebar-left.col-sm-2{opacity:1;width:16.666666666666664%;padding:0 15px}.sidebar-show #sidebar-left.col-sm-2{opacity:0;width:0;padding:0}.sidebar-show #content.col-sm-10{opacity:1;width:100%}.page-404 .form-inline{width:60%}}@media(min-width:992px){.nav.main-menu>li>a,.nav.msg-menu>li>a{text-align:left}.nav.main-menu>li>a>i,.nav.msg-menu>li>a>i{font-size:14px;width:20px;display:inline-block}.main-menu .dropdown-menu{position:relative;z-index:inherit;left:0;margin:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background:rgba(0,0,0,0.2);visibility:visible}.main-menu .dropdown-menu>li>a{-webkit-border-radius:0 !important;-moz-border-radius:0 !important;border-radius:0 !important}.page-404 .form-inline{width:40%}}@media(max-width:767px){#main{margin-top:100px}#messages-menu{top:140px}.page-404 .form-inline{width:100%}#dashboard_links .nav{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}#dashboard_links .nav-stacked>li{float:left}#dashboard_links .nav-pills>li>a{padding:15px}#dashboard_links .nav-pills>li.active>a:before{bottom:0;left:50%;margin-left:-9px}}@media(max-width:620px){.user-mini{display:none}}@media(max-width:400px){.panel-menu a.account{padding:5px 0 5px 0}.avatar{margin:0}.panel-menu i.pull-right{margin-left:0}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background:0}#dashboard_links .nav-stacked>li{float:none}#dashboard_links .nav-pills>li.active>a:before{display:none}}#chat {width: 100%;height: 40em;overflow: auto;margin-bottom: 15px} diff --git a/plugins/web_gui/static/fonts/glyphicons-halflings-regular.eot b/plugins/web_gui/static/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..423bd5d Binary files /dev/null and b/plugins/web_gui/static/fonts/glyphicons-halflings-regular.eot differ diff --git a/plugins/web_gui/static/fonts/glyphicons-halflings-regular.svg b/plugins/web_gui/static/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..4469488 --- /dev/null +++ b/plugins/web_gui/static/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/web_gui/static/fonts/glyphicons-halflings-regular.ttf b/plugins/web_gui/static/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..a498ef4 Binary files /dev/null and b/plugins/web_gui/static/fonts/glyphicons-halflings-regular.ttf differ diff --git a/plugins/web_gui/static/fonts/glyphicons-halflings-regular.woff b/plugins/web_gui/static/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..d83c539 Binary files /dev/null and b/plugins/web_gui/static/fonts/glyphicons-halflings-regular.woff differ diff --git a/plugins/web_gui/static/images/bg.jpg b/plugins/web_gui/static/images/bg.jpg new file mode 100644 index 0000000..87baa37 Binary files /dev/null and b/plugins/web_gui/static/images/bg.jpg differ diff --git a/plugins/web_gui/static/images/bullet.gif b/plugins/web_gui/static/images/bullet.gif new file mode 100644 index 0000000..c301719 Binary files /dev/null and b/plugins/web_gui/static/images/bullet.gif differ diff --git a/plugins/web_gui/static/images/clock.gif b/plugins/web_gui/static/images/clock.gif new file mode 100644 index 0000000..df5d85d Binary files /dev/null and b/plugins/web_gui/static/images/clock.gif differ diff --git a/plugins/web_gui/static/images/comment.gif b/plugins/web_gui/static/images/comment.gif new file mode 100644 index 0000000..951082f Binary files /dev/null and b/plugins/web_gui/static/images/comment.gif differ diff --git a/plugins/web_gui/static/images/favicon.ico b/plugins/web_gui/static/images/favicon.ico new file mode 100644 index 0000000..b45d529 Binary files /dev/null and b/plugins/web_gui/static/images/favicon.ico differ diff --git a/plugins/web_gui/static/images/gradientbg.jpg b/plugins/web_gui/static/images/gradientbg.jpg new file mode 100644 index 0000000..ed88f4c Binary files /dev/null and b/plugins/web_gui/static/images/gradientbg.jpg differ diff --git a/plugins/web_gui/static/images/page.gif b/plugins/web_gui/static/images/page.gif new file mode 100644 index 0000000..0c49ba8 Binary files /dev/null and b/plugins/web_gui/static/images/page.gif differ diff --git a/plugins/web_gui/static/img/chevron-left.png b/plugins/web_gui/static/img/chevron-left.png new file mode 100644 index 0000000..a9a1209 Binary files /dev/null and b/plugins/web_gui/static/img/chevron-left.png differ diff --git a/plugins/web_gui/static/img/chevron-right.png b/plugins/web_gui/static/img/chevron-right.png new file mode 100644 index 0000000..61de886 Binary files /dev/null and b/plugins/web_gui/static/img/chevron-right.png differ diff --git a/plugins/web_gui/static/img/devoops_getdata.gif b/plugins/web_gui/static/img/devoops_getdata.gif new file mode 100644 index 0000000..891304a Binary files /dev/null and b/plugins/web_gui/static/img/devoops_getdata.gif differ diff --git a/plugins/web_gui/static/img/devoops_pattern_b10.png b/plugins/web_gui/static/img/devoops_pattern_b10.png new file mode 100644 index 0000000..4c19cb6 Binary files /dev/null and b/plugins/web_gui/static/img/devoops_pattern_b10.png differ diff --git a/plugins/web_gui/static/img/logo-200.png b/plugins/web_gui/static/img/logo-200.png new file mode 100644 index 0000000..551b91c Binary files /dev/null and b/plugins/web_gui/static/img/logo-200.png differ diff --git a/plugins/web_gui/static/img/logo.png b/plugins/web_gui/static/img/logo.png new file mode 100644 index 0000000..ddd816d Binary files /dev/null and b/plugins/web_gui/static/img/logo.png differ diff --git a/plugins/web_gui/static/img/sort-asc.png b/plugins/web_gui/static/img/sort-asc.png new file mode 100644 index 0000000..4a912e4 Binary files /dev/null and b/plugins/web_gui/static/img/sort-asc.png differ diff --git a/plugins/web_gui/static/img/sort-desc.png b/plugins/web_gui/static/img/sort-desc.png new file mode 100644 index 0000000..7f4ace0 Binary files /dev/null and b/plugins/web_gui/static/img/sort-desc.png differ diff --git a/plugins/web_gui/static/img/sort.png b/plugins/web_gui/static/img/sort.png new file mode 100644 index 0000000..337ff81 Binary files /dev/null and b/plugins/web_gui/static/img/sort.png differ diff --git a/plugins/web_gui/static/img/times.png b/plugins/web_gui/static/img/times.png new file mode 100644 index 0000000..f109341 Binary files /dev/null and b/plugins/web_gui/static/img/times.png differ diff --git a/plugins/web_gui/static/img/ui-accordion-down.png b/plugins/web_gui/static/img/ui-accordion-down.png new file mode 100644 index 0000000..c2e0675 Binary files /dev/null and b/plugins/web_gui/static/img/ui-accordion-down.png differ diff --git a/plugins/web_gui/static/img/ui-accordion-right.png b/plugins/web_gui/static/img/ui-accordion-right.png new file mode 100644 index 0000000..972a3d5 Binary files /dev/null and b/plugins/web_gui/static/img/ui-accordion-right.png differ diff --git a/plugins/web_gui/static/img/ui-left.png b/plugins/web_gui/static/img/ui-left.png new file mode 100644 index 0000000..dd7e49f Binary files /dev/null and b/plugins/web_gui/static/img/ui-left.png differ diff --git a/plugins/web_gui/static/img/ui-right.png b/plugins/web_gui/static/img/ui-right.png new file mode 100644 index 0000000..dba43d6 Binary files /dev/null and b/plugins/web_gui/static/img/ui-right.png differ diff --git a/plugins/web_gui/static/index.html b/plugins/web_gui/static/index.html new file mode 100644 index 0000000..cbf1858 --- /dev/null +++ b/plugins/web_gui/static/index.html @@ -0,0 +1,126 @@ + + + + + StarryPy WebGUI + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+ preloader +
+
+
+ +
+
+ + + + + + + + diff --git a/plugins/web_gui/static/js/bootstrap-sortable.js b/plugins/web_gui/static/js/bootstrap-sortable.js new file mode 100644 index 0000000..d23d884 --- /dev/null +++ b/plugins/web_gui/static/js/bootstrap-sortable.js @@ -0,0 +1,129 @@ +/* TINY SORT modified according to this https://github.com/Sjeiti/TinySort/pull/51*/ +(function (e, t) { function h(e) { return e && e.toLowerCase ? e.toLowerCase() : e } function p(e, t) { for (var r = 0, i = e.length; r < i; r++) if (e[r] == t) return !n; return n } var n = !1, r = null, i = parseFloat, s = Math.min, o = /(-?\d+\.?\d*)$/g, u = /(\d+\.?\d*)$/g, a = [], f = [], l = function (e) { return typeof e == "string" }, c = Array.prototype.indexOf || function (e) { var t = this.length, n = Number(arguments[1]) || 0; n = n < 0 ? Math.ceil(n) : Math.floor(n); if (n < 0) n += t; for (; n < t; n++) { if (n in this && this[n] === e) return n } return -1 }; e.tinysort = { id: "TinySort", version: "1.5.2", copyright: "Copyright (c) 2008-2013 Ron Valstar", uri: "http://tinysort.sjeiti.com/", licensed: { MIT: "http://www.opensource.org/licenses/mit-license.php", GPL: "http://www.gnu.org/licenses/gpl.html" }, plugin: function () { var e = function (e, t) { a.push(e); f.push(t) }; e.indexOf = c; return e }(), defaults: { order: "asc", attr: r, data: r, useVal: n, place: "start", returns: n, cases: n, forceStrings: n, ignoreDashes: n, sortFunction: r } }; e.fn.extend({ tinysort: function () { var d, v, m = this, g = [], y = [], b = [], w = [], E = 0, S, x = [], T = [], N = function (t) { e.each(a, function (e, n) { n.call(n, t) }) }, C = function (t, r) { var s = 0; if (E !== 0) E = 0; while (s === 0 && E < S) { var a = w[E], c = a.oSettings, p = c.ignoreDashes ? u : o; N(c); if (c.sortFunction) { s = c.sortFunction(t, r) } else if (c.order == "rand") { s = Math.random() < .5 ? 1 : -1 } else { var d = n, v = !c.cases ? h(t.s[E]) : t.s[E], m = !c.cases ? h(r.s[E]) : r.s[E]; v = v.replace(/^\s*/i, "").replace(/\s*$/i, ""); m = m.replace(/^\s*/i, "").replace(/\s*$/i, ""); if (!A.forceStrings) { var g = l(v) ? v && v.match(p) : n, y = l(m) ? m && m.match(p) : n; if (g && y) { var b = v.substr(0, v.length - g[0].length), x = m.substr(0, m.length - y[0].length); if (b == x) { d = !n; v = i(g[0]); m = i(y[0]) } } } s = a.iAsc * (v < m ? -1 : v > m ? 1 : 0) } e.each(f, function (e, t) { s = t.call(t, d, v, m, s) }); if (s === 0) E++ } return s }; for (d = 0, v = arguments.length; d < v; d++) { var k = arguments[d]; if (l(k)) { if (x.push(k) - 1 > T.length) T.length = x.length - 1 } else { if (T.push(k) > x.length) x.length = T.length } } if (x.length > T.length) T.length = x.length; S = x.length; if (S === 0) { S = x.length = 1; T.push({}) } for (d = 0, v = S; d < v; d++) { var L = x[d], A = e.extend({}, e.tinysort.defaults, T[d]), O = !(!L || L == ""), M = O && L[0] == ":"; w.push({ sFind: L, oSettings: A, bFind: O, bAttr: !(A.attr === r || A.attr == ""), bData: A.data !== r, bFilter: M, $Filter: M ? m.filter(L) : m, fnSort: A.sortFunction, iAsc: A.order == "asc" ? 1 : -1 }) } m.each(function (n, r) { var i = e(r), s = i.parent().get(0), o, u = []; for (j = 0; j < S; j++) { var a = w[j], f = a.bFind ? a.bFilter ? a.$Filter.filter(r) : i.find(a.sFind) : i; u.push(a.bData ? f.data(a.oSettings.data) : a.bAttr ? f.attr(a.oSettings.attr) : a.oSettings.useVal ? f.val() : f.text()); if (o === t) o = f } var l = c.call(b, s); if (l < 0) { l = b.push(s) - 1; y[l] = { s: [], n: [] } } if (o.length > 0) y[l].s.push({ s: u, e: i, n: n }); else y[l].n.push({ e: i, n: n }) }); e.each(y, function (e, t) { t.s.sort(C) }); e.each(y, function (t, r) { var i = r.s.length, o = [], u = i, a = [0, 0]; switch (A.place) { case "first": e.each(r.s, function (e, t) { u = s(u, t.n) }); break; case "org": e.each(r.s, function (e, t) { o.push(t.n) }); break; case "end": u = r.n.length; break; default: u = 0 } for (d = 0; d < i; d++) { var f = p(o, d) ? !n : d >= u && d < u + r.s.length, l = (f ? r.s : r.n)[a[f ? 0 : 1]].e; l.parent().append(l); if (f || !A.returns) g.push(l.get(0)); a[f ? 0 : 1]++ } }); m.length = 0; Array.prototype.push.apply(m, g); return m } }); e.fn.TinySort = e.fn.Tinysort = e.fn.tsort = e.fn.tinysort })(jQuery); + +(function ($) { + + var $document = $(document), + bsSort = [], + lastSort, + signClass; + + $.bootstrapSortable = function (applyLast, sign) { + + // check if moment.js is available + var momentJsAvailable = (typeof moment !== 'undefined'); + + //Set class based on sign parameter + signClass = !sign ? "arrow" : sign; + + // set attributes needed for sorting + $('table.sortable').each(function () { + var $this = $(this); + applyLast = (applyLast === true); + $this.find('span.sign').remove(); + $this.find('thead tr').each(function (rowIndex) { + var columnsSkipped = 0; + $(this).find('th').each(function (columnIndex) { + var $this = $(this); + $this.attr('data-sortcolumn', columnIndex + columnsSkipped); + $this.attr('data-sortkey', columnIndex + '-' + rowIndex); + if ($this.attr("colspan") !== undefined) { + columnsSkipped += parseInt($this.attr("colspan")) - 1; + } + }); + }); + $this.find('td').each(function () { + var $this = $(this); + if ($this.attr('data-dateformat') != undefined && momentJsAvailable) { + $this.attr('data-value', moment($this.text(), $this.attr('data-dateformat')).format('YYYY/MM/DD/HH/mm/ss')); + } + else { + $this.attr('data-value') === undefined && $this.attr('data-value', $this.text()); + } + }); + $this.find('thead th[data-defaultsort!="disabled"]').each(function (index) { + var $this = $(this); + var $sortTable = $this.closest('table.sortable'); + $this.data('sortTable', $sortTable); + var sortKey = $this.attr('data-sortkey'); + var thisLastSort = applyLast ? lastSort : -1; + bsSort[sortKey] = applyLast ? bsSort[sortKey] : $this.attr('data-defaultsort'); + if (bsSort[sortKey] != null && (applyLast == (sortKey == thisLastSort))) { + bsSort[sortKey] = bsSort[sortKey] == 'asc' ? 'desc' : 'asc'; + doSort($this, $sortTable) + } + }); + $this.trigger('sorted'); + }); + }; + + // add click event to table header + $document.on('click', 'table.sortable thead th[data-defaultsort!="disabled"]', function (e) { + var $this = $(this), $table = $this.data('sortTable') || $this.closest('table.sortable'); + doSort($this, $table); + $table.trigger('sorted'); + }); + + //Sorting mechanism separated + function doSort($this, $table) { + var sortColumn = $this.attr('data-sortcolumn'); + + var colspan = $this.attr('colspan'); + if (colspan) { + var selector; + for (var i = parseFloat(sortColumn) ; i < parseFloat(sortColumn) + parseFloat(colspan) ; i++) { + selector = selector + ', [data-sortcolumn="' + i + '"]'; + } + var subHeader = $(selector).not('[colspan]'); + var mainSort = subHeader.filter('[data-mainsort]').eq(0); + + sortColumn = mainSort.length ? mainSort : subHeader.eq(0); + doSort(sortColumn, $table); + return; + } + + //sortColumn = newColumn ? newColumn : sortColumn; + + var localSignClass = $this.attr('data-defaultsign') || signClass; + // update arrow icon + if ($.browser.mozilla) { + var moz_arrow = $table.find('div.mozilla'); + if (moz_arrow != null) { + moz_arrow.parent().html(moz_arrow.text()); + } + $this.wrapInner('
'); + $this.children().eq(0).append(''); + } + else { + $table.find('span.sign').remove(); + $this.append(''); + } + + // sort direction + + var sortKey = $this.attr('data-sortkey'); + + lastSort = sortKey; + bsSort[sortKey] = bsSort[sortKey] == 'asc' ? 'desc' : 'asc'; + if (bsSort[sortKey] == 'desc') { $this.find('span.sign').addClass('up'); } + + // sort rows + var rows = $table.find('tbody tr'); + rows.tsort('td:eq(' + sortColumn + ')', { order: bsSort[sortKey], attr: 'data-value' }); + } + + // jQuery 1.9 removed this object + if (!$.browser) { + $.browser = { chrome: false, mozilla: false, opera: false, msie: false, safari: false }; + var ua = navigator.userAgent; + $.each($.browser, function (c) { + $.browser[c] = ((new RegExp(c, 'i').test(ua))) ? true : false; + if ($.browser.mozilla && c == 'mozilla') { $.browser.mozilla = ((new RegExp('firefox', 'i').test(ua))) ? true : false; } + if ($.browser.chrome && c == 'safari') { $.browser.safari = false; } + }); + } + + // Initialise on DOM ready + $($.bootstrapSortable); + +}(jQuery)); diff --git a/plugins/web_gui/static/js/devoops.min.js b/plugins/web_gui/static/js/devoops.min.js new file mode 100644 index 0000000..be8b8dc --- /dev/null +++ b/plugins/web_gui/static/js/devoops.min.js @@ -0,0 +1 @@ +"use strict";function LoadCalendarScript(callback){function LoadFullCalendarScript(){if(!$.fn.fullCalendar)$.getScript('plugins/fullcalendar/fullcalendar.js',callback);else if(callback&&typeof callback==="function")callback();}if(!$.fn.moment)$.getScript('plugins/moment/moment.min.js',LoadFullCalendarScript);else LoadFullCalendarScript();}function LoadOpenLayersScript(callback){if(!$.fn.OpenLayers)$.getScript('http://www.openlayers.org/api/OpenLayers.js',callback);else if(callback&&typeof callback==="function")callback();}function LoadTimePickerScript(callback){if(!$.fn.timepicker)$.getScript('plugins/jquery-ui-timepicker-addon/jquery-ui-timepicker-addon.min.js',callback);else if(callback&&typeof callback==="function")callback();}function LoadBootstrapValidatorScript(callback){if(!$.fn.bootstrapValidator)$.getScript('plugins/bootstrapvalidator/bootstrapValidator.min.js',callback);else if(callback&&typeof callback==="function")callback();}function LoadSelect2Script(callback){if(!$.fn.select2)$.getScript('plugins/select2/select2.min.js',callback);else if(callback&&typeof callback==="function")callback();}function LoadDataTablesScripts(callback){function LoadDatatables(){$.getScript('plugins/datatables/jquery.dataTables.js',function(){$.getScript('plugins/datatables/ZeroClipboard.js',function(){$.getScript('plugins/datatables/TableTools.js',function(){$.getScript('plugins/datatables/dataTables.bootstrap.js',callback);});});});}if(!$.fn.dataTables)LoadDatatables();else if(callback&&typeof callback==="function")callback();}function LoadFineUploader(callback){if(!$.fn.fineuploader)$.getScript('plugins/fineuploader/jquery.fineuploader-4.3.1.min.js',callback);else if(callback&&typeof callback==="function")callback();}function LoadXChartScript(callback){function LoadXChart(){$.getScript('plugins/xcharts/xcharts.min.js',callback);}function LoadD3Script(){if(!$.fn.d3)$.getScript('plugins/d3/d3.v3.min.js',LoadXChart);else LoadXChart();}if(!$.fn.xcharts)LoadD3Script();else if(callback&&typeof callback==="function")callback();}function LoadFlotScripts(callback){function LoadFlotScript(){$.getScript('plugins/flot/jquery.flot.js',LoadFlotResizeScript);}function LoadFlotResizeScript(){$.getScript('plugins/flot/jquery.flot.resize.js',LoadFlotTimeScript);}function LoadFlotTimeScript(){$.getScript('plugins/flot/jquery.flot.time.js',callback);}if(!$.fn.flot)LoadFlotScript();else if(callback&&typeof callback==="function")callback();}function LoadMorrisScripts(callback){function LoadMorrisScript(){if(!$.fn.Morris)$.getScript('plugins/morris/morris.min.js',callback);else if(callback&&typeof callback==="function")callback();}if(!$.fn.raphael)$.getScript('plugins/raphael/raphael-min.js',LoadMorrisScript);else LoadMorrisScript();}function LoadFancyboxScript(callback){if(!$.fn.fancybox)$.getScript('plugins/fancybox/jquery.fancybox.js',callback);else if(callback&&typeof callback==="function")callback();}function LoadKnobScripts(callback){if(!$.fn.knob)$.getScript('plugins/jQuery-Knob/jquery.knob.js',callback);else if(callback&&typeof callback==="function")callback();}function LoadSparkLineScript(callback){if(!$.fn.sparkline)$.getScript('plugins/sparkline/jquery.sparkline.min.js',callback);else if(callback&&typeof callback==="function")callback();}function LoadAjaxContent(url){$('.preloader').show();$.ajax({mimeType:'text/html; charset=utf-8',url:url,type:'GET',success:function(data){$('#ajax-content').html(data);$('.preloader').hide();},error:function(jqXHR,textStatus,errorThrown){alert(errorThrown);},dataType:"html",async:false});}function WinMove(){$("div.box").not('.no-drop').draggable({revert:true,zIndex:2000,cursor:"crosshair",handle:'.box-name',opacity:0.8}).droppable({tolerance:'pointer',drop:function(event,ui){var draggable=ui.draggable;var droppable=$(this);var dragPos=draggable.position();var dropPos=droppable.position();draggable.swap(droppable);setTimeout(function(){var dropmap=droppable.find('[id^=map-]');var dragmap=draggable.find('[id^=map-]');if(dragmap.length>0||dropmap.length>0){dragmap.resize();dropmap.resize();}else{draggable.resize();droppable.resize();}},50);setTimeout(function(){draggable.find('[id^=map-]').resize();droppable.find('[id^=map-]').resize();},250);}});}jQuery.fn.swap=function(b){b=jQuery(b)[0];var a=this[0];var t=a.parentNode.insertBefore(document.createTextNode(''),a);b.parentNode.insertBefore(a,b);t.parentNode.insertBefore(b,t);t.parentNode.removeChild(t);return this;};function ScreenSaver(){var canvas=document.getElementById("canvas");var ctx=canvas.getContext("2d");var W=window.innerWidth;var H=window.innerHeight;canvas.width=W;canvas.height=H;var particles=[];for(var i=0;i<25;i++)particles.push(new Particle());function Particle(){this.location={x:Math.random()*W,y:Math.random()*H};this.radius=0;this.speed=3;this.angle=Math.random()*360;var r=Math.round(Math.random()*255);var g=Math.round(Math.random()*255);var b=Math.round(Math.random()*255);var a=Math.random();this.rgba="rgba("+r+", "+g+", "+b+", "+a+")";}function draw(){ctx.globalCompositeOperation="source-over";ctx.fillStyle="rgba(0, 0, 0, 0.02)";ctx.fillRect(0,0,W,H);ctx.globalCompositeOperation="lighter";for(var i=0;iW)p.location.x=0;if(p.location.y<0)p.location.y=H;if(p.location.y>H)p.location.y=0;}}setInterval(draw,30);}function drawGoogleChart(chart_data,chart_options,element,chart_type){var data=google.visualization.arrayToDataTable(chart_data);var chart=new chart_type(document.getElementById(element));chart.draw(data,chart_options);}function DrawKnob(elem){elem.knob({change:function(value){},release:function(value){console.log("release : "+value);},cancel:function(){console.log("cancel : ",this);},draw:function(){if(this.$.data('skin')=='tron'){var a=this.angle(this.cv);var sa=this.startAngle;var sat=this.startAngle;var ea;var eat=sat+a;var r=1;this.g.lineWidth=this.lineWidth;this.o.cursor&&(sat=eat-0.3)&&(eat=eat+0.3);if(this.o.displayPrevious){ea=this.startAngle+this.angle(this.v);this.o.cursor&&(sa=ea-0.3)&&(ea=ea+0.3);this.g.beginPath();this.g.strokeStyle=this.pColor;this.g.arc(this.xy,this.xy,this.radius-this.lineWidth,sa,ea,false);this.g.stroke();}this.g.beginPath();this.g.strokeStyle=r?this.o.fgColor:this.fgColor;this.g.arc(this.xy,this.xy,this.radius-this.lineWidth,sat,eat,false);this.g.stroke();this.g.lineWidth=2;this.g.beginPath();this.g.strokeStyle=this.o.fgColor;this.g.arc(this.xy,this.xy,this.radius-this.lineWidth+1+this.lineWidth*2/3,0,2*Math.PI,false);this.g.stroke();return false;}}});var v;var up=0;var down=0;var i=0;var $idir=$("div.idir");var $ival=$("div.ival");var incr=function(){i++;$idir.show().html("+").fadeOut();$ival.html(i);};var decr=function(){i--;$idir.show().html("-").fadeOut();$ival.html(i);};$("input.infinite").knob({min:0,max:20,stopper:false,change:function(){if(v>this.cv)if(up){decr();up=0;}else{up=1;down=0;}else if(v1)map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':true}));map.addControl(new OpenLayers.Control.Permalink());map.addControl(new OpenLayers.Control.MousePosition({displayProjection:epsg4326}));return map;}function PrettyDates(){var currDate=new Date();var year=currDate.getFullYear();var month=currDate.getMonth()+1;var startmonth=1;if(month>3)startmonth=month-2;if(startmonth<=9)startmonth='0'+startmonth;if(month<=9)month='0'+month;var day=currDate.getDate();if(day<=9)day='0'+day;var startdate=year+'-'+startmonth+'-01';var enddate=year+'-'+month+'-'+day;return [startdate,enddate];}function SetMinBlockHeight(elem){elem.css('min-height',window.innerHeight-49);}function MessagesMenuWidth(){var W=window.innerWidth;var W_menu=$('#sidebar-left').outerWidth();var w_messages=(W-W_menu)*16.666666666666664/100;$('#messages-menu').width(w_messages);}function DashboardTabChecker(){$('#content').on('click','a.tab-link',function(e){e.preventDefault();$('div#dashboard_tabs').find('div[id^=dashboard]').each(function(){$(this).css('visibility','hidden').css('position','absolute');});var attr=$(this).attr('id');$('#'+'dashboard-'+attr).css('visibility','visible').css('position','relative');$(this).closest('.nav').find('li').removeClass('active');$(this).closest('li').addClass('active');});}function TinyMCEStart(elem,mode){var plugins=[];if(mode=='extreme')plugins=["advlist anchor autolink autoresize autosave bbcode charmap code contextmenu directionality ","emoticons fullpage fullscreen hr image insertdatetime layer legacyoutput","link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace","tabfocus table template textcolor visualblocks visualchars wordcount"];tinymce.init({selector:elem,theme:"modern",plugins:plugins,toolbar:"insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image | print preview media fullpage | forecolor backcolor emoticons",style_formats:[{title:'Header 2',block:'h2',classes:'page-header'},{title:'Header 3',block:'h3',classes:'page-header'},{title:'Header 4',block:'h4',classes:'page-header'},{title:'Header 5',block:'h5',classes:'page-header'},{title:'Header 6',block:'h6',classes:'page-header'},{title:'Bold text',inline:'b'},{title:'Red text',inline:'span',styles:{color:'#ff0000'}},{title:'Red header',block:'h1',styles:{color:'#ff0000'}},{title:'Example 1',inline:'span',classes:'example1'},{title:'Example 2',inline:'span',classes:'example2'},{title:'Table styles'},{title:'Table row 1',selector:'tr',classes:'tablerow1'}]});}function SparkLineDrawBarGraph(elem,arr,color){if(color)var stacked_color=color;else stacked_color='#6AA6D6';elem.sparkline(arr,{type:'bar',barWidth:7,highlightColor:'#000',barSpacing:2,height:40,stackedBarColor:stacked_color});}function OpenModalBox(header,inner,bottom){var modalbox=$('#modalbox');modalbox.find('.modal-header-name span').html(header);modalbox.find('.devoops-modal-inner').html(inner);modalbox.find('.devoops-modal-bottom').html(bottom);modalbox.fadeIn('fast');$('body').addClass("body-expanded");}function CloseModalBox(){var modalbox=$('#modalbox');modalbox.fadeOut('fast',function(){modalbox.find('.modal-header-name span').children().remove();modalbox.find('.devoops-modal-inner').children().remove();modalbox.find('.devoops-modal-bottom').children().remove();$('body').removeClass("body-expanded");});}(function($){$.fn.beautyTables=function(){var table=this;var string_fill=false;this.on('keydown',function(event){var target=event.target;var tr=$(target).closest("tr");var col=$(target).closest("td");if(target.tagName.toUpperCase()=='INPUT'){if(event.shiftKey===true)switch(event.keyCode){case 37:col.prev().children("input[type=text]").focus();break;case 39:col.next().children("input[type=text]").focus();break;case 40:if(string_fill==false)tr.next().find('td:eq('+col.index()+') input[type=text]').focus();break;case 38:if(string_fill==false)tr.prev().find('td:eq('+col.index()+') input[type=text]').focus();break;}if(event.ctrlKey===true)switch(event.keyCode){case 37:tr.find('td:eq(1)').find("input[type=text]").focus();break;case 39:tr.find('td:last-child').find("input[type=text]").focus();break;case 40:if(string_fill==false)table.find('tr:last-child td:eq('+col.index()+') input[type=text]').focus();break;case 38:if(string_fill==false)table.find('tr:eq(1) td:eq('+col.index()+') input[type=text]').focus();break;}if(event.keyCode==13||event.keyCode==9){event.preventDefault();col.next().find("input[type=text]").focus();}if(string_fill==false){if(event.keyCode==34){event.preventDefault();table.find('tr:last-child td:last-child').find("input[type=text]").focus();}if(event.keyCode==33){event.preventDefault();table.find('tr:eq(1) td:eq(1)').find("input[type=text]").focus();}}}});table.find("input[type=text]").each(function(){$(this).on('blur',function(event){var target=event.target;var col=$(target).parents("td");if(table.find("input[name=string-fill]").prop("checked")==true)col.nextAll().find("input[type=text]").each(function(){$(this).val($(target).val());});});});};})(jQuery);(function($){$.fn.beautyHover=function(){var table=this;table.on('mouseover','td',function(){var idx=$(this).index();var rows=$(this).closest('table').find('tr');rows.each(function(){$(this).find('td:eq('+idx+')').addClass('beauty-hover');});}).on('mouseleave','td',function(e){var idx=$(this).index();var rows=$(this).closest('table').find('tr');rows.each(function(){$(this).find('td:eq('+idx+')').removeClass('beauty-hover');});});};})(jQuery);function Table2Json(table){var result={};table.find("tr").each(function(){var oneRow=[];var varname=$(this).index();$("td",this).each(function(index){if(index!=0)oneRow.push($("input",this).val());});result[varname]=oneRow;});var result_json=JSON.stringify(result);OpenModalBox('Table to JSON values',result_json);}function FlotGraph1(){var data=[],totalPoints=300;function getRandomData(){if(data.length>0)data=data.slice(1);while(data.length0?data[data.length-1]:50,y=prev+Math.random()*10-5;if(y<0)y=0;else if(y>100)y=100;data.push(y);}var res=[];for(var i=0;iaxes.xaxis.max||pos.yaxes.yaxis.max)return;var i,j,dataset=plot.getData();for(i=0;ipos.x)break;var y,p1=series.data[j-1],p2=series.data[j];if(p1==null)y=p2[1];else if(p2==null)y=p1[1];else y=p1[1]+(p2[1]-p1[1])*(pos.x-p1[0])/(p2[0]-p1[0]);legends.eq(i).text(series.label.replace(/=.*/,"= "+y.toFixed(2)));}}$("#box-two-content").bind("plothover",function(event,pos,item){latestPosition=pos;if(!updateLegendTimeout)updateLegendTimeout=setTimeout(updateLegend,50);});}function FlotGraph3(){var d1=[];for(var i=0;i<=60;i+=1)d1.push([i,parseInt(Math.random()*30-10)]);function plotWithOptions(t){$.plot("#box-three-content",[{data:d1,color:"rgb(30, 180, 20)",threshold:{below:t,color:"rgb(200, 20, 30)"},lines:{steps:true}}]);}plotWithOptions(0);}function FlotGraph4(){var d1=[];for(var i=0;i<14;i+=0.5)d1.push([i,Math.sin(i)]);var d2=[[0,3],[4,8],[8,5],[9,13]];var d3=[];for(var i=0;i<14;i+=0.5)d3.push([i,Math.cos(i)]);var d4=[];for(var i=0;i<14;i+=0.1)d4.push([i,Math.sqrt(i*10)]);var d5=[];for(var i=0;i<14;i+=0.5)d5.push([i,Math.sqrt(i)]);var d6=[];for(var i=0;i<14;i+=0.5+Math.random())d6.push([i,Math.sqrt(2*i+Math.sin(i)+5)]);$.plot("#box-four-content",[{data:d1,lines:{show:true,fill:true}},{data:d2,bars:{show:true}},{data:d3,points:{show:true}},{data:d4,lines:{show:true}},{data:d5,lines:{show:true},points:{show:true}},{data:d6,lines:{show:true,steps:true}}]);}function MorrisChart1(){var day_data=[{"period":"2013-10-01","licensed":3407,"sorned":660},{"period":"2013-09-30","licensed":3351,"sorned":629},{"period":"2013-09-29","licensed":3269,"sorned":618},{"period":"2013-09-20","licensed":3246,"sorned":661},{"period":"2013-09-19","licensed":3257,"sorned":667},{"period":"2013-09-18","licensed":3248,"sorned":627},{"period":"2013-09-17","licensed":3171,"sorned":660},{"period":"2013-09-16","licensed":3171,"sorned":676},{"period":"2013-09-15","licensed":3201,"sorned":656},{"period":"2013-09-10","licensed":3215,"sorned":622}];Morris.Bar({element:'morris-chart-1',data:day_data,xkey:'period',ykeys:['licensed','sorned'],labels:['Licensed','SORN'],xLabelAngle:60});}function MorrisChart2(){Morris.Area({element:'morris-chart-2',data:[{x:'2011 Q1',y:3,z:3,m:1},{x:'2011 Q2',y:2,z:0,m:7},{x:'2011 Q3',y:2,z:5,m:2},{x:'2011 Q4',y:4,z:4,m:5},{x:'2012 Q1',y:6,z:1,m:11},{x:'2012 Q2',y:4,z:4,m:3},{x:'2012 Q3',y:4,z:4,m:7},{x:'2012 Q4',y:4,z:4,m:9}],xkey:'x',ykeys:['y','z','m'],labels:['Y','Z','M']}).on('click',function(i,row){console.log(i,row);});}function MorrisChart3(){var decimal_data=[];for(var x=0;x<=360;x+=10)decimal_data.push({x:x,y:Math.sin(Math.PI*x/180).toFixed(4),z:Math.cos(Math.PI*x/180).toFixed(4)});Morris.Line({element:'morris-chart-3',data:decimal_data,xkey:'x',ykeys:['y','z'],labels:['sin(x)','cos(x)'],parseTime:false,goals:[-1,0,1]});}function MorrisChart4(){Morris.Bar({element:'morris-chart-4',data:[{x:'2011 Q1',y:0},{x:'2011 Q2',y:1},{x:'2011 Q3',y:2},{x:'2011 Q4',y:3},{x:'2012 Q1',y:4},{x:'2012 Q2',y:5},{x:'2012 Q3',y:6},{x:'2012 Q4',y:7},{x:'2013 Q1',y:8},{x:'2013 Q2',y:7},{x:'2013 Q3',y:6},{x:'2013 Q4',y:5},{x:'2014 Q1',y:9}],xkey:'x',ykeys:['y'],labels:['Y'],barColors:function(row,series,type){if(type==='bar'){var red=Math.ceil(255*row.y/this.ymax);return 'rgb('+red+',0,0)';}else return '#000';}});}function MorrisChart5(){Morris.Area({element:'morris-chart-5',data:[{period:'2010 Q1',iphone:2666,ipad:null,itouch:2647},{period:'2010 Q2',iphone:2778,ipad:2294,itouch:2441},{period:'2010 Q3',iphone:4912,ipad:1969,itouch:2501},{period:'2010 Q4',iphone:3767,ipad:3597,itouch:5689},{period:'2011 Q1',iphone:6810,ipad:1914,itouch:2293},{period:'2011 Q2',iphone:5670,ipad:4293,itouch:1881},{period:'2011 Q3',iphone:4820,ipad:3795,itouch:1588},{period:'2011 Q4',iphone:15073,ipad:5967,itouch:5175},{period:'2012 Q1',iphone:10687,ipad:4460,itouch:2028},{period:'2012 Q2',iphone:8432,ipad:5713,itouch:1791}],xkey:'period',ykeys:['iphone','ipad','itouch'],labels:['iPhone','iPad','iPod Touch'],pointSize:2,hideHover:'auto'});}function DrawAllCharts(){var chart1_data=[['Smartphones','PC','Notebooks','Monitors','Routers','Switches'],['01.01.2014',1234,2342,344,232,131],['02.01.2014',1254,232,314,232,331],['03.01.2014',2234,342,298,232,665],['04.01.2014',2234,42,559,232,321],['05.01.2014',1999,82,116,232,334],['06.01.2014',1634,834,884,232,191],['07.01.2014',321,342,383,232,556],['08.01.2014',845,112,499,232,731]];var chart1_options={title:'Sales of company',hAxis:{title:'Date',titleTextStyle:{color:'red'}},backgroundColor:'#fcfcfc',vAxis:{title:'Quantity',titleTextStyle:{color:'blue'}}};var chart1_element='google-chart-1';var chart1_type=google.visualization.ColumnChart;drawGoogleChart(chart1_data,chart1_options,chart1_element,chart1_type);var chart2_data=[['Height','Width'],['Samsung',74.5],['Apple',31.24],['LG',12.10],['Huawei',11.14],['Sony',8.3],['Nokia',7.4],['Blackberry',6.8],['HTC',6.63],['Motorola',3.5],['Other',43.15]];var chart2_options={title:'Smartphone marketshare 2Q 2013',backgroundColor:'#fcfcfc'};var chart2_element='google-chart-2';var chart2_type=google.visualization.PieChart;drawGoogleChart(chart2_data,chart2_options,chart2_element,chart2_type);var chart3_data=[['Age','Weight'],[8,12],[4,5.5],[11,14],[4,5],[3,3.5],[6.5,7]];var chart3_options={title:'Age vs. Weight comparison',hAxis:{title:'Age',minValue:0,maxValue:15},vAxis:{title:'Weight',minValue:0,maxValue:15},legend:'none',backgroundColor:'#fcfcfc'};var chart3_element='google-chart-3';var chart3_type=google.visualization.ScatterChart;drawGoogleChart(chart3_data,chart3_options,chart3_element,chart3_type);var chart4_data=[['ID','Life Expectancy','Fertility Rate','Region','Population'],['CAN',80.66,1.67,'North America',33739900],['DEU',79.84,1.36,'Europe',81902307],['DNK',78.6,1.84,'Europe',5523095],['EGY',72.73,2.78,'Middle East',79716203],['GBR',80.05,2,'Europe',61801570],['IRN',72.49,1.7,'Middle East',73137148],['IRQ',68.09,4.77,'Middle East',31090763],['ISR',81.55,2.96,'Middle East',7485600],['RUS',68.6,1.54,'Europe',141850000],['USA',78.09,2.05,'North America',307007000]];var chart4_options={title:'Correlation between life expectancy, fertility rate and population of some world countries (2010)',hAxis:{title:'Life Expectancy'},vAxis:{title:'Fertility Rate'},backgroundColor:'#fcfcfc',bubble:{textStyle:{fontSize:11}}};var chart4_element='google-chart-4';var chart4_type=google.visualization.BubbleChart;drawGoogleChart(chart4_data,chart4_options,chart4_element,chart4_type);var chart5_data=[['Country','Popularity'],['Germany',200],['United States',300],['Brazil',400],['Canada',500],['France',600],['RU',700]];var chart5_options={backgroundColor:'#fcfcfc',enableRegionInteractivity:true};var chart5_element='google-chart-5';var chart5_type=google.visualization.GeoChart;drawGoogleChart(chart5_data,chart5_options,chart5_element,chart5_type);var chart6_data=[['Year','Sales','Expenses'],['2004',1000,400],['2005',1170,460],['2006',660,1120],['2007',1030,540],['2008',2080,740],['2009',1949,690],['2010',2334,820]];var chart6_options={backgroundColor:'#fcfcfc',title:'Company Performance'};var chart6_element='google-chart-6';var chart6_type=google.visualization.LineChart;drawGoogleChart(chart6_data,chart6_options,chart6_element,chart6_type);var chart7_data=[['Task','Hours per Day'],['Work',11],['Eat',2],['Commute',2],['Watch TV',2],['Sleep',7]];var chart7_options={backgroundColor:'#fcfcfc',title:'My Daily Activities',pieHole:0.4};var chart7_element='google-chart-7';var chart7_type=google.visualization.PieChart;drawGoogleChart(chart7_data,chart7_options,chart7_element,chart7_type);var chart8_data=[['Generation','Descendants'],[0,1],[1,33],[2,269],[3,2013]];var chart8_options={backgroundColor:'#fcfcfc',title:'Descendants by Generation',hAxis:{title:'Generation',minValue:0,maxValue:3},vAxis:{title:'Descendants',minValue:0,maxValue:2100},trendlines:{0:{type:'exponential',visibleInLegend:true}}};var chart8_element='google-chart-8';var chart8_type=google.visualization.ScatterChart;drawGoogleChart(chart8_data,chart8_options,chart8_element,chart8_type);}function xGraph1(){var tt=document.createElement('div'),leftOffset=-(~~$('html').css('padding-left').replace('px','')+~~$('body').css('margin-left').replace('px','')),topOffset=-32;tt.className='ex-tooltip';document.body.appendChild(tt);var data={"xScale":"time","yScale":"linear","main":[{"className":".xchart-class-1","data":[{"x":"2012-11-05","y":6},{"x":"2012-11-06","y":6},{"x":"2012-11-07","y":8},{"x":"2012-11-08","y":3},{"x":"2012-11-09","y":4},{"x":"2012-11-10","y":9},{"x":"2012-11-11","y":6},{"x":"2012-11-12","y":16},{"x":"2012-11-13","y":4},{"x":"2012-11-14","y":9},{"x":"2012-11-15","y":2}]}]};var opts={"dataFormatX":function(x){return d3.time.format('%Y-%m-%d').parse(x);},"tickFormatX":function(x){return d3.time.format('%A')(x);},"mouseover":function(d,i){var pos=$(this).offset();$(tt).text(d3.time.format('%A')(d.x)+': '+d.y).css({top:topOffset+pos.top,left:pos.left+leftOffset}).show();},"mouseout":function(x){$(tt).hide();}};var myChart=new xChart('line-dotted',data,'#xchart-1',opts);}function xGraph2(){var data={"xScale":"ordinal","yScale":"linear","main":[{"className":".xchart-class-2","data":[{"x":"Apple","y":575},{"x":"Facebook","y":163},{"x":"Microsoft","y":303},{"x":"Cisco","y":121},{"x":"Google","y":393}]}]};var myChart=new xChart('bar',data,'#xchart-2');}function xGraph3(){var data={"xScale":"time","yScale":"linear","type":"line","main":[{"className":".xchart-class-3","data":[{"x":"2012-11-05","y":1},{"x":"2012-11-06","y":6},{"x":"2012-11-07","y":13},{"x":"2012-11-08","y":-3},{"x":"2012-11-09","y":-4},{"x":"2012-11-10","y":9},{"x":"2012-11-11","y":6},{"x":"2012-11-12","y":7},{"x":"2012-11-13","y":-2},{"x":"2012-11-14","y":-7}]}]};var opts={"dataFormatX":function(x){return d3.time.format('%Y-%m-%d').parse(x);},"tickFormatX":function(x){return d3.time.format('%A')(x);}};var myChart=new xChart('line',data,'#xchart-3',opts);}function CoinDeskGraph(){var dates=PrettyDates();var startdate=dates[0];var enddate=dates[1];var jsonURL='http://api.coindesk.com/v1/bpi/historical/close.json?start='+startdate+'&end='+enddate;$.getJSON(jsonURL,function(result){$.each(result.bpi,function(key,val){xchart_data.push({'x':key,'y':val});});var graphXChartResize;$('#coindesk-xchart').resize(function(){clearTimeout(graphXChartResize);graphXChartResize=setTimeout(DrawCoinDeskXCharts,500);});DrawCoinDeskXCharts();$.each(result.bpi,function(key,val){google_data.push([key,val]);});var graphGChartResize;$('#coindesk-google-chart').resize(function(){clearTimeout(graphGChartResize);graphGChartResize=setTimeout(DrawCoinDeskGoogleCharts,500);});DrawCoinDeskGoogleCharts();$.each(result.bpi,function(key,val){var parseDate=key;parseDate=parseDate.split("-");var newDate=parseDate[1]+"/"+parseDate[2]+"/"+parseDate[0];var new_date=new Date(newDate).getTime();exchange_rate.push([new_date,val]);});DrawCoinDeskFlot();var graphSparklineResize;$('#coindesk-sparklines').resize(function(){clearTimeout(graphSparklineResize);graphSparklineResize=setTimeout(DrawCoinDeskSparkLine,500);});DrawCoinDeskSparkLine();});}function DrawCoinDeskSparkLine(){$('#coindesk-sparklines').sparkline(exchange_rate,{height:'100%',width:'100%'});}function DrawCoinDeskXCharts(){var data={"xScale":"ordinal","yScale":"linear","main":[{"className":".pizza","data":xchart_data}]};var myChart=new xChart('line-dotted',data,'#coindesk-xchart');}function DrawCoinDeskFlot(){var data1=[{data:exchange_rate,label:"Bitcoin exchange rate ($)"}];var options={canvas:true,xaxes:[{mode:"time"}],yaxes:[{min:0},{position:"right",alignTicksWithAxis:1,tickFormatter:function(value,axis){return value.toFixed(axis.tickDecimals)+"€";}}],legend:{position:"sw"}};$.plot("#coindesk-flot",data1,options);}function DrawCoinDeskGoogleCharts(){var google_options={backgroundColor:'#fcfcfc',title:'Coindesk Exchange Rate'};var google_element='coindesk-google-chart';var google_type=google.visualization.LineChart;drawGoogleChart(google_data,google_options,google_element,google_type);}function TestTable1(){$('#datatable-1').dataTable({"aaSorting":[[0,"asc"]],"sDom":"<'box-content'<'col-sm-6'f><'col-sm-6 text-right'l><'clearfix'>>rt<'box-content'<'col-sm-6'i><'col-sm-6 text-right'p><'clearfix'>>","sPaginationType":"bootstrap","oLanguage":{"sSearch":"","sLengthMenu":'_MENU_'}});}function TestTable2(){var asInitVals=[];var oTable=$('#datatable-2').dataTable({"aaSorting":[[0,"asc"]],"sDom":"<'box-content'<'col-sm-6'f><'col-sm-6 text-right'l><'clearfix'>>rt<'box-content'<'col-sm-6'i><'col-sm-6 text-right'p><'clearfix'>>","sPaginationType":"bootstrap","oLanguage":{"sSearch":"","sLengthMenu":'_MENU_'},bAutoWidth:false});var header_inputs=$("#datatable-2 thead input");header_inputs.on('keyup',function(){oTable.fnFilter(this.value,header_inputs.index(this));}).on('focus',function(){if(this.className=="search_init"){this.className="";this.value="";}}).on('blur',function(i){if(this.value==""){this.className="search_init";this.value=asInitVals[header_inputs.index(this)];}});header_inputs.each(function(i){asInitVals[i]=this.value;});}function TestTable3(){$('#datatable-3').dataTable({"aaSorting":[[0,"asc"]],"sDom":"T<'box-content'<'col-sm-6'f><'col-sm-6 text-right'l><'clearfix'>>rt<'box-content'<'col-sm-6'i><'col-sm-6 text-right'p><'clearfix'>>","sPaginationType":"bootstrap","oLanguage":{"sSearch":"","sLengthMenu":'_MENU_'},"oTableTools":{"sSwfPath":"plugins/datatables/copy_csv_xls_pdf.swf","aButtons":["copy","print",{"sExtends":"collection","sButtonText":'Save ',"aButtons":["csv","xls","pdf"]}]}});}function SmallChangeVal(val){var new_val=Math.floor(100*Math.random());var plusOrMinus=Math.random()<0.5?-1:1;var result=val[0]+new_val*plusOrMinus;if(parseInt(result)>1000)return [val[0]-new_val];if(parseInt(result)<0)return [val[0]+new_val];return [result];}function SparklineTestData(){var arr=[];for(var i=1;i<9;i++)arr.push([Math.floor(1000*Math.random())]);return arr;}function RedrawKnob(elem){elem.animate({value:Math.floor(100*Math.random())},{duration:3000,easing:'swing',progress:function(){$(this).val(parseInt(Math.ceil(elem.val()))).trigger('change');}});}function SparklineLoop(){SparkLineDrawBarGraph($('#sparkline-1'),sparkline_arr_1.map(SmallChangeVal));SparkLineDrawBarGraph($('#sparkline-2'),sparkline_arr_2.map(SmallChangeVal),'#7BC5D3');SparkLineDrawBarGraph($('#sparkline-3'),sparkline_arr_3.map(SmallChangeVal),'#B25050');}function MorrisDashboard(){Morris.Line({element:'stat-graph',data:[{"period":"2014-01","Win8":13.4,"Win7":55.3,'Vista':1.5,'NT':0.3,'XP':11,'Linux':4.9,'Mac':9.6,'Mobile':4},{"period":"2013-12","Win8":10,"Win7":55.9,'Vista':1.5,'NT':3.1,'XP':11.6,'Linux':4.8,'Mac':9.2,'Mobile':3.8},{"period":"2013-11","Win8":8.6,"Win7":56.4,'Vista':1.6,'NT':3.7,'XP':11.7,'Linux':4.8,'Mac':9.6,'Mobile':3.7},{"period":"2013-10","Win8":9.9,"Win7":56.7,'Vista':1.6,'NT':1.4,'XP':12.4,'Linux':4.9,'Mac':9.6,'Mobile':3.3},{"period":"2013-09","Win8":10.2,"Win7":56.8,'Vista':1.6,'NT':0.4,'XP':13.5,'Linux':4.8,'Mac':9.3,'Mobile':3.3},{"period":"2013-08","Win8":9.6,"Win7":55.9,'Vista':1.7,'NT':0.4,'XP':14.7,'Linux':5,'Mac':9.2,'Mobile':3.4},{"period":"2013-07","Win8":9,"Win7":56.2,'Vista':1.8,'NT':0.4,'XP':15.8,'Linux':4.9,'Mac':8.7,'Mobile':3.2},{"period":"2013-06","Win8":8.6,"Win7":56.3,'Vista':2,'NT':0.4,'XP':15.4,'Linux':4.9,'Mac':9.1,'Mobile':3.2},{"period":"2013-05","Win8":7.9,"Win7":56.4,'Vista':2.1,'NT':0.4,'XP':15.7,'Linux':4.9,'Mac':9.7,'Mobile':2.6},{"period":"2013-04","Win8":7.3,"Win7":56.4,'Vista':2.2,'NT':0.4,'XP':16.4,'Linux':4.8,'Mac':9.7,'Mobile':2.2},{"period":"2013-03","Win8":6.7,"Win7":55.9,'Vista':2.4,'NT':0.4,'XP':17.6,'Linux':4.7,'Mac':9.5,'Mobile':2.3},{"period":"2013-02","Win8":5.7,"Win7":55.3,'Vista':2.4,'NT':0.4,'XP':19.1,'Linux':4.8,'Mac':9.6,'Mobile':2.2},{"period":"2013-01","Win8":4.8,"Win7":55.3,'Vista':2.6,'NT':0.5,'XP':19.9,'Linux':4.8,'Mac':9.3,'Mobile':2.2}],xkey:'period',ykeys:['Win8','Win7','Vista','NT','XP','Linux','Mac','Mobile'],labels:['Win8','Win7','Vista','NT','XP','Linux','Mac','Mobile']});Morris.Donut({element:'morris_donut_1',data:[{value:70,label:'pay',formatted:'at least 70%'},{value:15,label:'client',formatted:'approx. 15%'},{value:10,label:'buy',formatted:'approx. 10%'},{value:5,label:'hosted',formatted:'at most 5%'}],formatter:function(x,data){return data.formatted;}});Morris.Donut({element:'morris_donut_2',data:[{value:20,label:'office',formatted:'current'},{value:35,label:'store',formatted:'approx. 35%'},{value:20,label:'shop',formatted:'approx. 20%'},{value:25,label:'cars',formatted:'at most 25%'}],formatter:function(x,data){return data.formatted;}});Morris.Donut({element:'morris_donut_3',data:[{value:17,label:'current',formatted:'current'},{value:22,label:'week',formatted:'last week'},{value:10,label:'month',formatted:'last month'},{value:25,label:'period',formatted:'period'},{value:25,label:'year',formatted:'this year'}],formatter:function(x,data){return data.formatted;}});}function DrawSparklineDashboard(){SparklineLoop();setInterval(SparklineLoop,1000);var sparkline_clients=[[309],[223],[343],[652],[455],[18],[912],[15]];$('.bar').each(function(){$(this).sparkline(sparkline_clients.map(SmallChangeVal),{type:'bar',barWidth:5,highlightColor:'#000',barSpacing:2,height:30,stackedBarColor:'#6AA6D6'});});var sparkline_table=[[1,341],[2,464],[4,564],[5,235],[6,335],[7,535],[8,642],[9,342],[10,765]];$('.td-graph').each(function(){var arr=$.map(sparkline_table,function(val,index){return [[val[0],SmallChangeVal([val[1]])]];});$(this).sparkline(arr,{defaultPixelsPerValue:10,minSpotColor:null,maxSpotColor:null,spotColor:null,fillColor:false,lineWidth:2,lineColor:'#5A8DB6'});});}function DrawKnobDashboard(){var srv_monitoring_selectors=[$("#knob-srv-1"),$("#knob-srv-2"),$("#knob-srv-3"),$("#knob-srv-4"),$("#knob-srv-5"),$("#knob-srv-6")];srv_monitoring_selectors.forEach(DrawKnob);setInterval(function(){srv_monitoring_selectors.forEach(RedrawKnob);},3000);}function FileUpload(){$('#bootstrapped-fine-uploader').fineUploader({template:'qq-template-bootstrap',classes:{success:'alert alert-success',fail:'alert alert-error'},thumbnails:{placeholders:{waitingPath:"assets/waiting-generic.png",notAvailablePath:"assets/not_available-generic.png"}},request:{endpoint:'server/handleUploads'},validation:{allowedExtensions:['jpeg','jpg','gif','png']}});}function LoadTestMap(){$.getJSON("http://www.telize.com/geoip?callback=?",function(json){var osmap=new OpenLayers.Layer.OSM("OpenStreetMap");var googlestreets=new OpenLayers.Layer.Google("Google Streets",{numZoomLevels:22,visibility:false});var googlesattelite=new OpenLayers.Layer.Google("Google Sattelite",{type:google.maps.MapTypeId.SATELLITE,numZoomLevels:22});var map1_layers=[googlestreets,osmap,googlesattelite];var map1=drawMap(json.longitude,json.latitude,"map-1",map1_layers);$("#map-1").resize(function(){setTimeout(map1.updateSize(),500);});var osmap1=new OpenLayers.Layer.OSM("OpenStreetMap");var map2_layers=[osmap1];var map2=drawMap(json.longitude,json.latitude,"map-2",map2_layers);$("#map-2").resize(function(){setTimeout(map2.updateSize(),500);});var sattelite=new OpenLayers.Layer.Google("Google Sattelite",{type:google.maps.MapTypeId.SATELLITE,numZoomLevels:22});var map3_layers=[sattelite];var map3=drawMap(json.longitude,json.latitude,"map-3",map3_layers);$("#map-3").resize(function(){setTimeout(map3.updateSize(),500);});});}function FullScreenMap(){$.getJSON("http://www.telize.com/geoip?callback=?",function(json){var osmap=new OpenLayers.Layer.OSM("OpenStreetMap");var googlestreets=new OpenLayers.Layer.Google("Google Streets",{numZoomLevels:22,visibility:false});var googlesattelite=new OpenLayers.Layer.Google("Google Sattelite",{type:google.maps.MapTypeId.SATELLITE,numZoomLevels:22});var map1_layers=[googlestreets,osmap,googlesattelite];var map_fs=drawMap(json.longitude,json.latitude,"full-map",map1_layers);});}function displayFlickrImages(data){var res;$.each(data.items,function(i,item){if(i>11)return false;res="+item.title+";$('#box-one-content').append(res);});setTimeout(function(){$("#box-one-content").justifiedGallery({'usedSuffix':'lt240','justifyLastRow':true,'rowHeight':150,'fixedHeight':false,'captions':true,'margins':1});$('#box-one-content').fadeIn('slow');},100);}function DemoFormValidator(){$('#defaultForm').bootstrapValidator({message:'This value is not valid',fields:{username:{message:'The username is not valid',validators:{notEmpty:{message:'The username is required and can\'t be empty'},stringLength:{min:6,max:30,message:'The username must be more than 6 and less than 30 characters long'},regexp:{regexp:/^[a-zA-Z0-9_\.]+$/,message:'The username can only consist of alphabetical, number, dot and underscore'}}},country:{validators:{notEmpty:{message:'The country is required and can\'t be empty'}}},acceptTerms:{validators:{notEmpty:{message:'You have to accept the terms and policies'}}},email:{validators:{notEmpty:{message:'The email address is required and can\'t be empty'},emailAddress:{message:'The input is not a valid email address'}}},website:{validators:{uri:{message:'The input is not a valid URL'}}},phoneNumber:{validators:{digits:{message:'The value can contain only digits'}}},color:{validators:{hexColor:{message:'The input is not a valid hex color'}}},zipCode:{validators:{usZipCode:{message:'The input is not a valid US zip code'}}},password:{validators:{notEmpty:{message:'The password is required and can\'t be empty'},identical:{field:'confirmPassword',message:'The password and its confirm are not the same'}}},confirmPassword:{validators:{notEmpty:{message:'The confirm password is required and can\'t be empty'},identical:{field:'password',message:'The password and its confirm are not the same'}}},ages:{validators:{lessThan:{value:100,inclusive:true,message:'The ages has to be less than 100'},greaterThan:{value:10,inclusive:false,message:'The ages has to be greater than or equals to 10'}}}}});}function FormLayoutExampleInputLength(selector){var steps=["col-sm-1","col-sm-2","col-sm-3","col-sm-4","col-sm-5","col-sm-6","col-sm-7","col-sm-8","col-sm-9","col-sm-10","col-sm-11","col-sm-12"];selector.slider({range:'min',value:1,min:0,max:11,step:1,slide:function(event,ui){if(ui.value<1)return false;var input=$("#form-styles");var f=input.parent();f.removeClass();f.addClass(steps[ui.value]);input.attr("placeholder",'.'+steps[ui.value]);}});}function RunClock(){var second=$(".second");var minute=$(".minute");var hour=$(".hour");var d=new Date();var s=d.getSeconds();var m=d.getMinutes();var h=d.getHours();if(h>11)h=h-12;$('#knob-clock-value').html(h+':'+m+':'+s);second.val(s).trigger("change");minute.val(m).trigger("change");hour.val(h).trigger("change");}function CreateAllSliders(){$(".slider-default").slider();var slider_range_min_amount=$(".slider-range-min-amount");var slider_range_min=$(".slider-range-min");var slider_range_max=$(".slider-range-max");var slider_range_max_amount=$(".slider-range-max-amount");var slider_range=$(".slider-range");var slider_range_amount=$(".slider-range-amount");slider_range_min.slider({range:"min",value:37,min:1,max:700,slide:function(event,ui){slider_range_min_amount.val("$"+ui.value);}});slider_range_min_amount.val("$"+slider_range_min.slider("value"));slider_range_max.slider({range:"max",min:1,max:100,value:2,slide:function(event,ui){slider_range_max_amount.val(ui.value);}});slider_range_max_amount.val(slider_range_max.slider("value"));slider_range.slider({range:true,min:0,max:500,values:[75,300],slide:function(event,ui){slider_range_amount.val("$"+ui.values[0]+" - $"+ui.values[1]);}});slider_range_amount.val("$"+slider_range.slider("values",0)+" - $"+slider_range.slider("values",1));$("#equalizer > div.progress > div").each(function(){var value=parseInt($(this).text(),10);$(this).empty().slider({value:value,range:"min",animate:true,orientation:"vertical"});});}function AllTimePickers(){$('#datetime_example').datetimepicker({});$('#time_example').timepicker({hourGrid:4,minuteGrid:10,timeFormat:'hh:mm tt'});$('#date3_example').datepicker({numberOfMonths:3,showButtonPanel:true});$('#date3-1_example').datepicker({numberOfMonths:3,showButtonPanel:true});$('#date_example').datepicker({});}function DrawCalendar(){$('#external-events div.external-event').each(function(){var eventObject={title:$.trim($(this).text())};$(this).data('eventObject',eventObject);$(this).draggable({zIndex:999,revert:true,revertDuration:0});});var calendar=$('#calendar').fullCalendar({header:{left:'prev,next today',center:'title',right:'month,agendaWeek,agendaDay'},selectable:true,selectHelper:true,select:function(start,end,allDay){var form=$('
'+'
'+'Event name'+'
'+''+'
'+''+'
'+''+'
'+'
'+'
');var buttons=$(''+'');OpenModalBox('Add event',form,buttons);$('#event_cancel').on('click',function(){CloseModalBox();});$('#event_submit').on('click',function(){var new_event_name=$('#newevent_name').val();if(new_event_name!='')calendar.fullCalendar('renderEvent',{title:new_event_name,description:$('#newevent_desc').val(),start:start,end:end,allDay:allDay},true);CloseModalBox();});calendar.fullCalendar('unselect');},editable:true,droppable:true,drop:function(date,allDay){var originalEventObject=$(this).data('eventObject');var copiedEventObject=$.extend({},originalEventObject);copiedEventObject.start=date;copiedEventObject.allDay=allDay;$('#calendar').fullCalendar('renderEvent',copiedEventObject,true);if($('#drop-remove').is(':checked'))$(this).remove();},eventRender:function(event,element,icon){if(event.description!="")element.attr('title',event.description);},eventClick:function(calEvent,jsEvent,view){var form=$('
'+'
'+'Event name'+'
'+''+'
'+''+'
'+''+'
'+'
'+'
');var buttons=$(''+''+'');OpenModalBox('Change event',form,buttons);$('#event_cancel').on('click',function(){CloseModalBox();});$('#event_delete').on('click',function(){calendar.fullCalendar('removeEvents',function(ev){return(ev._id==calEvent._id);});CloseModalBox();});$('#event_change').on('click',function(){calEvent.title=$('#newevent_name').val();calEvent.description=$('#newevent_desc').val();calendar.fullCalendar('updateEvent',calEvent);CloseModalBox();});}});$('#new-event-add').on('click',function(event){event.preventDefault();var event_name=$('#new-event-title').val();var event_description=$('#new-event-desc').val();if(event_name!=''){var event_template=$('
'+event_name+'
');$('#events-templates-header').after(event_template);var eventObject={title:event_name,description:event_description};event_template.data('eventObject',eventObject);event_template.draggable({zIndex:999,revert:true,revertDuration:0});}});}function DrawFullCalendar(){LoadCalendarScript(DrawCalendar);}$(document).ready(function(){$('.show-sidebar').on('click',function(){$('div#main').toggleClass('sidebar-show');setTimeout(MessagesMenuWidth,250);});var ajax_url=location.hash.replace(/^#/,'');if(ajax_url.length<1)ajax_url='ajax/dashboard.html';LoadAjaxContent(ajax_url);$('.main-menu').on('click','a',function(e){var parents=$(this).parents('li');var li=$(this).closest('li.dropdown');var another_items=$('.main-menu li').not(parents);another_items.find('a').removeClass('active');another_items.find('a').removeClass('active-parent');if($(this).hasClass('dropdown-toggle')||$(this).closest('li').find('ul').length==0){$(this).addClass('active-parent');var current=$(this).next();if(current.is(':visible')){li.find("ul.dropdown-menu").slideUp('fast');li.find("ul.dropdown-menu a").removeClass('active');}else{another_items.find("ul.dropdown-menu").slideUp('fast');current.slideDown('fast');}}else if(li.find('a.dropdown-toggle').hasClass('active-parent')){var pre=$(this).closest('ul.dropdown-menu');pre.find("li.dropdown").not($(this).closest('li')).find('ul.dropdown-menu').slideUp('fast');}if($(this).hasClass('active')==false){$(this).parents("ul.dropdown-menu").find('a').removeClass('active');$(this).addClass('active');}if($(this).hasClass('ajax-link')){e.preventDefault();if($(this).hasClass('add-full'))$('#content').addClass('full-content');else $('#content').removeClass('full-content');var url=$(this).attr('href');window.location.hash=url;LoadAjaxContent(url);}if($(this).attr('href')=='#')e.preventDefault();});var height=window.innerHeight-49;$('#main').css('min-height',height).on('click','.expand-link',function(e){var body=$('body');e.preventDefault();var box=$(this).closest('div.box');var button=$(this).find('i');button.toggleClass('fa-expand').toggleClass('fa-compress');box.toggleClass('expanded');body.toggleClass('body-expanded');var timeout=0;if(body.hasClass('body-expanded'))timeout=100;setTimeout(function(){box.toggleClass('expanded-padding');},timeout);setTimeout(function(){box.resize();box.find('[id^=map-]').resize();},timeout+50);}).on('click','.collapse-link',function(e){e.preventDefault();var box=$(this).closest('div.box');var button=$(this).find('i');var content=box.find('div.box-content');content.slideToggle('fast');button.toggleClass('fa-chevron-up').toggleClass('fa-chevron-down');setTimeout(function(){box.resize();box.find('[id^=map-]').resize();},50);}).on('click','.close-link',function(e){e.preventDefault();var content=$(this).closest('div.box');content.remove();});$('#locked-screen').on('click',function(e){e.preventDefault();$('body').addClass('body-screensaver');$('#screensaver').addClass("show");ScreenSaver();});$('body').on('click','a.close-link',function(e){e.preventDefault();CloseModalBox();});$('#top-panel').on('click','a',function(e){if($(this).hasClass('ajax-link')){e.preventDefault();if($(this).hasClass('add-full'))$('#content').addClass('full-content');else $('#content').removeClass('full-content');var url=$(this).attr('href');window.location.hash=url;LoadAjaxContent(url);}});$('#search').on('keydown',function(e){if(e.keyCode==13){e.preventDefault();$('#content').removeClass('full-content');ajax_url='ajax/page_search.html';window.location.hash=ajax_url;LoadAjaxContent(ajax_url);}});$('#screen_unlock').on('mouseover',function(){var header='Enter current username and password';var form=$('
'+'
');var button=$('');OpenModalBox(header,form,button);});}); \ No newline at end of file diff --git a/plugins/web_gui/static/js/noty/jquery.noty.js b/plugins/web_gui/static/js/noty/jquery.noty.js new file mode 100644 index 0000000..6d1e202 --- /dev/null +++ b/plugins/web_gui/static/js/noty/jquery.noty.js @@ -0,0 +1,488 @@ +/** + * noty - jQuery Notification Plugin v2.2.2 + * Contributors: https://github.com/needim/noty/graphs/contributors + * + * Examples and Documentation - http://needim.github.com/noty/ + * + * Licensed under the MIT licenses: + * http://www.opensource.org/licenses/mit-license.php + * + **/ + +if (typeof Object.create !== 'function') { + Object.create = function (o) { + function F() { + } + + F.prototype = o; + return new F(); + }; +} + +(function ($) { + + var NotyObject = { + + init:function (options) { + + // Mix in the passed in options with the default options + this.options = $.extend({}, $.noty.defaults, options); + + this.options.layout = (this.options.custom) ? $.noty.layouts['inline'] : $.noty.layouts[this.options.layout]; + + if ($.noty.themes[this.options.theme]) + this.options.theme = $.noty.themes[this.options.theme]; + else + options.themeClassName = this.options.theme; + + delete options.layout; + delete options.theme; + + this.options = $.extend({}, this.options, this.options.layout.options); + this.options.id = 'noty_' + (new Date().getTime() * Math.floor(Math.random() * 1000000)); + + this.options = $.extend({}, this.options, options); + + // Build the noty dom initial structure + this._build(); + + // return this so we can chain/use the bridge with less code. + return this; + }, // end init + + _build:function () { + + // Generating noty bar + var $bar = $('
').attr('id', this.options.id); + $bar.append(this.options.template).find('.noty_text').html(this.options.text); + + this.$bar = (this.options.layout.parent.object !== null) ? $(this.options.layout.parent.object).css(this.options.layout.parent.css).append($bar) : $bar; + + if (this.options.themeClassName) + this.$bar.addClass(this.options.themeClassName).addClass('noty_container_type_' + this.options.type); + + // Set buttons if available + if (this.options.buttons) { + + // If we have button disable closeWith & timeout options + this.options.closeWith = []; + this.options.timeout = false; + + var $buttons = $('
').addClass('noty_buttons'); + + (this.options.layout.parent.object !== null) ? this.$bar.find('.noty_bar').append($buttons) : this.$bar.append($buttons); + + var self = this; + + $.each(this.options.buttons, function (i, button) { + var $button = $('
'),i.url&&(s=''),"undefined"==typeof s&&(s=t.renderHtml(e)),e.statusbar&&(a=e.statusbar.renderHtml()),'
'+o+'
'+s+"
"+a+"
"},fullscreen:function(e){var t=this,r=document.documentElement,i,o=t.classPrefix,a;if(e!=t._fullscreen)if(n.on(window,"resize",function(){var e;if(t._fullscreen)if(i)t._timer||(t._timer=setTimeout(function(){var e=n.getWindowSize();t.moveTo(0,0).resizeTo(e.w,e.h),t._timer=0},50));else{e=(new Date).getTime();var r=n.getWindowSize();t.moveTo(0,0).resizeTo(r.w,r.h),(new Date).getTime()-e>50&&(i=!0)}}),a=t.layoutRect(),t._fullscreen=e,e){t._initial={x:a.x,y:a.y,w:a.w,h:a.h},t._borderBox=t.parseBox("0"),t.getEl("head").style.display="none",a.deltaH-=a.headerH+2,n.addClass(r,o+"fullscreen"),n.addClass(document.body,o+"fullscreen"),t.addClass("fullscreen");var s=n.getWindowSize();t.moveTo(0,0).resizeTo(s.w,s.h)}else t._borderBox=t.parseBox(t.settings.border),t.getEl("head").style.display="",a.deltaH+=a.headerH,n.removeClass(r,o+"fullscreen"),n.removeClass(document.body,o+"fullscreen"),t.removeClass("fullscreen"),t.moveTo(t._initial.x,t._initial.y).resizeTo(t._initial.w,t._initial.h);return t.reflow()},postRender:function(){var e=this,t=[],n,o,a;setTimeout(function(){e.addClass("in")},0),e.keyboardNavigation=new r({root:e,enableLeftRight:!1,enableUpDown:!1,items:t,onCancel:function(){e.close()}}),e.find("*").each(function(e){e.canFocus&&(o=o||e.settings.autofocus,n=n||e,e.subinput?(t.push(e.getEl("inp")),e.getEl("open")&&t.push(e.getEl("open"))):t.push(e.getEl()))}),e.statusbar&&e.statusbar.find("*").each(function(e){e.canFocus&&(o=o||e.settings.autofocus,n=n||e,t.push(e.getEl()))}),e._super(),e.statusbar&&e.statusbar.postRender(),!o&&n&&n.focus(),this.dragHelper=new i(e._id+"-dragh",{start:function(){a={x:e.layoutRect().x,y:e.layoutRect().y}},drag:function(t){e.moveTo(a.x+t.deltaX,a.y+t.deltaY)}}),e.on("submit",function(t){t.isDefaultPrevented()||e.close()})},submit:function(){return this.fire("submit",{data:this.toJSON()})},remove:function(){var e=this,t=e.classPrefix;e.dragHelper.destroy(),e._super(),e.statusbar&&this.statusbar.remove(),e._fullscreen&&(n.removeClass(document.documentElement,t+"fullscreen"),n.removeClass(document.body,t+"fullscreen"))}});return o}),r(Z,[Q],function(e){var t=e.extend({init:function(e){e={border:1,padding:20,layout:"flex",pack:"center",align:"center",containerCls:"panel",autoScroll:!0,buttons:{type:"button",text:"Ok",action:"ok"},items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200}},this._super(e)},Statics:{OK:1,OK_CANCEL:2,YES_NO:3,YES_NO_CANCEL:4,msgBox:function(n){var r,i=n.callback||function(){};switch(n.buttons){case t.OK_CANCEL:r=[{type:"button",text:"Ok",subtype:"primary",onClick:function(e){e.control.parents()[1].close(),i(!0)}},{type:"button",text:"Cancel",onClick:function(e){e.control.parents()[1].close(),i(!1)}}];break;case t.YES_NO:r=[{type:"button",text:"Ok",subtype:"primary",onClick:function(e){e.control.parents()[1].close(),i(!0)}}];break;case t.YES_NO_CANCEL:r=[{type:"button",text:"Ok",subtype:"primary",onClick:function(e){e.control.parents()[1].close()}}];break;default:r=[{type:"button",text:"Ok",subtype:"primary",onClick:function(e){e.control.parents()[1].close(),i(!0)}}]}return new e({padding:20,x:n.x,y:n.y,minWidth:300,minHeight:100,layout:"flex",pack:"center",align:"center",buttons:r,title:n.title,items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200,text:n.text},onClose:n.onClose}).renderTo(document.body).reflow()},alert:function(e,n){return"string"==typeof e&&(e={text:e}),e.callback=n,t.msgBox(e)},confirm:function(e,n){return"string"==typeof e&&(e={text:e}),e.callback=n,e.buttons=t.OK_CANCEL,t.msgBox(e)}}});return t}),r(et,[Q,Z],function(e,t){return function(n){function r(){return o.length?o[o.length-1]:void 0}var i=this,o=[];i.windows=o,i.open=function(t,r){var i;return n.editorManager.activeEditor=n,t.title=t.title||" ",t.url=t.url||t.file,t.url&&(t.width=parseInt(t.width||320,10),t.height=parseInt(t.height||240,10)),t.body&&(t.items={defaults:t.defaults,type:t.bodyType||"form",items:t.body}),t.url||t.buttons||(t.buttons=[{text:"Ok",subtype:"primary",onclick:function(){i.find("form")[0].submit(),i.close()}},{text:"Cancel",onclick:function(){i.close()}}]),i=new e(t),o.push(i),i.on("close",function(){for(var e=o.length;e--;)o[e]===i&&o.splice(e,1);n.focus()}),t.data&&i.on("postRender",function(){this.find("*").each(function(e){var n=e.name();n in t.data&&e.value(t.data[n])})}),i.features=t||{},i.params=r||{},n.nodeChanged(),i.renderTo(document.body).reflow()},i.alert=function(e,n,r){t.alert(e,function(){n&&n.call(r||this)})},i.confirm=function(e,n,r){t.confirm(e,function(e){n.call(r||this,e)})},i.close=function(){r()&&r().close()},i.getParams=function(){return r()?r().params:null},i.setParams=function(e){r()&&(r().params=e)}}}),r(tt,[T,B,C,m,h,f],function(e,t,n,r,i,o){return function(a){function s(e,t){try{a.getDoc().execCommand(e,!1,t)}catch(n){}}function l(){var e=a.getDoc().documentMode;return e?e:6}function c(e){return e.isDefaultPrevented()}function d(){function t(e){var t=new MutationObserver(function(){});o.each(a.getBody().getElementsByTagName("*"),function(e){"SPAN"==e.tagName&&e.setAttribute("mce-data-marked",1),!e.hasAttribute("data-mce-style")&&e.hasAttribute("style")&&a.dom.setAttrib(e,"style",e.getAttribute("style"))}),t.observe(a.getDoc(),{childList:!0,attributes:!0,subtree:!0,attributeFilter:["style"]}),a.getDoc().execCommand(e?"ForwardDelete":"Delete",!1,null);var n=a.selection.getRng(),r=n.startContainer.parentNode;o.each(t.takeRecords(),function(e){if("style"==e.attributeName){var t=e.target.getAttribute("data-mce-style");t?e.target.setAttribute("style",t):e.target.removeAttribute("style")}o.each(e.addedNodes,function(e){if("SPAN"==e.nodeName&&!e.getAttribute("mce-data-marked")){var t,i;e==r&&(t=n.startOffset,i=e.firstChild),W.remove(e,!0),i&&(n.setStart(i,t),n.setEnd(i,t),a.selection.setRng(n))}})}),t.disconnect(),o.each(a.dom.select("span[mce-data-marked]"),function(e){e.removeAttribute("mce-data-marked")})}var n=a.getDoc();window.MutationObserver&&(a.on("keydown",function(n){var r=n.keyCode==F,i=e.metaKeyPressed(n);if(!c(n)&&(r||n.keyCode==z)){var o=a.selection.getRng(),s=o.startContainer,l=o.startOffset;if(!i&&o.collapsed&&3==s.nodeType&&(r?l0))return;n.preventDefault(),i&&a.selection.getSel().modify("extend",r?"forward":"backward","word"),t(r)}}),a.on("keypress",function(n){c(n)||V.isCollapsed()||!n.charCode||e.metaKeyPressed(n)||(n.preventDefault(),t(!0),a.selection.setContent(String.fromCharCode(n.charCode)))}),a.addCommand("Delete",function(){t()}),a.addCommand("ForwardDelete",function(){t(!0)}),a.on("dragstart",function(e){e.dataTransfer.setData("mce-internal",a.selection.getContent())}),a.on("drop",function(e){if(!c(e)){var r=e.dataTransfer.getData("mce-internal");r&&n.caretRangeFromPoint&&(e.preventDefault(),t(),a.selection.setRng(n.caretRangeFromPoint(e.x,e.y)),a.insertContent(r))}}),a.on("cut",function(e){!c(e)&&e.clipboardData&&(e.preventDefault(),e.clipboardData.clearData(),e.clipboardData.setData("text/html",a.selection.getContent()),e.clipboardData.setData("text/plain",a.selection.getContent({format:"text"})),t(!0))}))}function u(){function e(e){var t=W.create("body"),n=e.cloneContents();return t.appendChild(n),V.serializer.serialize(t,{format:"html"})}function n(n){if(!n.setStart){if(n.item)return!1;var r=n.duplicate();return r.moveToElementText(a.getBody()),t.compareRanges(n,r)}var i=e(n),o=W.createRng();o.selectNode(a.getBody());var s=e(o);return i===s}a.on("keydown",function(e){var t=e.keyCode,r,i;if(!c(e)&&(t==F||t==z)){if(r=a.selection.isCollapsed(),i=a.getBody(),r&&!W.isEmpty(i))return;if(!r&&!n(a.selection.getRng()))return;e.preventDefault(),a.setContent(""),i.firstChild&&W.isBlock(i.firstChild)?a.selection.setCursorLocation(i.firstChild,0):a.selection.setCursorLocation(i,0),a.nodeChanged()}})}function f(){a.on("keydown",function(t){!c(t)&&65==t.keyCode&&e.metaKeyPressed(t)&&(t.preventDefault(),a.execCommand("SelectAll"))})}function p(){a.settings.content_editable||(W.bind(a.getDoc(),"focusin",function(){V.setRng(V.getRng())}),W.bind(a.getDoc(),"mousedown",function(e){e.target==a.getDoc().documentElement&&(a.getBody().focus(),V.setRng(V.getRng()))}))}function m(){a.on("keydown",function(e){if(!c(e)&&e.keyCode===z&&V.isCollapsed()&&0===V.getRng(!0).startOffset){var t=V.getNode(),n=t.previousSibling;if("HR"==t.nodeName)return W.remove(t),void e.preventDefault();n&&n.nodeName&&"hr"===n.nodeName.toLowerCase()&&(W.remove(n),e.preventDefault())}})}function h(){window.Range.prototype.getClientRects||a.on("mousedown",function(e){if(!c(e)&&"HTML"===e.target.nodeName){var t=a.getBody();t.blur(),setTimeout(function(){t.focus()},0)}})}function g(){a.on("click",function(e){e=e.target,/^(IMG|HR)$/.test(e.nodeName)&&V.getSel().setBaseAndExtent(e,0,e,1),"A"==e.nodeName&&W.hasClass(e,"mce-item-anchor")&&V.select(e),a.nodeChanged()})}function v(){function e(){var e=W.getAttribs(V.getStart().cloneNode(!1));return function(){var t=V.getStart();t!==a.getBody()&&(W.setAttrib(t,"style",null),I(e,function(e){t.setAttributeNode(e.cloneNode(!0))}))}}function t(){return!V.isCollapsed()&&W.getParent(V.getStart(),W.isBlock)!=W.getParent(V.getEnd(),W.isBlock)}a.on("keypress",function(n){var r;return c(n)||8!=n.keyCode&&46!=n.keyCode||!t()?void 0:(r=e(),a.getDoc().execCommand("delete",!1,null),r(),n.preventDefault(),!1)}),W.bind(a.getDoc(),"cut",function(n){var r;!c(n)&&t()&&(r=e(),setTimeout(function(){r()},0))})}function y(){var e,n;a.on("selectionchange",function(){n&&(clearTimeout(n),n=0),n=window.setTimeout(function(){var n=V.getRng();e&&t.compareRanges(n,e)||(a.nodeChanged(),e=n)},50)})}function b(){document.body.setAttribute("role","application")}function C(){a.on("keydown",function(e){if(!c(e)&&e.keyCode===z&&V.isCollapsed()&&0===V.getRng(!0).startOffset){var t=V.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}})}function x(){l()>7||(s("RespectVisibilityInDesign",!0),a.contentStyles.push(".mceHideBrInPre pre br {display: none}"),W.addClass(a.getBody(),"mceHideBrInPre"),q.addNodeFilter("pre",function(e){for(var t=e.length,r,i,o,a;t--;)for(r=e[t].getAll("br"),i=r.length;i--;)o=r[i],a=o.prev,a&&3===a.type&&"\n"!=a.value.charAt(a.value-1)?a.value+="\n":o.parent.insert(new n("#text",3),o,!0).value="\n"}),j.addNodeFilter("pre",function(e){for(var t=e.length,n,r,i,o;t--;)for(n=e[t].getAll("br"),r=n.length;r--;)i=n[r],o=i.prev,o&&3==o.type&&(o.value=o.value.replace(/\r?\n$/,""))}))}function w(){W.bind(a.getBody(),"mouseup",function(){var e,t=V.getNode();"IMG"==t.nodeName&&((e=W.getStyle(t,"width"))&&(W.setAttrib(t,"width",e.replace(/[^0-9%]+/g,"")),W.setStyle(t,"width","")),(e=W.getStyle(t,"height"))&&(W.setAttrib(t,"height",e.replace(/[^0-9%]+/g,"")),W.setStyle(t,"height","")))})}function _(){a.on("keydown",function(t){var n,r,i,o,s;if(!c(t)&&t.keyCode==e.BACKSPACE&&(n=V.getRng(),r=n.startContainer,i=n.startOffset,o=W.getRoot(),s=r,n.collapsed&&0===i)){for(;s&&s.parentNode&&s.parentNode.firstChild==s&&s.parentNode!=o;)s=s.parentNode;"BLOCKQUOTE"===s.tagName&&(a.formatter.toggle("blockquote",null,s),n=W.createRng(),n.setStart(r,0),n.setEnd(r,0),V.setRng(n))}})}function N(){function e(){a._refreshContentEditable(),s("StyleWithCSS",!1),s("enableInlineTableEditing",!1),U.object_resizing||s("enableObjectResizing",!1)}U.readonly||a.on("BeforeExecCommand MouseDown",e)}function E(){function e(){I(W.select("a"),function(e){var t=e.parentNode,n=W.getRoot();if(t.lastChild===e){for(;t&&!W.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}W.add(t,"br",{"data-mce-bogus":1})}})}a.on("SetContent ExecCommand",function(t){("setcontent"==t.type||"mceInsertLink"===t.command)&&e()})}function k(){U.forced_root_block&&a.on("init",function(){s("DefaultParagraphSeparator",U.forced_root_block)})}function S(){a.on("Undo Redo SetContent",function(e){e.initial||a.execCommand("mceRepaint")})}function T(){a.on("keydown",function(e){var t;c(e)||e.keyCode!=z||(t=a.getDoc().selection.createRange(),t&&t.item&&(e.preventDefault(),a.undoManager.beforeChange(),W.remove(t.item(0)),a.undoManager.add()))})}function R(){var e;l()>=10&&(e="",I("p div h1 h2 h3 h4 h5 h6".split(" "),function(t,n){e+=(n>0?",":"")+t+":empty"}),a.contentStyles.push(e+"{padding-right: 1px !important}"))}function A(){l()<9&&(q.addNodeFilter("noscript",function(e){for(var t=e.length,n,r;t--;)n=e[t],r=n.firstChild,r&&n.attr("data-mce-innertext",r.value)}),j.addNodeFilter("noscript",function(e){for(var t=e.length,i,o,a;t--;)i=e[t],o=e[t].firstChild,o?o.value=r.decode(o.value):(a=i.attributes.map["data-mce-innertext"],a&&(i.attr("data-mce-innertext",null),o=new n("#text",3),o.value=a,o.raw=!0,i.append(o)))}))}function B(){function e(e,t){var n=i.createTextRange();try{n.moveToPoint(e,t)}catch(r){n=null}return n}function t(t){var r;t.button?(r=e(t.x,t.y),r&&(r.compareEndPoints("StartToStart",a)>0?r.setEndPoint("StartToStart",a):r.setEndPoint("EndToEnd",a),r.select())):n()}function n(){var e=r.selection.createRange();a&&!e.item&&0===e.compareEndPoints("StartToEnd",e)&&a.select(),W.unbind(r,"mouseup",n),W.unbind(r,"mousemove",t),a=o=0}var r=W.doc,i=r.body,o,a,s;r.documentElement.unselectable=!0,W.bind(r,"mousedown contextmenu",function(i){if("HTML"===i.target.nodeName){if(o&&n(),s=r.documentElement,s.scrollHeight>s.clientHeight)return;o=1,a=e(i.x,i.y),a&&(W.bind(r,"mouseup",n),W.bind(r,"mousemove",t),W.win.focus(),a.select())}})}function L(){a.on("keyup focusin",function(t){65==t.keyCode&&e.metaKeyPressed(t)||V.normalize()})}function H(){a.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")}function M(){a.inline||a.on("keydown",function(){document.activeElement==document.body&&a.getWin().focus()})}function D(){a.inline||(a.contentStyles.push("body {min-height: 150px}"),a.on("click",function(e){"HTML"==e.target.nodeName&&(a.execCommand("SelectAll"),a.selection.collapse(!0),a.nodeChanged())}))}function P(){i.mac&&a.on("keydown",function(t){!e.metaKeyPressed(t)||37!=t.keyCode&&39!=t.keyCode||(t.preventDefault(),a.selection.getSel().modify("move",37==t.keyCode?"backward":"forward","word"))})}function O(){s("AutoUrlDetect",!1)}var I=o.each,z=e.BACKSPACE,F=e.DELETE,W=a.dom,V=a.selection,U=a.settings,q=a.parser,j=a.serializer,$=i.gecko,K=i.ie,Y=i.webkit;C(),_(),u(),L(),Y&&(d(),p(),g(),k(),i.iOS?(y(),M(),D()):f()),K&&i.ie<11&&(m(),b(),x(),w(),T(),R(),A(),B()),i.ie>=11&&D(),i.ie&&(f(),O()),$&&(m(),h(),v(),N(),E(),S(),H(),P())}}),r(nt,[f],function(e){function t(){return!1}function n(){return!0}var r="__bindings",i=e.makeMap("focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave keydown keypress keyup contextmenu dragstart dragend dragover draggesture dragdrop drop drag"," ");return{fire:function(e,i,o){var a=this,s,l,c,d,u;if(e=e.toLowerCase(),i=i||{},i.type=e,i.target||(i.target=a),i.preventDefault||(i.preventDefault=function(){i.isDefaultPrevented=n},i.stopPropagation=function(){i.isPropagationStopped=n},i.stopImmediatePropagation=function(){i.isImmediatePropagationStopped=n},i.isDefaultPrevented=t,i.isPropagationStopped=t,i.isImmediatePropagationStopped=t),a[r]&&(s=a[r][e]))for(l=0,c=s.length;c>l&&(s[l]=d=s[l],!i.isImmediatePropagationStopped());l++)if(d.call(a,i)===!1)return i.preventDefault(),i;if(o!==!1&&a.parent)for(u=a.parent();u&&!i.isPropagationStopped();)u.fire(e,i,!1),u=u.parent();return i},on:function(e,t){var n=this,o,a,s,l;if(t===!1&&(t=function(){return!1}),t)for(s=e.toLowerCase().split(" "),l=s.length;l--;)e=s[l],o=n[r],o||(o=n[r]={}),a=o[e],a||(a=o[e]=[],n.bindNative&&i[e]&&n.bindNative(e)),a.push(t);return n},off:function(e,t){var n=this,o,a=n[r],s,l,c,d;if(a)if(e)for(c=e.toLowerCase().split(" "),o=c.length;o--;){if(e=c[o],s=a[e],!e){for(l in a)a[e].length=0;return n}if(s){if(t)for(d=s.length;d--;)s[d]===t&&s.splice(d,1);else s.length=0;!s.length&&n.unbindNative&&i[e]&&(n.unbindNative(e),delete a[e])}}else{if(n.unbindNative)for(e in a)n.unbindNative(e);n[r]=[]}return n},hasEventListeners:function(e){var t=this[r];return e=e.toLowerCase(),!(!t||!t[e]||0===t[e].length)}}}),r(rt,[f,h],function(e,t){var n=e.each,r=e.explode,i={f9:120,f10:121,f11:122};return function(o){var a=this,s={};o.on("keyup keypress keydown",function(e){(e.altKey||e.ctrlKey||e.metaKey)&&n(s,function(n){var r=t.mac?e.metaKey:e.ctrlKey;if(n.ctrl==r&&n.alt==e.altKey&&n.shift==e.shiftKey)return e.keyCode==n.keyCode||e.charCode&&e.charCode==n.charCode?(e.preventDefault(),"keydown"==e.type&&n.func.call(n.scope),!0):void 0})}),a.add=function(t,a,l,c){var d;return d=l,"string"==typeof l?l=function(){o.execCommand(d,!1,null)}:e.isArray(d)&&(l=function(){o.execCommand(d[0],d[1],d[2])}),n(r(t.toLowerCase()),function(e){var t={func:l,scope:c||o,desc:o.translate(a),alt:!1,ctrl:!1,shift:!1};n(r(e,"+"),function(e){switch(e){case"alt":case"ctrl":case"shift":t[e]=!0;break;default:t.charCode=e.charCodeAt(0),t.keyCode=i[e]||e.toUpperCase().charCodeAt(0)}}),s[(t.ctrl?"ctrl":"")+","+(t.alt?"alt":"")+","+(t.shift?"shift":"")+","+t.keyCode]=t}),!0}}}),r(it,[v,b,C,k,E,A,L,H,M,D,P,O,y,d,et,x,_,tt,h,f,nt,rt],function(e,n,r,i,o,a,s,l,c,d,u,f,p,m,h,g,v,y,b,C,x,w){function _(e,t){return"selectionchange"==t?e.getDoc():!e.inline&&/^mouse|click|contextmenu|drop/.test(t)?e.getDoc():e.getBody()}function N(e,t,r){var i=this,o,a;o=i.documentBaseUrl=r.documentBaseURL,a=r.baseURI,i.settings=t=T({id:e,theme:"modern",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:o,add_form_submit_trigger:!0,submit_patch:!0,add_unload_trigger:!0,convert_urls:!0,relative_urls:!0,remove_script_host:!0,object_resizing:!0,doctype:"",visual:!0,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,padd_empty_editor:!0,render_ui:!0,indentation:"30px",inline_styles:!0,convert_fonts_to_spans:!0,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,option,optgroup,datalist",validate:!0,entity_encoding:"named",url_converter:i.convertURL,url_converter_scope:i,ie7_compat:!0},t),n.language=t.language||"en",n.languageLoad=t.language_load,n.baseURL=r.baseURL,i.id=t.id=e,i.isNotDirty=!0,i.plugins={},i.documentBaseURI=new f(t.document_base_url||o,{base_uri:a}),i.baseURI=a,i.contentCSS=[],i.contentStyles=[],i.shortcuts=new w(i),i.execCommands={},i.queryStateCommands={},i.queryValueCommands={},i.loadedCSS={},i.suffix=r.suffix,i.editorManager=r,i.inline=t.inline,r.fire("SetupEditor",i),i.execCallback("setup",i)}var E=e.DOM,k=n.ThemeManager,S=n.PluginManager,T=C.extend,R=C.each,A=C.explode,B=C.inArray,L=C.trim,H=C.resolve,M=m.Event,D=b.gecko,P=b.ie;return N.prototype={render:function(){function e(){E.unbind(window,"ready",e),n.render()}function t(){var e=p.ScriptLoader;if(r.language&&"en"!=r.language&&!r.language_url&&(r.language_url=n.editorManager.baseURL+"/langs/"+r.language+".js"),r.language_url&&e.add(r.language_url),r.theme&&"function"!=typeof r.theme&&"-"!=r.theme.charAt(0)&&!k.urls[r.theme]){var t=r.theme_url;t=t?n.documentBaseURI.toAbsolute(t):"themes/"+r.theme+"/theme"+o+".js",k.load(r.theme,t)}C.isArray(r.plugins)&&(r.plugins=r.plugins.join(" ")),R(r.external_plugins,function(e,t){S.load(t,e),r.plugins+=" "+t}),R(r.plugins.split(/[ ,]/),function(e){if(e=L(e),e&&!S.urls[e])if("-"==e.charAt(0)){e=e.substr(1,e.length);var t=S.dependencies(e);R(t,function(e){var t={prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"};e=S.createUrl(t,e),S.load(e.resource,e)})}else S.load(e,{prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"})}),e.loadQueue(function(){n.removed||n.init()})}var n=this,r=n.settings,i=n.id,o=n.suffix;if(!M.domLoaded)return void E.bind(window,"ready",e);if(n.getElement()&&b.contentEditable){r.inline?n.inline=!0:(n.orgVisibility=n.getElement().style.visibility,n.getElement().style.visibility="hidden");var a=n.getElement().form||E.getParent(i,"form");a&&(n.formElement=a,r.hidden_input&&!/TEXTAREA|INPUT/i.test(n.getElement().nodeName)&&(E.insertAfter(E.create("input",{type:"hidden",name:i}),i),n.hasHiddenInput=!0),n.formEventDelegate=function(e){n.fire(e.type,e)},E.bind(a,"submit reset",n.formEventDelegate),n.on("reset",function(){n.setContent(n.startContent,{format:"raw"})}),!r.submit_patch||a.submit.nodeType||a.submit.length||a._mceOldSubmit||(a._mceOldSubmit=a.submit,a.submit=function(){return n.editorManager.triggerSave(),n.isNotDirty=!0,a._mceOldSubmit(a)})),n.windowManager=new h(n),"xml"==r.encoding&&n.on("GetContent",function(e){e.save&&(e.content=E.encode(e.content))}),r.add_form_submit_trigger&&n.on("submit",function(){n.initialized&&n.save()}),r.add_unload_trigger&&(n._beforeUnload=function(){!n.initialized||n.destroyed||n.isHidden()||n.save({format:"raw",no_events:!0,set_dirty:!1})},n.editorManager.on("BeforeUnload",n._beforeUnload)),t()}},init:function(){function e(n){var r=S.get(n),i,o;i=S.urls[n]||t.documentBaseUrl.replace(/\/$/,""),n=L(n),r&&-1===B(m,n)&&(R(S.dependencies(n),function(t){e(t)}),o=new r(t,i),t.plugins[n]=o,o.init&&(o.init(t,i),m.push(n)))}var t=this,n=t.settings,r=t.getElement(),i,o,a,s,l,c,d,u,f,p,m=[];if(t.rtl=this.editorManager.i18n.rtl,t.editorManager.add(t),n.aria_label=n.aria_label||E.getAttrib(r,"aria-label",t.getLang("aria.rich_text_area")),n.theme&&("function"!=typeof n.theme?(n.theme=n.theme.replace(/-/,""),l=k.get(n.theme),t.theme=new l(t,k.urls[n.theme]),t.theme.init&&t.theme.init(t,k.urls[n.theme]||t.documentBaseUrl.replace(/\/$/,""))):t.theme=n.theme),R(n.plugins.replace(/\-/g,"").split(/[ ,]/),e),n.render_ui&&t.theme&&(t.orgDisplay=r.style.display,"function"!=typeof n.theme?(i=n.width||r.style.width||r.offsetWidth,o=n.height||r.style.height||r.offsetHeight,a=n.min_height||100,f=/^[0-9\.]+(|px)$/i,f.test(""+i)&&(i=Math.max(parseInt(i,10)+(l.deltaWidth||0),100)),f.test(""+o)&&(o=Math.max(parseInt(o,10)+(l.deltaHeight||0),a)),l=t.theme.renderUI({targetNode:r,width:i,height:o,deltaWidth:n.delta_width,deltaHeight:n.delta_height}),n.content_editable||(E.setStyles(l.sizeContainer||l.editorContainer,{wi2dth:i,h2eight:o}),o=(l.iframeHeight||o)+("number"==typeof o?l.deltaHeight||0:""),a>o&&(o=a))):(l=n.theme(t,r),l.editorContainer.nodeType&&(l.editorContainer=l.editorContainer.id=l.editorContainer.id||t.id+"_parent"),l.iframeContainer.nodeType&&(l.iframeContainer=l.iframeContainer.id=l.iframeContainer.id||t.id+"_iframecontainer"),o=l.iframeHeight||r.offsetHeight),t.editorContainer=l.editorContainer),n.content_css&&R(A(n.content_css),function(e){t.contentCSS.push(t.documentBaseURI.toAbsolute(e))}),n.content_style&&t.contentStyles.push(n.content_style),n.content_editable)return r=s=l=null,t.initContentBody();for(t.iframeHTML=n.doctype+"",n.document_base_url!=t.documentBaseUrl&&(t.iframeHTML+=''),!b.caretAfter&&n.ie7_compat&&(t.iframeHTML+=''),t.iframeHTML+='',p=0;p',t.loadedCSS[h]=!0}d=n.body_id||"tinymce",-1!=d.indexOf("=")&&(d=t.getParam("body_id","","hash"),d=d[t.id]||d),u=n.body_class||"",-1!=u.indexOf("=")&&(u=t.getParam("body_class","","hash"),u=u[t.id]||""),t.iframeHTML+='
";var g='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinymce.get("'+t.id+'");document.write(ed.iframeHTML);document.close();ed.initContentBody(true);})()';if(document.domain!=location.hostname&&(c=g),s=E.add(l.iframeContainer,"iframe",{id:t.id+"_ifr",src:c||'javascript:""',frameBorder:"0",allowTransparency:"true",title:t.editorManager.translate("Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help"),style:{width:"100%",height:o,display:"block"}}),P)try{t.getDoc() +}catch(v){s.src=c=g}t.contentAreaContainer=l.iframeContainer,l.editorContainer&&(E.get(l.editorContainer).style.display=t.orgDisplay),E.get(t.id).style.display="none",E.setAttrib(t.id,"aria-hidden",!0),c||t.initContentBody(),r=s=l=null},initContentBody:function(t){var n=this,o=n.settings,f=E.get(n.id),p=n.getDoc(),m,h;o.inline||(n.getElement().style.visibility=n.orgVisibility),t||o.content_editable||(p.open(),p.write(n.iframeHTML),p.close()),o.content_editable&&(n.on("remove",function(){var e=this.getBody();E.removeClass(e,"mce-content-body"),E.removeClass(e,"mce-edit-focus"),E.setAttrib(e,"tabIndex",null),E.setAttrib(e,"contentEditable",null)}),E.addClass(f,"mce-content-body"),f.tabIndex=-1,n.contentDocument=p=o.content_document||document,n.contentWindow=o.content_window||window,n.bodyElement=f,o.content_document=o.content_window=null,o.root_name=f.nodeName.toLowerCase()),m=n.getBody(),m.disabled=!0,o.readonly||(n.inline&&"static"==E.getStyle(m,"position",!0)&&(m.style.position="relative"),m.contentEditable=n.getParam("content_editable_state",!0)),m.disabled=!1,n.schema=new g(o),n.dom=new e(p,{keep_values:!0,url_converter:n.convertURL,url_converter_scope:n,hex_colors:o.force_hex_style_colors,class_filter:o.class_filter,update_styles:!0,root_element:o.content_editable?n.id:null,collect:o.content_editable,schema:n.schema,onSetAttrib:function(e){n.fire("SetAttrib",e)}}),n.parser=new v(o,n.schema),n.parser.addAttributeFilter("src,href,style",function(e,t){for(var r=e.length,i,o=n.dom,a,s;r--;)i=e[r],a=i.attr(t),s="data-mce-"+t,i.attributes.map[s]||("style"===t?i.attr(s,o.serializeStyle(o.parseStyle(a),i.name)):i.attr(s,n.convertURL(a,t,i.name)))}),n.parser.addNodeFilter("script",function(e){for(var t=e.length,n;t--;)n=e[t],n.attr("type","mce-"+(n.attr("type")||"text/javascript"))}),n.parser.addNodeFilter("#cdata",function(e){for(var t=e.length,n;t--;)n=e[t],n.type=8,n.name="#comment",n.value="[CDATA["+n.value+"]]"}),n.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(e){for(var t=e.length,i,o=n.schema.getNonEmptyElements();t--;)i=e[t],i.isEmpty(o)&&(i.empty().append(new r("br",1)).shortEnded=!0)}),n.serializer=new i(o,n),n.selection=new a(n.dom,n.getWin(),n.serializer,n),n.formatter=new s(n),n.undoManager=new l(n),n.forceBlocks=new d(n),n.enterKey=new c(n),n.editorCommands=new u(n),n.fire("PreInit"),o.browser_spellcheck||o.gecko_spellcheck||(p.body.spellcheck=!1,E.setAttrib(m,"spellcheck","false")),n.fire("PostRender"),n.quirks=y(n),o.directionality&&(m.dir=o.directionality),o.nowrap&&(m.style.whiteSpace="nowrap"),o.protect&&n.on("BeforeSetContent",function(e){R(o.protect,function(t){e.content=e.content.replace(t,function(e){return""})})}),n.on("SetContent",function(){n.addVisual(n.getBody())}),o.padd_empty_editor&&n.on("PostProcess",function(e){e.content=e.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
[\r\n]*)$/,"")}),n.load({initial:!0,format:"html"}),n.startContent=n.getContent({format:"raw"}),n.initialized=!0,R(n._pendingNativeEvents,function(e){n.dom.bind(_(n,e),e,function(e){n.fire(e.type,e)})}),n.fire("init"),n.focus(!0),n.nodeChanged({initial:!0}),n.execCallback("init_instance_callback",n),n.contentStyles.length>0&&(h="",R(n.contentStyles,function(e){h+=e+"\r\n"}),n.dom.addStyle(h)),R(n.contentCSS,function(e){n.loadedCSS[e]||(n.dom.loadCSS(e),n.loadedCSS[e]=!0)}),o.auto_focus&&setTimeout(function(){var e=n.editorManager.get(o.auto_focus);e.selection.select(e.getBody(),1),e.selection.collapse(1),e.getBody().focus(),e.getWin().focus()},100),f=p=m=null},focus:function(e){var t,n=this,r=n.selection,i=n.settings.content_editable,o,a,s=n.getDoc(),l;e||(o=r.getRng(),o.item&&(a=o.item(0)),n._refreshContentEditable(),i||(b.opera||n.getBody().focus(),n.getWin().focus()),(D||i)&&(l=n.getBody(),l.setActive&&b.ie<11?l.setActive():l.focus(),i&&r.normalize()),a&&a.ownerDocument==s&&(o=s.body.createControlRange(),o.addElement(a),o.select())),n.editorManager.activeEditor!=n&&((t=n.editorManager.activeEditor)&&t.fire("deactivate",{relatedTarget:n}),n.fire("activate",{relatedTarget:t})),n.editorManager.activeEditor=n},execCallback:function(e){var t=this,n=t.settings[e],r;if(n)return t.callbackLookup&&(r=t.callbackLookup[e])&&(n=r.func,r=r.scope),"string"==typeof n&&(r=n.replace(/\.\w+$/,""),r=r?H(r):0,n=H(n),t.callbackLookup=t.callbackLookup||{},t.callbackLookup[e]={func:n,scope:r}),n.apply(r||t,Array.prototype.slice.call(arguments,1))},translate:function(e){var t=this.settings.language||"en",n=this.editorManager.i18n;return e?n.data[t+"."+e]||e.replace(/\{\#([^\}]+)\}/g,function(e,r){return n.data[t+"."+r]||"{#"+r+"}"}):""},getLang:function(e,n){return this.editorManager.i18n.data[(this.settings.language||"en")+"."+e]||(n!==t?n:"{#"+e+"}")},getParam:function(e,t,n){var r=e in this.settings?this.settings[e]:t,i;return"hash"===n?(i={},"string"==typeof r?R(r.split(r.indexOf("=")>0?/[;,](?![^=;,]*(?:[;,]|$))/:","),function(e){e=e.split("="),i[L(e[0])]=L(e.length>1?e[1]:e)}):i=r,i):r},nodeChanged:function(){var e=this,t=e.selection,n,r,i;e.initialized&&!e.settings.disable_nodechange&&(i=e.getBody(),n=t.getStart()||i,n=P&&n.ownerDocument!=e.getDoc()?e.getBody():n,"IMG"==n.nodeName&&t.isCollapsed()&&(n=n.parentNode),r=[],e.dom.getParent(n,function(e){return e===i?!0:void r.push(e)}),e.fire("NodeChange",{element:n,parents:r}))},addButton:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),t.text||t.icon||(t.icon=e),n.buttons=n.buttons||{},t.tooltip=t.tooltip||t.title,n.buttons[e]=t},addMenuItem:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),n.menuItems=n.menuItems||{},n.menuItems[e]=t},addCommand:function(e,t,n){this.execCommands[e]={func:t,scope:n||this}},addQueryStateHandler:function(e,t,n){this.queryStateCommands[e]={func:t,scope:n||this}},addQueryValueHandler:function(e,t,n){this.queryValueCommands[e]={func:t,scope:n||this}},addShortcut:function(e,t,n,r){this.shortcuts.add(e,t,n,r)},execCommand:function(e,t,n,r){var i=this,o=0,a;return/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(e)||r&&r.skip_focus||i.focus(),r=T({},r),r=i.fire("BeforeExecCommand",{command:e,ui:t,value:n}),r.isDefaultPrevented()?!1:(a=i.execCommands[e])&&a.func.call(a.scope,t,n)!==!0?(i.fire("ExecCommand",{command:e,ui:t,value:n}),!0):(R(i.plugins,function(r){return r.execCommand&&r.execCommand(e,t,n)?(i.fire("ExecCommand",{command:e,ui:t,value:n}),o=!0,!1):void 0}),o?o:i.theme&&i.theme.execCommand&&i.theme.execCommand(e,t,n)?(i.fire("ExecCommand",{command:e,ui:t,value:n}),!0):i.editorCommands.execCommand(e,t,n)?(i.fire("ExecCommand",{command:e,ui:t,value:n}),!0):(i.getDoc().execCommand(e,t,n),void i.fire("ExecCommand",{command:e,ui:t,value:n})))},queryCommandState:function(e){var t=this,n,r;if(!t._isHidden()){if((n=t.queryStateCommands[e])&&(r=n.func.call(n.scope),r!==!0))return r;if(r=t.editorCommands.queryCommandState(e),-1!==r)return r;try{return t.getDoc().queryCommandState(e)}catch(i){}}},queryCommandValue:function(e){var n=this,r,i;if(!n._isHidden()){if((r=n.queryValueCommands[e])&&(i=r.func.call(r.scope),i!==!0))return i;if(i=n.editorCommands.queryCommandValue(e),i!==t)return i;try{return n.getDoc().queryCommandValue(e)}catch(o){}}},show:function(){var e=this;E.show(e.getContainer()),E.hide(e.id),e.load(),e.fire("show")},hide:function(){var e=this,t=e.getDoc();P&&t&&!e.inline&&t.execCommand("SelectAll"),e.save(),E.hide(e.getContainer()),E.setStyle(e.id,"display",e.orgDisplay),e.fire("hide")},isHidden:function(){return!E.isHidden(this.id)},setProgressState:function(e,t){this.fire("ProgressState",{state:e,time:t})},load:function(e){var n=this,r=n.getElement(),i;return r?(e=e||{},e.load=!0,i=n.setContent(r.value!==t?r.value:r.innerHTML,e),e.element=r,e.no_events||n.fire("LoadContent",e),e.element=r=null,i):void 0},save:function(e){var t=this,n=t.getElement(),r,i;if(n&&t.initialized)return e=e||{},e.save=!0,e.element=n,r=e.content=t.getContent(e),e.no_events||t.fire("SaveContent",e),r=e.content,/TEXTAREA|INPUT/i.test(n.nodeName)?n.value=r:(n.innerHTML=r,(i=E.getParent(t.id,"form"))&&R(i.elements,function(e){return e.name==t.id?(e.value=r,!1):void 0})),e.element=n=null,e.set_dirty!==!1&&(t.isNotDirty=!0),r},setContent:function(e,t){var n=this,r=n.getBody(),i;return t=t||{},t.format=t.format||"html",t.set=!0,t.content=e,t.no_events||n.fire("BeforeSetContent",t),e=t.content,0===e.length||/^\s+$/.test(e)?(i=n.settings.forced_root_block,i&&n.schema.isValidChild(r.nodeName.toLowerCase(),i.toLowerCase())?(e=P&&11>P?"":'
',e=n.dom.createHTML(i,n.settings.forced_root_block_attrs,e)):(!P||11>P)&&(e='
'),r.innerHTML=e,n.fire("SetContent",t)):("raw"!==t.format&&(e=new o({},n.schema).serialize(n.parser.parse(e,{isRootContent:!0}))),t.content=L(e),n.dom.setHTML(r,t.content),t.no_events||n.fire("SetContent",t)),t.content},getContent:function(e){var t=this,n,r=t.getBody();return e=e||{},e.format=e.format||"html",e.get=!0,e.getInner=!0,e.no_events||t.fire("BeforeGetContent",e),n="raw"==e.format?r.innerHTML:"text"==e.format?r.innerText||r.textContent:t.serializer.serialize(r,e),e.content="text"!=e.format?L(n):n,e.no_events||t.fire("GetContent",e),e.content},insertContent:function(e){this.execCommand("mceInsertContent",!1,e)},isDirty:function(){return!this.isNotDirty},getContainer:function(){var e=this;return e.container||(e.container=E.get(e.editorContainer||e.id+"_parent")),e.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return E.get(this.settings.content_element||this.id)},getWin:function(){var e=this,t;return e.contentWindow||(t=E.get(e.id+"_ifr"),t&&(e.contentWindow=t.contentWindow)),e.contentWindow},getDoc:function(){var e=this,t;return e.contentDocument||(t=e.getWin(),t&&(e.contentDocument=t.document)),e.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(e,t,n){var r=this,i=r.settings;return i.urlconverter_callback?r.execCallback("urlconverter_callback",e,n,!0,t):!i.convert_urls||n&&"LINK"==n.nodeName||0===e.indexOf("file:")||0===e.length?e:i.relative_urls?r.documentBaseURI.toRelative(e):e=r.documentBaseURI.toAbsolute(e,i.remove_script_host)},addVisual:function(e){var n=this,r=n.settings,i=n.dom,o;e=e||n.getBody(),n.hasVisual===t&&(n.hasVisual=r.visual),R(i.select("table,a",e),function(e){var t;switch(e.nodeName){case"TABLE":return o=r.visual_table_class||"mce-item-table",t=i.getAttrib(e,"border"),void(t&&"0"!=t||(n.hasVisual?i.addClass(e,o):i.removeClass(e,o)));case"A":return void(i.getAttrib(e,"href",!1)||(t=i.getAttrib(e,"name")||e.id,o="mce-item-anchor",t&&(n.hasVisual?i.addClass(e,o):i.removeClass(e,o))))}}),n.fire("VisualAid",{element:e,hasVisual:n.hasVisual})},remove:function(){var e=this;if(!e.removed){e.removed=1,e.hasHiddenInput&&E.remove(e.getElement().nextSibling);var t=e.getDoc();P&&t&&!e.inline&&t.execCommand("SelectAll"),e.save(),E.setStyle(e.id,"display",e.orgDisplay),e.settings.content_editable||(M.unbind(e.getWin()),M.unbind(e.getDoc()));var n=e.getContainer();M.unbind(e.getBody()),M.unbind(n),e.fire("remove"),e.editorManager.remove(e),E.remove(n),e.destroy()}},bindNative:function(e){var t=this;t.settings.readonly||(t.initialized?t.dom.bind(_(t,e),e,function(n){t.fire(e,n)}):t._pendingNativeEvents?t._pendingNativeEvents.push(e):t._pendingNativeEvents=[e])},unbindNative:function(e){var t=this;t.initialized&&t.dom.unbind(e)},destroy:function(e){var t=this,n;if(!t.destroyed){if(!e&&!t.removed)return void t.remove();e&&D&&(M.unbind(t.getDoc()),M.unbind(t.getWin()),M.unbind(t.getBody())),e||(t.editorManager.off("beforeunload",t._beforeUnload),t.theme&&t.theme.destroy&&t.theme.destroy(),t.selection.destroy(),t.dom.destroy()),n=t.formElement,n&&(n._mceOldSubmit&&(n.submit=n._mceOldSubmit,n._mceOldSubmit=null),E.unbind(n,"submit reset",t.formEventDelegate)),t.contentAreaContainer=t.formElement=t.container=null,t.settings.content_element=t.bodyElement=t.contentDocument=t.contentWindow=null,t.selection&&(t.selection=t.selection.win=t.selection.dom=t.selection.dom.doc=null),t.destroyed=1}},_refreshContentEditable:function(){var e=this,t,n;e._isHidden()&&(t=e.getBody(),n=t.parentNode,n.removeChild(t),n.appendChild(t),t.focus())},_isHidden:function(){var e;return D?(e=this.selection.getSel(),!e||!e.rangeCount||0===e.rangeCount):0}},T(N.prototype,x),N}),r(ot,[],function(){var e={};return{rtl:!1,add:function(t,n){for(var r in n)e[r]=n[r];this.rtl=this.rtl||"rtl"===e._dir},translate:function(t){if("undefined"==typeof t)return t;if("string"!=typeof t&&t.raw)return t.raw;if(t.push){var n=t.slice(1);t=(e[t[0]]||t[0]).replace(/\{([^\}]+)\}/g,function(e,t){return n[t]})}return e[t]||t},data:e}}),r(at,[v,h],function(e,t){function n(r){function i(){try{return document.activeElement}catch(e){return document.body}}function o(e){return e&&e.startContainer?{startContainer:e.startContainer,startOffset:e.startOffset,endContainer:e.endContainer,endOffset:e.endOffset}:e}function a(e,t){var n;return t.startContainer?(n=e.getDoc().createRange(),n.setStart(t.startContainer,t.startOffset),n.setEnd(t.endContainer,t.endOffset)):n=t,n}function s(t){return!!e.DOM.getParent(t,n.isEditorUIElement)}function l(e,t){for(var n=t.getBody();e;){if(e==n)return!0;e=e.parentNode}}function c(n){var c=n.editor,d;c.on("init",function(){"onbeforedeactivate"in document&&t.ie<11?c.dom.bind(c.getBody(),"beforedeactivate",function(){try{c.lastRng=c.selection.getRng()}catch(e){}c.selection.lastFocusBookmark=o(c.lastRng)}):(c.inline||t.ie>10)&&(c.on("nodechange keyup",function(){var e=document.activeElement;e&&e.id==c.id+"_ifr"&&(e=c.getBody()),l(e,c)&&(c.lastRng=c.selection.getRng())}),t.webkit&&(d=function(){var e=c.selection.getRng();e.collapsed||(c.lastRng=e)},e.DOM.bind(document,"selectionchange",d),c.on("remove",function(){e.DOM.unbind(document,"selectionchange",d)})))}),c.on("setcontent",function(){c.lastRng=null}),c.on("mousedown",function(){c.selection.lastFocusBookmark=null}),c.on("focusin",function(){var e=r.focusedEditor;c.selection.lastFocusBookmark&&(c.selection.setRng(a(c,c.selection.lastFocusBookmark)),c.selection.lastFocusBookmark=null),e!=c&&(e&&e.fire("blur",{focusedEditor:c}),r.activeEditor=c,r.focusedEditor=c,c.fire("focus",{blurredEditor:e}),c.focus(!1)),c.lastRng=null}),c.on("focusout",function(){window.setTimeout(function(){var e=r.focusedEditor;s(i())||e!=c||(c.fire("blur",{focusedEditor:null}),r.focusedEditor=null,c.selection&&(c.selection.lastFocusBookmark=null))},0)})}e.DOM.bind(document,"focusin",function(e){var t=r.activeEditor;t&&e.target.ownerDocument==document&&(t.selection&&(t.selection.lastFocusBookmark=o(t.lastRng)),s(e.target)||r.focusedEditor!=t||(t.fire("blur",{focusedEditor:null}),r.focusedEditor=null))}),r.on("AddEditor",c)}return n.isEditorUIElement=function(e){return-1!==e.className.indexOf("mce-")},n}),r(st,[it,v,O,h,f,nt,ot,at],function(e,n,r,i,o,a,s,l){var c=n.DOM,d=o.explode,u=o.each,f=o.extend,p=0,m,h={majorVersion:"4",minorVersion:"0.16",releaseDate:"2014-01-31",editors:[],i18n:s,activeEditor:null,setup:function(){var e=this,t,n,i="",o;if(n=document.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(n)||(n+="/"),o=window.tinymce||window.tinyMCEPreInit)t=o.base||o.baseURL,i=o.suffix;else for(var a=document.getElementsByTagName("script"),s=0;s0&&u(d(m),function(n){c.get(n)?(l=new e(n,t,a),s.push(l),l.render(!0)):u(document.forms,function(r){u(r.elements,function(r){r.name===n&&(n="mce_editor_"+p++,c.setAttrib(r,"id",n),l=new e(n,t,a),s.push(l),l.render(1))})})});break;case"textareas":case"specific_textareas":u(c.select("textarea"),function(r){t.editor_deselector&&i(r,t.editor_deselector)||(!t.editor_selector||i(r,t.editor_selector))&&(l=new e(n(r),t,a),s.push(l),l.render(!0))})}t.oninit&&(m=h=0,u(s,function(e){h++,e.initialized?m++:e.on("init",function(){m++,m==h&&r(t,"oninit")}),m==h&&r(t,"oninit")}))}var a=this,s=[],l;a.settings=t,c.bind(window,"ready",o)},get:function(e){return e===t?this.editors:this.editors[e]},add:function(e){var t=this,n=t.editors;return n[e.id]=e,n.push(e),t.activeEditor=e,t.fire("AddEditor",{editor:e}),m||(m=function(){t.fire("BeforeUnload")},c.bind(window,"beforeunload",m)),e},createEditor:function(t,n){return this.add(new e(t,n,this))},remove:function(e){var t=this,n,r=t.editors,i,o;{if(e){if("string"==typeof e)return e=e.selector||e,void u(c.select(e),function(e){t.remove(r[e.id])});if(i=e,!r[i.id])return null;for(delete r[i.id],n=0;n=0;n--)t.remove(r[n])}},execCommand:function(t,n,r){var i=this,o=i.get(r);switch(t){case"mceAddEditor":return i.get(r)||new e(r,i.settings,i).render(),!0;case"mceRemoveEditor":return o&&o.remove(),!0;case"mceToggleEditor":return o?(o.isHidden()?o.show():o.hide(),!0):(i.execCommand("mceAddEditor",0,r),!0)}return i.activeEditor?i.activeEditor.execCommand(t,n,r):!1},triggerSave:function(){u(this.editors,function(e){e.save()})},addI18n:function(e,t){s.add(e,t)},translate:function(e){return s.translate(e)}};return f(h,a),h.setup(),window.tinymce=window.tinyMCE=h,h}),r(lt,[st,f],function(e,t){var n=t.each,r=t.explode;e.on("AddEditor",function(e){var t=e.editor;t.on("preInit",function(){function e(e,t){n(t,function(t,n){t&&s.setStyle(e,n,t)}),s.rename(e,"span")}function i(e){s=t.dom,l.convert_fonts_to_spans&&n(s.select("font,u,strike",e.node),function(e){o[e.nodeName.toLowerCase()](s,e)})}var o,a,s,l=t.settings;l.inline_styles&&(a=r(l.font_size_legacy_values),o={font:function(t,n){e(n,{backgroundColor:n.style.backgroundColor,color:n.color,fontFamily:n.face,fontSize:a[parseInt(n.size,10)-1]})},u:function(t,n){e(n,{textDecoration:"underline"})},strike:function(t,n){e(n,{textDecoration:"line-through"})}},t.on("PreProcess SetContent",i))})})}),r(ct,[],function(){return{send:function(e){function t(){!e.async||4==n.readyState||r++>1e4?(e.success&&1e4>r&&200==n.status?e.success.call(e.success_scope,""+n.responseText,n,e):e.error&&e.error.call(e.error_scope,r>1e4?"TIMED_OUT":"GENERAL",n,e),n=null):setTimeout(t,10)}var n,r=0;if(e.scope=e.scope||this,e.success_scope=e.success_scope||e.scope,e.error_scope=e.error_scope||e.scope,e.async=e.async===!1?!1:!0,e.data=e.data||"",n=new XMLHttpRequest){if(n.overrideMimeType&&n.overrideMimeType(e.content_type),n.open(e.type||(e.data?"POST":"GET"),e.url,e.async),e.content_type&&n.setRequestHeader("Content-Type",e.content_type),n.setRequestHeader("X-Requested-With","XMLHttpRequest"),n.send(e.data),!e.async)return t();setTimeout(t,10)}}}}),r(dt,[],function(){function e(t,n){var r,i,o,a;if(n=n||'"',null===t)return"null";if(o=typeof t,"string"==o)return i="\bb t\nn\ff\rr\"\"''\\\\",n+t.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(e,t){return'"'===n&&"'"===e?e:(r=i.indexOf(t),r+1?"\\"+i.charAt(r+1):(e=t.charCodeAt().toString(16),"\\u"+"0000".substring(e.length)+e))})+n;if("object"==o){if(t.hasOwnProperty&&"[object Array]"===Object.prototype.toString.call(t)){for(r=0,i="[";r0?",":"")+e(t[r],n);return i+"]"}i="{";for(a in t)t.hasOwnProperty(a)&&(i+="function"!=typeof t[a]?(i.length>1?","+n:n)+a+n+":"+e(t[a],n):"");return i+"}"}return""+t}return{serialize:e,parse:function(e){try{return window[String.fromCharCode(101)+"val"]("("+e+")")}catch(t){}}}}),r(ut,[dt,ct,f],function(e,t,n){function r(e){this.settings=i({},e),this.count=0}var i=n.extend;return r.sendRPC=function(e){return(new r).send(e)},r.prototype={send:function(n){var r=n.error,o=n.success;n=i(this.settings,n),n.success=function(t,i){t=e.parse(t),"undefined"==typeof t&&(t={error:"JSON Parse error."}),t.error?r.call(n.error_scope||n.scope,t.error,i):o.call(n.success_scope||n.scope,t.result)},n.error=function(e,t){r&&r.call(n.error_scope||n.scope,e,t)},n.data=e.serialize({id:n.id||"c"+this.count++,method:n.method,params:n.params}),n.content_type="application/json",t.send(n)}},r}),r(ft,[v],function(e){return{callbacks:{},count:0,send:function(n){var r=this,i=e.DOM,o=n.count!==t?n.count:r.count,a="tinymce_jsonp_"+o;r.callbacks[o]=function(e){i.remove(a),delete r.callbacks[o],n.callback(e)},i.add(i.doc.body,"script",{id:a,src:n.url,type:"text/javascript"}),r.count++}}}),r(pt,[],function(){function e(){s=[];for(var e in a)s.push(e);i.length=s.length}function n(){function n(e){var n,r;return r=e!==t?d+e:i.indexOf(",",d),-1===r||r>i.length?null:(n=i.substring(d,r),d=r+1,n)}var r,i,s,d=0;if(a={},c){o.load(l),i=o.getAttribute(l)||"";do{var u=n();if(null===u)break;if(r=n(parseInt(u,32)||0),null!==r){if(u=n(),null===u)break;s=n(parseInt(u,32)||0),r&&(a[r]=s)}}while(null!==r);e()}}function r(){var t,n="";if(c){for(var r in a)t=a[r],n+=(n?",":"")+r.length.toString(32)+","+r+","+t.length.toString(32)+","+t;o.setAttribute(l,n);try{o.save(l)}catch(i){}e()}}var i,o,a,s,l,c;try{if(window.localStorage)return localStorage}catch(d){}return l="tinymce",o=document.documentElement,c=!!o.addBehavior,c&&o.addBehavior("#default#userData"),i={key:function(e){return s[e]},getItem:function(e){return e in a?a[e]:null},setItem:function(e,t){a[e]=""+t,r()},removeItem:function(e){delete a[e],r()},clear:function(){a={},r()}},n(),i}),r(mt,[v,d,y,b,f,h],function(e,t,n,r,i,o){var a=window.tinymce;return a.DOM=e.DOM,a.ScriptLoader=n.ScriptLoader,a.PluginManager=r.PluginManager,a.ThemeManager=r.ThemeManager,a.dom=a.dom||{},a.dom.Event=t.Event,i.each(i,function(e,t){a[t]=e}),i.each("isOpera isWebKit isIE isGecko isMac".split(" "),function(e){a[e]=o[e.substr(2).toLowerCase()]}),{}}),r(ht,[I,f],function(e,t){return e.extend({Defaults:{firstControlClass:"first",lastControlClass:"last"},init:function(e){this.settings=t.extend({},this.Defaults,e)},preRender:function(e){e.addClass(this.settings.containerClass,"body")},applyClasses:function(e){var t=this,n=t.settings,r,i,o;r=e.items().filter(":visible"),i=n.firstControlClass,o=n.lastControlClass,r.each(function(e){e.removeClass(i).removeClass(o),n.controlClass&&e.addClass(n.controlClass)}),r.eq(0).addClass(i),r.eq(-1).addClass(o)},renderHtml:function(e){var t=this,n=t.settings,r,i="";return r=e.items(),r.eq(0).addClass(n.firstControlClass),r.eq(-1).addClass(n.lastControlClass),r.each(function(e){n.controlClass&&e.addClass(n.controlClass),i+=e.renderHtml()}),i},recalc:function(){},postRender:function(){}})}),r(gt,[ht],function(e){return e.extend({Defaults:{containerClass:"abs-layout",controlClass:"abs-layout-item"},recalc:function(e){e.items().filter(":visible").each(function(e){var t=e.settings;e.layoutRect({x:t.x,y:t.y,w:t.w,h:t.h}),e.recalc&&e.recalc()})},renderHtml:function(e){return'
'+this._super(e)}})}),r(vt,[V,Y],function(e,t){return e.extend({Mixins:[t],Defaults:{classes:"widget tooltip tooltip-n"},text:function(e){var t=this;return"undefined"!=typeof e?(t._value=e,t._rendered&&(t.getEl().lastChild.innerHTML=t.encode(e)),t):t._value},renderHtml:function(){var e=this,t=e.classPrefix;return'"},repaint:function(){var e=this,t,n;t=e.getEl().style,n=e._layoutRect,t.left=n.x+"px",t.top=n.y+"px",t.zIndex=131070}})}),r(yt,[V,vt],function(e,t){var n,r=e.extend({init:function(e){var t=this;t._super(e),t.canFocus=!0,e.tooltip&&r.tooltips!==!1&&(t.on("mouseenter",function(n){var r=t.tooltip().moveTo(-65535);if(n.control==t){var i=r.text(e.tooltip).show().testMoveRel(t.getEl(),["bc-tc","bc-tl","bc-tr"]);r.toggleClass("tooltip-n","bc-tc"==i),r.toggleClass("tooltip-nw","bc-tl"==i),r.toggleClass("tooltip-ne","bc-tr"==i),r.moveRel(t.getEl(),i)}else r.hide()}),t.on("mouseleave mousedown click",function(){t.tooltip().hide()})),t.aria("label",e.tooltip)},tooltip:function(){var e=this;return n||(n=new t({type:"tooltip"}),n.renderTo(e.getContainerElm())),n},active:function(e){var t=this,n;return e!==n&&(t.aria("pressed",e),t.toggleClass("active",e)),t._super(e)},disabled:function(e){var t=this,n;return e!==n&&(t.aria("disabled",e),t.toggleClass("disabled",e)),t._super(e)},postRender:function(){var e=this,t=e.settings;e._rendered=!0,e._super(),e.parent()||!t.width&&!t.height||(e.initLayoutRect(),e.repaint()),t.autofocus&&setTimeout(function(){e.focus()},0)},remove:function(){this._super(),n&&(n.remove(),n=null)}});return r}),r(bt,[yt],function(e){return e.extend({Defaults:{classes:"widget btn",role:"button"},init:function(e){var t=this,n;t.on("click mousedown",function(e){e.preventDefault()}),t._super(e),n=e.size,e.subtype&&t.addClass(e.subtype),n&&t.addClass("btn-"+n)},icon:function(e){var t=this,n=t.classPrefix;if("undefined"==typeof e)return t.settings.icon;if(t.settings.icon=e,e=e?n+"ico "+n+"i-"+t.settings.icon:"",t._rendered){var r=t.getEl().firstChild,i=r.getElementsByTagName("i")[0];e?(i&&i==r.firstChild||(i=document.createElement("i"),r.insertBefore(i,r.firstChild)),i.className=e):i&&r.removeChild(i),t.text(t._text)}return t},repaint:function(){var e=this.getEl().firstChild.style;e.width=e.height="100%",this._super()},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r=e.settings.icon,i="";return e.settings.image&&(r="none",i=" style=\"background-image: url('"+e.settings.image+"')\""),r=e.settings.icon?n+"ico "+n+"i-"+r:"",'
"}})}),r(Ct,[q],function(e){return e.extend({Defaults:{defaultType:"button",role:"toolbar"},renderHtml:function(){var e=this,t=e._layout;return e.addClass("btn-group"),e.preRender(),t.preRender(e),'
'+(e.settings.html||"")+t.renderHtml(e)+"
"}})}),r(xt,[yt],function(e){return e.extend({Defaults:{classes:"checkbox",role:"checkbox",checked:!1},init:function(e){var t=this;t._super(e),t.on("click mousedown",function(e){e.preventDefault()}),t.on("click",function(e){e.preventDefault(),t.disabled()||t.checked(!t.checked())}),t.checked(t.settings.checked)},checked:function(e){var t=this;return"undefined"!=typeof e?(e?t.addClass("checked"):t.removeClass("checked"),t._checked=e,t.aria("checked",e),t):t._checked},value:function(e){return this.checked(e)},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'
'+e.encode(e._text)+"
"}})}),r(wt,[bt,X],function(e,t){return e.extend({showPanel:function(){var e=this,n=e.settings;if(e.active(!0),e.panel)e.panel.show();else{var r=n.panel;r.type&&(r={layout:"grid",items:r}),r.popover=!0,r.autohide=!0,e.panel=new t(r).on("hide",function(){e.active(!1)}).parent(e).renderTo(e.getContainerElm()),e.panel.fire("show"),e.panel.reflow()}e.panel.moveRel(e.getEl(),n.popoverAlign||(e.isRtl()?["bc-tr","bc-tc"]:["bc-tl","bc-tc"]))},hidePanel:function(){var e=this;e.panel&&e.panel.hide()},postRender:function(){var e=this;return e.on("click",function(t){t.control===e&&(e.panel&&e.panel.visible()?e.hidePanel():e.showPanel())}),e._super()}})}),r(_t,[wt,v],function(e,t){var n=t.DOM;return e.extend({init:function(e){this._super(e),this.addClass("colorbutton")},color:function(e){return e?(this._color=e,this.getEl("preview").style.backgroundColor=e,this):this._color},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r=e.settings.icon?n+"ico "+n+"i-"+e.settings.icon:"",i=e.settings.image?" style=\"background-image: url('"+e.settings.image+"')\"":"";return'
'},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(r){r.control!=e||n.getParent(r.target,"."+e.classPrefix+"open")||(r.stopImmediatePropagation(),t.call(e,r))}),delete e.settings.onclick,e._super()}})}),r(Nt,[yt,U,W],function(e,t,n){return e.extend({init:function(e){var t=this;t._super(e),t.addClass("combobox"),t.subinput=!0,e=t.settings,e.menu=e.menu||e.values,e.menu&&(e.icon="caret"),t.on("click",function(n){for(var r=n.target;r;)r.id&&-1!=r.id.indexOf("-open")&&(t.fire("action"),e.menu&&(t.showMenu(),n.keyboard&&t.menu.items()[0].focus())),r=r.parentNode}),t.on("keydown",function(e){"INPUT"==e.target.nodeName&&13==e.keyCode&&t.parents().reverse().each(function(n){return e.preventDefault(),t.fire("change"),n.hasEventListeners("submit")&&n.toJSON?(n.fire("submit",{data:n.toJSON()}),!1):void 0})}),e.placeholder&&(t.addClass("placeholder"),t.on("focusin",function(){t._hasOnChange||(n.on(t.getEl("inp"),"change",function(){t.fire("change")}),t._hasOnChange=!0),t.hasClass("placeholder")&&(t.getEl("inp").value="",t.removeClass("placeholder"))}),t.on("focusout",function(){0===t.value().length&&(t.getEl("inp").value=e.placeholder,t.addClass("placeholder"))}))},showMenu:function(){var e=this,n=e.settings,r;e.menu||(r=n.menu||[],r.length?r={type:"menu",items:r}:r.type=r.type||"menu",e.menu=t.create(r).parent(e).renderTo(e.getContainerElm()),e.fire("createmenu"),e.menu.reflow(),e.menu.on("cancel",function(t){t.control===e.menu&&e.focus()}),e.menu.on("show hide",function(t){t.control.items().each(function(t){t.active(t.value()==e.value())})}).fire("show"),e.menu.on("select",function(t){e.value(t.control.value())}),e.on("focusin",function(t){"INPUT"==t.target.tagName&&e.menu.hide()}),e.aria("expanded",!0)),e.menu.show(),e.menu.layoutRect({w:e.layoutRect().w}),e.menu.moveRel(e.getEl(),e.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])},value:function(e){var t=this;return"undefined"!=typeof e?(t._value=e,t.removeClass("placeholder"),t._rendered&&(t.getEl("inp").value=e),t):t._rendered?(e=t.getEl("inp").value,e!=t.settings.placeholder?e:""):t._value},disabled:function(e){var t=this;return t._rendered&&"undefined"!=typeof e&&(t.getEl("inp").disabled=e),t._super(e)},focus:function(){this.getEl("inp").focus()},repaint:function(){var e=this,t=e.getEl(),r=e.getEl("open"),i=e.layoutRect(),o,a;o=r?i.w-n.getSize(r).width-10:i.w-10;var s=document;return s.all&&(!s.documentMode||s.documentMode<=8)&&(a=e.layoutRect().h-2+"px"),n.css(t.firstChild,{width:o,lineHeight:a}),e._super(),e},postRender:function(){var e=this;return n.on(this.getEl("inp"),"change",function(){e.fire("change")}),e._super()},remove:function(){n.off(this.getEl("inp")),this._super()},renderHtml:function(){var e=this,t=e._id,n=e.settings,r=e.classPrefix,i=n.value||n.placeholder||"",o,a,s="",l="";return"spellcheck"in n&&(l+=' spellcheck="'+n.spellcheck+'"'),n.maxLength&&(l+=' maxlength="'+n.maxLength+'"'),n.size&&(l+=' size="'+n.size+'"'),n.subtype&&(l+=' type="'+n.subtype+'"'),e.disabled()&&(l+=' disabled="disabled"'),o=n.icon,o&&"caret"!=o&&(o=r+"ico "+r+"i-"+n.icon),a=e._text,(o||a)&&(s='
",e.addClass("has-open")),'
"+s+"
" +}})}),r(Et,[yt,J],function(e,t){return e.extend({init:function(e){var t=this;e.delimiter||(e.delimiter="\xbb"),t._super(e),t.addClass("path"),t.canFocus=!0,t.on("click",function(e){var n,r=e.target;(n=r.getAttribute("data-index"))&&t.fire("select",{value:t.data()[n],index:n})})},focus:function(){var e=this;return e.keyNav=new t({root:e,enableLeftRight:!0}),e.keyNav.focusFirst(),e},data:function(e){var t=this;return"undefined"!=typeof e?(t._data=e,t.update(),t):t._data},update:function(){this.innerHtml(this._getPathHtml())},postRender:function(){var e=this;e._super(),e.data(e.settings.data)},renderHtml:function(){var e=this;return'
'+e._getPathHtml()+"
"},_getPathHtml:function(){var e=this,t=e._data||[],n,r,i="",o=e.classPrefix;for(n=0,r=t.length;r>n;n++)i+=(n>0?'":"")+'
'+t[n].name+"
";return i||(i='
 
'),i}})}),r(kt,[Et,st],function(e,t){return e.extend({postRender:function(){function e(e){if(1===e.nodeType){if("BR"==e.nodeName||e.getAttribute("data-mce-bogus"))return!0;if("bookmark"===e.getAttribute("data-mce-type"))return!0}return!1}var n=this,r=t.activeEditor;return n.on("select",function(t){var n=[],i,o=r.getBody();for(r.focus(),i=r.selection.getStart();i&&i!=o;)e(i)||n.push(i),i=i.parentNode;r.selection.select(n[n.length-1-t.index]),r.nodeChanged()}),r.on("nodeChange",function(t){for(var i=[],o=t.parents,a=o.length;a--;)if(1==o[a].nodeType&&!e(o[a])){var s=r.fire("ResolveName",{name:o[a].nodeName.toLowerCase(),target:o[a]});i.push({name:s.name})}n.data(i)}),n._super()}})}),r(St,[q],function(e){return e.extend({Defaults:{layout:"flex",align:"center",defaults:{flex:1}},renderHtml:function(){var e=this,t=e._layout,n=e.classPrefix;return e.addClass("formitem"),t.preRender(e),'
'+(e.settings.title?'
'+e.settings.title+"
":"")+'
'+(e.settings.html||"")+t.renderHtml(e)+"
"}})}),r(Tt,[q,St],function(e,t){return e.extend({Defaults:{containerCls:"form",layout:"flex",direction:"column",align:"stretch",flex:1,padding:20,labelGap:30,spacing:10,callbacks:{submit:function(){this.submit()}}},preRender:function(){var e=this,n=e.items();n.each(function(n){var r,i=n.settings.label;i&&(r=new t({layout:"flex",autoResize:"overflow",defaults:{flex:1},items:[{type:"label",text:i,flex:0,forId:n._id,disabled:n.disabled()}]}),r.type="formitem","undefined"==typeof n.settings.flex&&(n.settings.flex=1),e.replace(n,r),r.add(n))})},recalcLabels:function(){var e=this,t=0,n=[],r,i;if(e.settings.labelGapCalc!==!1)for(e.items().filter("formitem").each(function(e){var r=e.items()[0],i=r.getEl().clientWidth;t=i>t?i:t,n.push(r)}),i=e.settings.labelGap||0,r=n.length;r--;)n[r].settings.minWidth=t+i},visible:function(e){var t=this._super(e);return e===!0&&this._rendered&&this.recalcLabels(),t},submit:function(){return this.fire("submit",{data:this.toJSON()})},postRender:function(){var e=this;e._super(),e.recalcLabels(),e.fromJSON(e.settings.data)}})}),r(Rt,[Tt],function(e){return e.extend({Defaults:{containerCls:"fieldset",layout:"flex",direction:"column",align:"stretch",flex:1,padding:"25 15 5 15",labelGap:30,spacing:10,border:1},renderHtml:function(){var e=this,t=e._layout,n=e.classPrefix;return e.preRender(),t.preRender(e),'
'+(e.settings.title?''+e.settings.title+"":"")+'
'+(e.settings.html||"")+t.renderHtml(e)+"
"}})}),r(At,[Nt],function(e){return e.extend({init:function(e){var t=this,n=tinymce.activeEditor,r;e.spellcheck=!1,r=n.settings.file_browser_callback,r&&(e.icon="browse",e.onaction=function(){r(t.getEl("inp").id,t.getEl("inp").value,e.filetype,window)}),t._super(e)}})}),r(Bt,[gt],function(e){return e.extend({recalc:function(e){var t=e.layoutRect(),n=e.paddingBox();e.items().filter(":visible").each(function(e){e.layoutRect({x:n.left,y:n.top,w:t.innerW-n.right-n.left,h:t.innerH-n.top-n.bottom}),e.recalc&&e.recalc()})}})}),r(Lt,[gt],function(e){return e.extend({recalc:function(e){var t,n,r,i,o,a,s,l,c,d,u,f,p,m,h,g,v=[],y,b,C,x,w,_,N,E,k,S,T,R,A,B,L,H,M,D,P,O,I,z,F,W,V=Math.max,U=Math.min;for(r=e.items().filter(":visible"),i=e.layoutRect(),o=e._paddingBox,a=e.settings,f=e.isRtl()?a.direction||"row-reversed":a.direction,s=a.align,l=e.isRtl()?a.pack||"end":a.pack,c=a.spacing||0,("row-reversed"==f||"column-reverse"==f)&&(r=r.set(r.toArray().reverse()),f=f.split("-")[0]),"column"==f?(k="y",N="h",E="minH",S="maxH",R="innerH",T="top",A="bottom",B="deltaH",L="contentH",I="left",D="w",H="x",M="innerW",P="minW",O="maxW",z="right",F="deltaW",W="contentW"):(k="x",N="w",E="minW",S="maxW",R="innerW",T="left",A="right",B="deltaW",L="contentW",I="top",D="h",H="y",M="innerH",P="minH",O="maxH",z="bottom",F="deltaH",W="contentH"),u=i[R]-o[T]-o[T],_=d=0,t=0,n=r.length;n>t;t++)p=r[t],m=p.layoutRect(),h=p.settings,g=h.flex,u-=n-1>t?c:0,g>0&&(d+=g,m[S]&&v.push(p),m.flex=g),u-=m[E],y=o[I]+m[P]+o[z],y>_&&(_=y);if(x={},x[E]=0>u?i[E]-u+i[B]:i[R]-u+i[B],x[P]=_+i[F],x[L]=i[R]-u,x[W]=_,x.minW=U(x.minW,i.maxW),x.minH=U(x.minH,i.maxH),x.minW=V(x.minW,i.startMinWidth),x.minH=V(x.minH,i.startMinHeight),!i.autoResize||x.minW==i.minW&&x.minH==i.minH){for(C=u/d,t=0,n=v.length;n>t;t++)p=v[t],m=p.layoutRect(),b=m[S],y=m[E]+m.flex*C,y>b?(u-=m[S]-m[E],d-=m.flex,m.flex=0,m.maxFlexSize=b):m.maxFlexSize=0;for(C=u/d,w=o[T],x={},0===d&&("end"==l?w=u+o[T]:"center"==l?(w=Math.round(i[R]/2-(i[R]-u)/2)+o[T],0>w&&(w=o[T])):"justify"==l&&(w=o[T],c=Math.floor(u/(r.length-1)))),x[H]=o[I],t=0,n=r.length;n>t;t++)p=r[t],m=p.layoutRect(),y=m.maxFlexSize||m[E],"center"===s?x[H]=Math.round(i[M]/2-m[D]/2):"stretch"===s?(x[D]=V(m[P]||0,i[M]-o[I]-o[z]),x[H]=o[I]):"end"===s&&(x[H]=i[M]-m[D]-o.top),m.flex>0&&(y+=m.flex*C),x[N]=y,x[k]=w,p.layoutRect(x),p.recalc&&p.recalc(),w+=y+c}else if(x.w=x.minW,x.h=x.minH,e.layoutRect(x),this.recalc(e),null===e._lastRect){var q=e.parent();q&&(q._lastRect=null,q.recalc())}}})}),r(Ht,[ht],function(e){return e.extend({Defaults:{containerClass:"flow-layout",controlClass:"flow-layout-item",endClass:"break"},recalc:function(e){e.items().filter(":visible").each(function(e){e.recalc&&e.recalc()})}})}),r(Mt,[V,yt,X,f,st,h],function(e,t,n,r,i,o){function a(e){function t(t){function n(e){return e.replace(/%(\w+)/g,"")}var r,i,o=e.dom,a="",l,c;return c=e.settings.preview_styles,c===!1?"":(c||(c="font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow"),(t=e.formatter.get(t))?(t=t[0],r=t.block||t.inline||"span",i=o.create(r),s(t.styles,function(e,t){e=n(e),e&&o.setStyle(i,t,e)}),s(t.attributes,function(e,t){e=n(e),e&&o.setAttrib(i,t,e)}),s(t.classes,function(e){e=n(e),o.hasClass(i,e)||o.addClass(i,e)}),e.fire("PreviewFormats"),o.setStyles(i,{position:"absolute",left:-65535}),e.getBody().appendChild(i),l=o.getStyle(e.getBody(),"fontSize",!0),l=/px$/.test(l)?parseInt(l,10):0,s(c.split(" "),function(t){var n=o.getStyle(i,t,!0);if(!("background-color"==t&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(n)&&(n=o.getStyle(e.getBody(),t,!0),"#ffffff"==o.toHex(n).toLowerCase())||"color"==t&&"#000000"==o.toHex(n).toLowerCase())){if("font-size"==t&&/em|%$/.test(n)){if(0===l)return;n=parseFloat(n,10)/(/%$/.test(n)?100:1),n=n*l+"px"}"border"==t&&n&&(a+="padding:0 2px;"),a+=t+":"+n+";"}}),e.fire("AfterPreviewFormats"),o.remove(i),a):void 0)}function r(t,n){return function(){var r=this;e.on("nodeChange",function(i){var o=e.formatter,a=null;s(i.parents,function(e){return s(t,function(t){return n?o.matchNode(e,n,{value:t.value})&&(a=t.value):o.matchNode(e,t.value)&&(a=t.value),a?!1:void 0}),a?!1:void 0}),r.value(a)})}}function i(e){e=e.split(";");for(var t=e.length;t--;)e[t]=e[t].split("=");return e}function o(){function n(e){var t=[];if(e)return s(e,function(e){var r={text:e.title,icon:e.icon};if(e.items)r.menu=n(e.items);else{var a=e.format||"custom"+i++;e.format||(e.name=a,o.push(e)),r.format=a}t.push(r)}),t}function r(){var t;return t=n(e.settings.style_formats_merge?e.settings.style_formats?a.concat(e.settings.style_formats):a:e.settings.style_formats||a)}var i=0,o=[],a=[{title:"Headers",items:[{title:"Header 1",format:"h1"},{title:"Header 2",format:"h2"},{title:"Header 3",format:"h3"},{title:"Header 4",format:"h4"},{title:"Header 5",format:"h5"},{title:"Header 6",format:"h6"}]},{title:"Inline",items:[{title:"Bold",icon:"bold",format:"bold"},{title:"Italic",icon:"italic",format:"italic"},{title:"Underline",icon:"underline",format:"underline"},{title:"Strikethrough",icon:"strikethrough",format:"strikethrough"},{title:"Superscript",icon:"superscript",format:"superscript"},{title:"Subscript",icon:"subscript",format:"subscript"},{title:"Code",icon:"code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Alignment",items:[{title:"Left",icon:"alignleft",format:"alignleft"},{title:"Center",icon:"aligncenter",format:"aligncenter"},{title:"Right",icon:"alignright",format:"alignright"},{title:"Justify",icon:"alignjustify",format:"alignjustify"}]}];return e.on("init",function(){s(o,function(t){e.formatter.register(t.name,t)})}),{type:"menu",items:r(),onPostRender:function(t){e.fire("renderFormatsMenu",{control:t.control})},itemDefaults:{preview:!0,textStyle:function(){return this.settings.format?t(this.settings.format):void 0},onPostRender:function(){var t=this,n=this.settings.format;n&&t.parent().on("show",function(){t.disabled(!e.formatter.canApply(n)),t.active(e.formatter.match(n))})},onclick:function(){this.settings.format&&f(this.settings.format)}}}}function a(){return e.undoManager?e.undoManager.hasUndo():!1}function l(){return e.undoManager?e.undoManager.hasRedo():!1}function c(){var t=this;t.disabled(!a()),e.on("Undo Redo AddUndo TypingUndo",function(){t.disabled(!a())})}function d(){var t=this;t.disabled(!l()),e.on("Undo Redo AddUndo TypingUndo",function(){t.disabled(!l())})}function u(){var t=this;e.on("VisualAid",function(e){t.active(e.hasVisual)}),t.active(e.hasVisual)}function f(t){t.control&&(t=t.control.value()),t&&e.execCommand("mceToggleFormat",!1,t)}var p;p=o(),s({bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript"},function(t,n){e.addButton(n,{tooltip:t,onPostRender:function(){var t=this;e.formatter?e.formatter.formatChanged(n,function(e){t.active(e)}):e.on("init",function(){e.formatter.formatChanged(n,function(e){t.active(e)})})},onclick:function(){f(n)}})}),s({outdent:["Decrease indent","Outdent"],indent:["Increase indent","Indent"],cut:["Cut","Cut"],copy:["Copy","Copy"],paste:["Paste","Paste"],help:["Help","mceHelp"],selectall:["Select all","SelectAll"],hr:["Insert horizontal rule","InsertHorizontalRule"],removeformat:["Clear formatting","RemoveFormat"],visualaid:["Visual aids","mceToggleVisualAid"],newdocument:["New document","mceNewDocument"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1]})}),s({blockquote:["Blockquote","mceBlockQuote"],numlist:["Numbered list","InsertOrderedList"],bullist:["Bullet list","InsertUnorderedList"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],alignleft:["Align left","JustifyLeft"],aligncenter:["Align center","JustifyCenter"],alignright:["Align right","JustifyRight"],alignjustify:["Justify","JustifyFull"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1],onPostRender:function(){var t=this;e.formatter?e.formatter.formatChanged(n,function(e){t.active(e)}):e.on("init",function(){e.formatter.formatChanged(n,function(e){t.active(e)})})}})}),e.addButton("undo",{tooltip:"Undo",onPostRender:c,cmd:"undo"}),e.addButton("redo",{tooltip:"Redo",onPostRender:d,cmd:"redo"}),e.addMenuItem("newdocument",{text:"New document",shortcut:"Ctrl+N",icon:"newdocument",cmd:"mceNewDocument"}),e.addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Ctrl+Z",onPostRender:c,cmd:"undo"}),e.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Ctrl+Y",onPostRender:d,cmd:"redo"}),e.addMenuItem("visualaid",{text:"Visual aids",selectable:!0,onPostRender:u,cmd:"mceToggleVisualAid"}),s({cut:["Cut","Cut","Ctrl+X"],copy:["Copy","Copy","Ctrl+C"],paste:["Paste","Paste","Ctrl+V"],selectall:["Select all","SelectAll","Ctrl+A"],bold:["Bold","Bold","Ctrl+B"],italic:["Italic","Italic","Ctrl+I"],underline:["Underline","Underline"],strikethrough:["Strikethrough","Strikethrough"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],removeformat:["Clear formatting","RemoveFormat"]},function(t,n){e.addMenuItem(n,{text:t[0],icon:n,shortcut:t[2],cmd:t[1]})}),e.on("mousedown",function(){n.hideAll()}),e.addButton("styleselect",{type:"menubutton",text:"Formats",menu:p}),e.addButton("formatselect",function(){var n=[],o=i(e.settings.block_formats||"Paragraph=p;Address=address;Pre=pre;Header 1=h1;Header 2=h2;Header 3=h3;Header 4=h4;Header 5=h5;Header 6=h6");return s(o,function(e){n.push({text:e[0],value:e[1],textStyle:function(){return t(e[1])}})}),{type:"listbox",text:o[0][0],values:n,fixedWidth:!0,onselect:f,onPostRender:r(n)}}),e.addButton("fontselect",function(){var t="Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",n=[],o=i(e.settings.font_formats||t);return s(o,function(e){n.push({text:{raw:e[0]},value:e[1],textStyle:-1==e[1].indexOf("dings")?"font-family:"+e[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:n,fixedWidth:!0,onPostRender:r(n,"fontname"),onselect:function(t){t.control.settings.value&&e.execCommand("FontName",!1,t.control.settings.value)}}}),e.addButton("fontsizeselect",function(){var t=[],n="8pt 10pt 12pt 14pt 18pt 24pt 36pt",i=e.settings.fontsize_formats||n;return s(i.split(" "),function(e){t.push({text:e,value:e})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:t,fixedWidth:!0,onPostRender:r(t,"fontsize"),onclick:function(t){t.control.settings.value&&e.execCommand("FontSize",!1,t.control.settings.value)}}}),e.addMenuItem("formats",{text:"Formats",menu:p})}var s=r.each;i.on("AddEditor",function(t){t.editor.rtl&&(e.rtl=!0),a(t.editor)}),e.translate=function(e){return i.translate(e)},t.tooltips=!o.iOS}),r(Dt,[gt],function(e){return e.extend({recalc:function(e){var t=e.settings,n,r,i,o,a,s,l,c,d,u,f,p,m,h,g,v,y,b,C,x,w,_,N=[],E=[],k,S,T,R,A,B;for(t=e.settings,i=e.items().filter(":visible"),o=e.layoutRect(),r=t.columns||Math.ceil(Math.sqrt(i.length)),n=Math.ceil(i.length/r),y=t.spacingH||t.spacing||0,b=t.spacingV||t.spacing||0,C=t.alignH||t.align,x=t.alignV||t.align,g=e._paddingBox,C&&"string"==typeof C&&(C=[C]),x&&"string"==typeof x&&(x=[x]),u=0;r>u;u++)N.push(0);for(f=0;n>f;f++)E.push(0);for(f=0;n>f;f++)for(u=0;r>u&&(d=i[f*r+u],d);u++)c=d.layoutRect(),k=c.minW,S=c.minH,N[u]=k>N[u]?k:N[u],E[f]=S>E[f]?S:E[f];for(A=o.innerW-g.left-g.right,w=0,u=0;r>u;u++)w+=N[u]+(u>0?y:0),A-=(u>0?y:0)+N[u];for(B=o.innerH-g.top-g.bottom,_=0,f=0;n>f;f++)_+=E[f]+(f>0?b:0),B-=(f>0?b:0)+E[f];if(w+=g.left+g.right,_+=g.top+g.bottom,l={},l.minW=w+(o.w-o.innerW),l.minH=_+(o.h-o.innerH),l.contentW=l.minW-o.deltaW,l.contentH=l.minH-o.deltaH,l.minW=Math.min(l.minW,o.maxW),l.minH=Math.min(l.minH,o.maxH),l.minW=Math.max(l.minW,o.startMinWidth),l.minH=Math.max(l.minH,o.startMinHeight),!o.autoResize||l.minW==o.minW&&l.minH==o.minH){o.autoResize&&(l=e.layoutRect(l),l.contentW=l.minW-o.deltaW,l.contentH=l.minH-o.deltaH);var L;L="start"==t.packV?0:B>0?Math.floor(B/n):0;var H=0,M=t.flexWidths;if(M)for(u=0;uu;u++)N[u]+=M?M[u]*D:D;for(m=g.top,f=0;n>f;f++){for(p=g.left,s=E[f]+L,u=0;r>u&&(d=i[f*r+u],d);u++)h=d.settings,c=d.layoutRect(),a=Math.max(N[u],c.startMinWidth),T=R=0,c.x=p,c.y=m,v=h.alignH||(C?C[u]||C[0]:null),"center"==v?c.x=p+a/2-c.w/2:"right"==v?c.x=p+a-c.w:"stretch"==v&&(c.w=a),v=h.alignV||(x?x[u]||x[0]:null),"center"==v?c.y=m+s/2-c.h/2:"bottom"==v?c.y=m+s-c.h:"stretch"==v&&(c.h=s),d.layoutRect(c),p+=a+y,d.recalc&&d.recalc();m+=s+b}}else if(l.w=l.minW,l.h=l.minH,e.layoutRect(l),this.recalc(e),null===e._lastRect){var P=e.parent();P&&(P._lastRect=null,P.recalc())}}})}),r(Pt,[yt],function(e){return e.extend({renderHtml:function(){var e=this;return e.addClass("iframe"),e.canFocus=!1,''},src:function(e){this.getEl().src=e},html:function(e,t){var n=this,r=this.getEl().contentWindow.document.body;return r?(r.innerHTML=e,t&&t()):setTimeout(function(){n.html(e)},0),this}})}),r(Ot,[yt,W],function(e,t){return e.extend({init:function(e){var t=this;t._super(e),t.addClass("widget"),t.addClass("label"),t.canFocus=!1,e.multiline&&t.addClass("autoscroll"),e.strong&&t.addClass("strong")},initLayoutRect:function(){var e=this,n=e._super();if(e.settings.multiline){var r=t.getSize(e.getEl());r.width>n.maxW&&(n.minW=n.maxW,e.addClass("multiline")),e.getEl().style.width=n.minW+"px",n.startMinH=n.h=n.minH=Math.min(n.maxH,t.getSize(e.getEl()).height)}return n},repaint:function(){var e=this;return e.settings.multiline||(e.getEl().style.lineHeight=e.layoutRect().h+"px"),e._super()},text:function(e){var t=this;return t._rendered&&e&&this.innerHtml(t.encode(e)),t._super(e)},renderHtml:function(){var e=this,t=e.settings.forId;return'"}})}),r(It,[q,J],function(e,t){return e.extend({Defaults:{role:"toolbar",layout:"flow"},init:function(e){var t=this;t._super(e),t.addClass("toolbar")},postRender:function(){var e=this;return e.items().addClass("toolbar-item"),e.keyNav=new t({root:e,enableLeftRight:!0}),e._super()}})}),r(zt,[It],function(e){return e.extend({Defaults:{role:"menubar",containerCls:"menubar",defaults:{type:"menubutton"}}})}),r(Ft,[bt,U,zt],function(e,t,n){function r(e,t){for(;e;){if(t===e)return!0;e=e.parentNode}return!1}var i=e.extend({init:function(e){var t=this;t._renderOpen=!0,t._super(e),t.addClass("menubtn"),e.fixedWidth&&t.addClass("fixed-width"),t.aria("haspopup",!0),t.hasPopup=!0},showMenu:function(){var e=this,n=e.settings,r;return e.menu&&e.menu.visible()?e.hideMenu():(e.menu||(r=n.menu||[],r.length?r={type:"menu",items:r}:r.type=r.type||"menu",e.menu=t.create(r).parent(e).renderTo(e.getContainerElm()),e.fire("createmenu"),e.menu.reflow(),e.menu.on("cancel",function(t){t.control===e.menu&&e.focus()}),e.menu.on("show hide",function(t){t.control==e.menu&&e.activeMenu("show"==t.type)}).fire("show"),e.aria("expanded",!0)),e.menu.show(),e.menu.layoutRect({w:e.layoutRect().w}),void e.menu.moveRel(e.getEl(),e.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"]))},hideMenu:function(){var e=this;e.menu&&(e.menu.items().each(function(e){e.hideMenu&&e.hideMenu()}),e.menu.hide(),e.aria("expanded",!1))},activeMenu:function(e){this.toggleClass("active",e)},renderHtml:function(){var e=this,t=e._id,r=e.classPrefix,i=e.settings.icon?r+"ico "+r+"i-"+e.settings.icon:"";return e.aria("role",e.parent()instanceof n?"menuitem":"button"),'
'},postRender:function(){var e=this;return e.on("click",function(t){t.control===e&&r(t.target,e.getEl())&&(e.showMenu(),t.keyboard&&e.menu.items()[0].focus())}),e.on("mouseenter",function(t){var n=t.control,r=e.parent(),o;n&&r&&n instanceof i&&n.parent()==r&&(r.items().filter("MenuButton").each(function(e){e.hideMenu&&e!=n&&(e.menu&&e.menu.visible()&&(o=!0),e.hideMenu())}),o&&(n.focus(),n.showMenu()))}),e._super()},text:function(e){var t=this,n,r;if(t._rendered)for(r=t.getEl("open").getElementsByTagName("span"),n=0;n'+("-"!==o?' ":"")+("-"!==o?''+o+"":"")+(l?'
'+l+"
":"")+(r.menu?'
':"")+""},postRender:function(){var e=this,t=e.settings,n=t.textStyle;if("function"==typeof n&&(n=n.call(this)),n){var r=e.getEl("text");r&&r.setAttribute("style",n)}return e._super()},remove:function(){this._super(),this.menu&&this.menu.remove()}})}),r(Ut,[X,J,Vt,f],function(e,t,n,r){var i=e.extend({Defaults:{defaultType:"menuitem",border:1,layout:"stack",role:"menu"},init:function(e){var i=this;if(e.autohide=!0,e.constrainToViewport=!0,e.itemDefaults)for(var o=e.items,a=o.length;a--;)o[a]=r.extend({},e.itemDefaults,o[a]);i._super(e),i.addClass("menu"),i.keyNav=new t({root:i,enableUpDown:!0,enableLeftRight:!0,leftAction:function(){i.parent()instanceof n&&i.keyNav.cancel()},onCancel:function(){i.fire("cancel",{},!1),i.hide()}})},repaint:function(){return this.toggleClass("menu-align",!0),this._super(),this.getEl().style.height="",this.getEl("body").style.height="",this},cancel:function(){var e=this;e.hideAll(),e.fire("cancel"),e.fire("select")},hideAll:function(){var e=this;return this.find("menuitem").exec("hideMenu"),e._super()},preRender:function(){var e=this;return e.items().each(function(t){var n=t.settings;return n.icon||n.selectable?(e._hasIcons=!0,!1):void 0}),e._super()}});return i}),r(qt,[xt],function(e){return e.extend({Defaults:{classes:"radio",role:"radio"}})}),r(jt,[yt,j],function(e,t){return e.extend({renderHtml:function(){var e=this,t=e.classPrefix;return e.addClass("resizehandle"),"both"==e.settings.direction&&e.addClass("resizehandle-both"),e.canFocus=!1,'
'},postRender:function(){var e=this;e._super(),e.resizeDragHelper=new t(this._id,{start:function(){e.fire("ResizeStart")},drag:function(t){"both"!=e.settings.direction&&(t.deltaX=0),e.fire("Resize",t)},stop:function(){e.fire("ResizeEnd")}})},remove:function(){return this.resizeDragHelper&&this.resizeDragHelper.destroy(),this._super()}})}),r($t,[yt],function(e){return e.extend({renderHtml:function(){var e=this;return e.addClass("spacer"),e.canFocus=!1,'
'}})}),r(Kt,[Ft,W],function(e,t){return e.extend({Defaults:{classes:"widget btn splitbtn",role:"splitbutton"},repaint:function(){var e=this,n=e.getEl(),r=e.layoutRect(),i,o;return e._super(),i=n.firstChild,o=n.lastChild,t.css(i,{width:r.w-t.getSize(o).width,height:r.h-2}),t.css(o,{height:r.h-2}),e},activeMenu:function(e){var n=this;t.toggleClass(n.getEl().lastChild,n.classPrefix+"active",e)},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r=e.settings.icon?n+"ico "+n+"i-"+e.settings.icon:"";return'
'},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(e){var n=e.target;if(e.control==this)for(;n;){if("BUTTON"==n.nodeName&&-1==n.className.indexOf("open"))return e.stopImmediatePropagation(),void t.call(this,e);n=n.parentNode}}),delete e.settings.onclick,e._super()}})}),r(Yt,[Ht],function(e){return e.extend({Defaults:{containerClass:"stack-layout",controlClass:"stack-layout-item",endClass:"break"}})}),r(Gt,[K,W],function(e,t){return e.extend({lastIdx:0,Defaults:{layout:"absolute",defaults:{type:"panel"}},activateTab:function(e){this.activeTabId&&t.removeClass(this.getEl(this.activeTabId),this.classPrefix+"active"),this.activeTabId="t"+e,t.addClass(this.getEl("t"+e),this.classPrefix+"active"),e!=this.lastIdx&&(this.items()[this.lastIdx].hide(),this.lastIdx=e),this.items()[e].show().fire("showtab"),this.reflow()},renderHtml:function(){var e=this,t=e._layout,n="",r=e.classPrefix;return e.preRender(),t.preRender(e),e.items().each(function(t,i){n+='
'+e.encode(t.settings.title)+"
"}),'
'+n+'
'+t.renderHtml(e)+"
"},postRender:function(){var e=this;e._super(),e.settings.activeTab=e.settings.activeTab||0,e.activateTab(e.settings.activeTab),this.on("click",function(t){var n=t.target.parentNode;if(t.target.parentNode.id==e._id+"-head")for(var r=n.childNodes.length;r--;)n.childNodes[r]==t.target&&e.activateTab(r)})},initLayoutRect:function(){var e=this,n,r,i;r=t.getSize(e.getEl("head")).width,r=0>r?0:r,i=0,e.items().each(function(t,n){r=Math.max(r,t.layoutRect().minW),i=Math.max(i,t.layoutRect().minH),e.settings.activeTab!=n&&t.hide()}),e.items().each(function(e){e.settings.x=0,e.settings.y=0,e.settings.w=r,e.settings.h=i,e.layoutRect({x:0,y:0,w:r,h:i})});var o=t.getSize(e.getEl("head")).height;return e.settings.minWidth=r,e.settings.minHeight=i+o,n=e._super(),n.deltaH+=o,n.innerH=n.h-n.deltaH,n}})}),r(Xt,[yt,W],function(e,t){return e.extend({init:function(e){var t=this;t._super(e),t._value=e.value||"",t.addClass("textbox"),e.multiline?t.addClass("multiline"):t.on("keydown",function(e){13==e.keyCode&&t.parents().reverse().each(function(t){return e.preventDefault(),t.hasEventListeners("submit")&&t.toJSON?(t.fire("submit",{data:t.toJSON()}),!1):void 0})})},disabled:function(e){var t=this;return t._rendered&&"undefined"!=typeof e&&(t.getEl().disabled=e),t._super(e)},value:function(e){var t=this;return"undefined"!=typeof e?(t._value=e,t._rendered&&(t.getEl().value=e),t):t._rendered?t.getEl().value:t._value},repaint:function(){var e=this,t,n,r,i=0,o=0,a;t=e.getEl().style,n=e._layoutRect,a=e._lastRepaintRect||{};var s=document;return!e.settings.multiline&&s.all&&(!s.documentMode||s.documentMode<=8)&&(t.lineHeight=n.h-o+"px"),r=e._borderBox,i=r.left+r.right+8,o=r.top+r.bottom+(e.settings.multiline?8:0),n.x!==a.x&&(t.left=n.x+"px",a.x=n.x),n.y!==a.y&&(t.top=n.y+"px",a.y=n.y),n.w!==a.w&&(t.width=n.w-i+"px",a.w=n.w),n.h!==a.h&&(t.height=n.h-o+"px",a.h=n.h),e._lastRepaintRect=a,e.fire("repaint",{},!1),e},renderHtml:function(){var e=this,t=e._id,n=e.settings,r=e.encode(e._value,!1),i="";return"spellcheck"in n&&(i+=' spellcheck="'+n.spellcheck+'"'),n.maxLength&&(i+=' maxlength="'+n.maxLength+'"'),n.size&&(i+=' size="'+n.size+'"'),n.subtype&&(i+=' type="'+n.subtype+'"'),e.disabled()&&(i+=' disabled="disabled"'),n.multiline?'":'"},postRender:function(){var e=this;return t.on(e.getEl(),"change",function(t){e.fire("change",t)}),e._super()},remove:function(){t.off(this.getEl()),this._super()}})}),r(Jt,[W],function(e){return function(t){var n=this,r;n.show=function(i){return n.hide(),r=!0,window.setTimeout(function(){r&&t.appendChild(e.createFragment('
'))},i||0),n},n.hide=function(){var e=t.lastChild;return e&&-1!=e.className.indexOf("throbber")&&e.parentNode.removeChild(e),r=!1,n}}}),a([l,c,d,u,f,p,m,h,g,v,y,b,C,x,w,_,N,E,k,S,T,R,A,B,L,H,M,D,P,O,I,z,F,W,V,U,q,j,$,K,Y,G,X,J,Q,Z,et,tt,nt,rt,it,ot,at,st,lt,ct,dt,ut,ft,pt,mt,ht,gt,vt,yt,bt,Ct,xt,wt,_t,Nt,Et,kt,St,Tt,Rt,At,Bt,Lt,Ht,Mt,Dt,Pt,Ot,It,zt,Ft,Wt,Vt,Ut,qt,jt,$t,Kt,Yt,Gt,Xt,Jt])}(this); \ No newline at end of file diff --git a/plugins/web_gui/static/plugins/xcharts/LICENSE b/plugins/web_gui/static/plugins/xcharts/LICENSE new file mode 100644 index 0000000..b5bdbb0 --- /dev/null +++ b/plugins/web_gui/static/plugins/xcharts/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2012 tenXer, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/plugins/web_gui/static/plugins/xcharts/README.md b/plugins/web_gui/static/plugins/xcharts/README.md new file mode 100644 index 0000000..6b9ff6e --- /dev/null +++ b/plugins/web_gui/static/plugins/xcharts/README.md @@ -0,0 +1,17 @@ +# xCharts [![Build Status](https://secure.travis-ci.org/tenXer/xcharts.png?branch=master)](http://travis-ci.org/tenxer/xcharts) + +[xCharts](http://tenxer.github.com/xcharts/) is a D3-based library for building custom charts and graphs. Written and maintained by [tenXer](https://www.tenxer.com). + +## Documentation + +View the [xCharts site](http://tenxer.github.com/xcharts/) for everything you need. + +## License + +Copyright (c) 2012 tenXer, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/plugins/web_gui/static/plugins/xcharts/xcharts.css b/plugins/web_gui/static/plugins/xcharts/xcharts.css new file mode 100644 index 0000000..8d8c760 --- /dev/null +++ b/plugins/web_gui/static/plugins/xcharts/xcharts.css @@ -0,0 +1,283 @@ +.xchart .line { + stroke-width: 3px; + fill: none; +} +.xchart .fill { + stroke-width: 0; +} +.xchart circle { + stroke: #FFF; + stroke-width: 3px; +} +.xchart .axis .domain { + fill: none; +} +.xchart .axis .tick line { + stroke: #EEE; + stroke-width: 1px; +} +.xchart .axis text { + font-family: Helvetica, Arial, Verdana, sans-serif; + fill: #666; + font-size: 12px; +} +.xchart .color0 .line { + stroke: #3880aa; +} +.xchart .color0 .line .fill { + pointer-events: none; +} +.xchart .color0 rect, +.xchart .color0 circle { + fill: #3880aa; +} +.xchart .color0 .fill { + fill: rgba(56, 128, 170, 0.1); +} +.xchart .color0.comp .line { + stroke: #89bbd8; +} +.xchart .color0.comp rect { + fill: #89bbd8; +} +.xchart .color0.comp .fill { + display: none; +} +.xchart .color0.comp circle, +.xchart .color0.comp .pointer { + fill: #89bbd8; +} +.xchart .color1 .line { + stroke: #4da944; +} +.xchart .color1 .line .fill { + pointer-events: none; +} +.xchart .color1 rect, +.xchart .color1 circle { + fill: #4da944; +} +.xchart .color1 .fill { + fill: rgba(77, 169, 68, 0.1); +} +.xchart .color1.comp .line { + stroke: #9dd597; +} +.xchart .color1.comp rect { + fill: #9dd597; +} +.xchart .color1.comp .fill { + display: none; +} +.xchart .color1.comp circle, +.xchart .color1.comp .pointer { + fill: #9dd597; +} +.xchart .color2 .line { + stroke: #f26522; +} +.xchart .color2 .line .fill { + pointer-events: none; +} +.xchart .color2 rect, +.xchart .color2 circle { + fill: #f26522; +} +.xchart .color2 .fill { + fill: rgba(242, 101, 34, 0.1); +} +.xchart .color2.comp .line { + stroke: #f9b99a; +} +.xchart .color2.comp rect { + fill: #f9b99a; +} +.xchart .color2.comp .fill { + display: none; +} +.xchart .color2.comp circle, +.xchart .color2.comp .pointer { + fill: #f9b99a; +} +.xchart .color3 .line { + stroke: #c6080d; +} +.xchart .color3 .line .fill { + pointer-events: none; +} +.xchart .color3 rect, +.xchart .color3 circle { + fill: #c6080d; +} +.xchart .color3 .fill { + fill: rgba(198, 8, 13, 0.1); +} +.xchart .color3.comp .line { + stroke: #f8555a; +} +.xchart .color3.comp rect { + fill: #f8555a; +} +.xchart .color3.comp .fill { + display: none; +} +.xchart .color3.comp circle, +.xchart .color3.comp .pointer { + fill: #f8555a; +} +.xchart .color4 .line { + stroke: #672d8b; +} +.xchart .color4 .line .fill { + pointer-events: none; +} +.xchart .color4 rect, +.xchart .color4 circle { + fill: #672d8b; +} +.xchart .color4 .fill { + fill: rgba(103, 45, 139, 0.1); +} +.xchart .color4.comp .line { + stroke: #a869ce; +} +.xchart .color4.comp rect { + fill: #a869ce; +} +.xchart .color4.comp .fill { + display: none; +} +.xchart .color4.comp circle, +.xchart .color4.comp .pointer { + fill: #a869ce; +} +.xchart .color5 .line { + stroke: #ce1797; +} +.xchart .color5 .line .fill { + pointer-events: none; +} +.xchart .color5 rect, +.xchart .color5 circle { + fill: #ce1797; +} +.xchart .color5 .fill { + fill: rgba(206, 23, 151, 0.1); +} +.xchart .color5.comp .line { + stroke: #f075cb; +} +.xchart .color5.comp rect { + fill: #f075cb; +} +.xchart .color5.comp .fill { + display: none; +} +.xchart .color5.comp circle, +.xchart .color5.comp .pointer { + fill: #f075cb; +} +.xchart .color6 .line { + stroke: #d9ce00; +} +.xchart .color6 .line .fill { + pointer-events: none; +} +.xchart .color6 rect, +.xchart .color6 circle { + fill: #d9ce00; +} +.xchart .color6 .fill { + fill: rgba(217, 206, 0, 0.1); +} +.xchart .color6.comp .line { + stroke: #fff75a; +} +.xchart .color6.comp rect { + fill: #fff75a; +} +.xchart .color6.comp .fill { + display: none; +} +.xchart .color6.comp circle, +.xchart .color6.comp .pointer { + fill: #fff75a; +} +.xchart .color7 .line { + stroke: #754c24; +} +.xchart .color7 .line .fill { + pointer-events: none; +} +.xchart .color7 rect, +.xchart .color7 circle { + fill: #754c24; +} +.xchart .color7 .fill { + fill: rgba(117, 76, 36, 0.1); +} +.xchart .color7.comp .line { + stroke: #c98c50; +} +.xchart .color7.comp rect { + fill: #c98c50; +} +.xchart .color7.comp .fill { + display: none; +} +.xchart .color7.comp circle, +.xchart .color7.comp .pointer { + fill: #c98c50; +} +.xchart .color8 .line { + stroke: #2eb9b4; +} +.xchart .color8 .line .fill { + pointer-events: none; +} +.xchart .color8 rect, +.xchart .color8 circle { + fill: #2eb9b4; +} +.xchart .color8 .fill { + fill: rgba(46, 185, 180, 0.1); +} +.xchart .color8.comp .line { + stroke: #86e1de; +} +.xchart .color8.comp rect { + fill: #86e1de; +} +.xchart .color8.comp .fill { + display: none; +} +.xchart .color8.comp circle, +.xchart .color8.comp .pointer { + fill: #86e1de; +} +.xchart .color9 .line { + stroke: #0e2e42; +} +.xchart .color9 .line .fill { + pointer-events: none; +} +.xchart .color9 rect, +.xchart .color9 circle { + fill: #0e2e42; +} +.xchart .color9 .fill { + fill: rgba(14, 46, 66, 0.1); +} +.xchart .color9.comp .line { + stroke: #2477ab; +} +.xchart .color9.comp rect { + fill: #2477ab; +} +.xchart .color9.comp .fill { + display: none; +} +.xchart .color9.comp circle, +.xchart .color9.comp .pointer { + fill: #2477ab; +} diff --git a/plugins/web_gui/static/plugins/xcharts/xcharts.js b/plugins/web_gui/static/plugins/xcharts/xcharts.js new file mode 100644 index 0000000..582407a --- /dev/null +++ b/plugins/web_gui/static/plugins/xcharts/xcharts.js @@ -0,0 +1,1158 @@ +/*! +xCharts v0.3.0 Copyright (c) 2012, tenXer, Inc. All Rights Reserved. +@license MIT license. http://github.com/tenXer/xcharts for details +*/ + +(function () { + +var xChart, + _vis = {}, + _scales = {}, + _visutils = {}; +(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,v=e.reduce,h=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION="1.4.3";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O="Reduce of empty array with no initial value";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduce===v)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduceRight===h)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?-1!=n.indexOf(t):E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2);return w.map(n,function(n){return(w.isFunction(t)?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t){return w.isEmpty(t)?[]:w.filter(n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var F=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=F(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||void 0===r)return 1;if(e>r||void 0===e)return-1}return n.indexi;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,"length")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,""+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i};var I=function(){};w.bind=function(n,t){var r,e;if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));if(!w.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));I.prototype=n.prototype;var u=new I;I.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},w.bindAll=function(n){var t=o.call(arguments,1);return 0==t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==t+"";case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if("[object Array]"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=S(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&S(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return S(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return"[object Array]"==l.call(n)},w.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){w["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,"callee"))}),w.isFunction=function(n){return"function"==typeof n},w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return void 0===n},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+(0|Math.random()*(t-n+1))};var T={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};T.unescape=w.invert(T.escape);var M={escape:RegExp("["+w.keys(T.escape).join("")+"]","g"),unescape:RegExp("("+w.keys(T.unescape).join("|")+")","g")};w.each(["escape","unescape"],function(n){w[n]=function(t){return null==t?"":(""+t).replace(M[n],function(t){return T[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=""+ ++N;return n?n+t:t},w.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;w.template=function(n,t,r){r=w.defaults({},r,w.templateSettings);var e=RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(D,function(n){return"\\"+B[n]}),r&&(i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(i+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),a&&(i+="';\n"+a+"\n__p+='"),u=o+t.length,t}),i+="';\n",r.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var a=Function(r.variable||"obj","_",i)}catch(o){throw o.source=i,o}if(t)return a(t,w);var c=function(n){return a.call(this,n,w)};return c.source="function("+(r.variable||"obj")+"){\n"+i+"}",c},w.chain=function(n){return w(n).chain()};var z=function(n){return this._chain?w(n).chain():n};w.mixin(w),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];w.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this);function getInsertionPoint(zIndex) { + return _.chain(_.range(zIndex, 10)).reverse().map(function (z) { + return 'g[data-index="' + z + '"]'; + }).value().join(', '); +} + +function colorClass(el, i) { + var c = el.getAttribute('class'); + return ((c !== null) ? c.replace(/color\d+/g, '') : '') + ' color' + i; +} + +_visutils = { + getInsertionPoint: getInsertionPoint, + colorClass: colorClass +}; +var local = this, + defaultSpacing = 0.25; + +function _getDomain(data, axis) { + return _.chain(data) + .pluck('data') + .flatten() + .pluck(axis) + .uniq() + .filter(function (d) { + return d !== undefined && d !== null; + }) + .value() + .sort(d3.ascending); +} + +_scales.ordinal = function (data, axis, bounds, extents) { + var domain = _getDomain(data, axis); + return d3.scale.ordinal() + .domain(domain) + .rangeRoundBands(bounds, defaultSpacing); +}; + +_scales.linear = function (data, axis, bounds, extents) { + return d3.scale.linear() + .domain(extents) + .nice() + .rangeRound(bounds); +}; + +_scales.exponential = function (data, axis, bounds, extents) { + return d3.scale.pow() + .exponent(0.65) + .domain(extents) + .nice() + .rangeRound(bounds); +}; + +_scales.time = function (data, axis, bounds, extents) { + return d3.time.scale() + .domain(_.map(extents, function (d) { return new Date(d); })) + .range(bounds); +}; + +function _extendDomain(domain, axis) { + var min = domain[0], + max = domain[1], + diff, + e; + + if (min === max) { + e = Math.max(Math.round(min / 10), 4); + min -= e; + max += e; + } + + diff = max - min; + min = (min) ? min - (diff / 10) : min; + min = (domain[0] > 0) ? Math.max(min, 0) : min; + max = (max) ? max + (diff / 10) : max; + max = (domain[1] < 0) ? Math.min(max, 0) : max; + + return [min, max]; +} + +function _getExtents(options, data, xType, yType) { + var extents, + nData = _.chain(data) + .pluck('data') + .flatten() + .value(); + + extents = { + x: d3.extent(nData, function (d) { return d.x; }), + y: d3.extent(nData, function (d) { return d.y; }) + }; + + _.each([xType, yType], function (type, i) { + var axis = (i) ? 'y' : 'x', + extended; + extents[axis] = d3.extent(nData, function (d) { return d[axis]; }); + if (type === 'ordinal') { + return; + } + + _.each([axis + 'Min', axis + 'Max'], function (minMax, i) { + if (type !== 'time') { + extended = _extendDomain(extents[axis]); + } + + if (options.hasOwnProperty(minMax) && options[minMax] !== null) { + extents[axis][i] = options[minMax]; + } else if (type !== 'time') { + extents[axis][i] = extended[i]; + } + }); + }); + + return extents; +} + +_scales.xy = function (self, data, xType, yType) { + var o = self._options, + extents = _getExtents(o, data, xType, yType), + scales = {}, + horiz = [o.axisPaddingLeft, self._width], + vert = [self._height, o.axisPaddingTop], + xScale, + yScale; + + _.each([xType, yType], function (type, i) { + var axis = (i === 0) ? 'x' : 'y', + bounds = (i === 0) ? horiz : vert, + fn = xChart.getScale(type); + scales[axis] = fn(data, axis, bounds, extents[axis]); + }); + + return scales; +}; +(function () { + var zIndex = 2, + selector = 'g.bar', + insertBefore = _visutils.getInsertionPoint(zIndex); + + function postUpdateScale(self, scaleData, mainData, compData) { + self.xScale2 = d3.scale.ordinal() + .domain(d3.range(0, mainData.length)) + .rangeRoundBands([0, self.xScale.rangeBand()], 0.08); + } + + function enter(self, storage, className, data, callbacks) { + var barGroups, bars, + yZero = self.yZero; + + barGroups = self._g.selectAll(selector + className) + .data(data, function (d) { + return d.className; + }); + + barGroups.enter().insert('g', insertBefore) + .attr('data-index', zIndex) + .style('opacity', 0) + .attr('class', function (d, i) { + var cl = _.uniq((className + d.className).split('.')).join(' '); + return cl + ' bar ' + _visutils.colorClass(this, i); + }) + .attr('transform', function (d, i) { + return 'translate(' + self.xScale2(i) + ',0)'; + }); + + bars = barGroups.selectAll('rect') + .data(function (d) { + return d.data; + }, function (d) { + return d.x; + }); + + bars.enter().append('rect') + .attr('width', 0) + .attr('rx', 3) + .attr('ry', 3) + .attr('x', function (d) { + return self.xScale(d.x) + (self.xScale2.rangeBand() / 2); + }) + .attr('height', function (d) { + return Math.abs(yZero - self.yScale(d.y)); + }) + .attr('y', function (d) { + return (d.y < 0) ? yZero : self.yScale(d.y); + }) + .on('mouseover', callbacks.mouseover) + .on('mouseout', callbacks.mouseout) + .on('click', callbacks.click); + + storage.barGroups = barGroups; + storage.bars = bars; + } + + function update(self, storage, timing) { + var yZero = self.yZero; + + storage.barGroups + .attr('class', function (d, i) { + return _visutils.colorClass(this, i); + }) + .transition().duration(timing) + .style('opacity', 1) + .attr('transform', function (d, i) { + return 'translate(' + self.xScale2(i) + ',0)'; + }); + + storage.bars.transition().duration(timing) + .attr('width', self.xScale2.rangeBand()) + .attr('x', function (d) { + return self.xScale(d.x); + }) + .attr('height', function (d) { + return Math.abs(yZero - self.yScale(d.y)); + }) + .attr('y', function (d) { + return (d.y < 0) ? yZero : self.yScale(d.y); + }); + } + + function exit(self, storage, timing) { + storage.bars.exit() + .transition().duration(timing) + .attr('width', 0) + .remove(); + storage.barGroups.exit() + .transition().duration(timing) + .style('opacity', 0) + .remove(); + } + + function destroy(self, storage, timing) { + var band = (self.xScale2) ? self.xScale2.rangeBand() / 2 : 0; + delete self.xScale2; + storage.bars + .transition().duration(timing) + .attr('width', 0) + .attr('x', function (d) { + return self.xScale(d.x) + band; + }); + } + + _vis.bar = { + postUpdateScale: postUpdateScale, + enter: enter, + update: update, + exit: exit, + destroy: destroy + }; +}()); +(function () { + + var zIndex = 3, + selector = 'g.line', + insertBefore = _visutils.getInsertionPoint(zIndex); + + function enter(self, storage, className, data, callbacks) { + var inter = self._options.interpolation, + x = function (d, i) { + if (!self.xScale2 && !self.xScale.rangeBand) { + return self.xScale(d.x); + } + return self.xScale(d.x) + (self.xScale.rangeBand() / 2); + }, + y = function (d) { return self.yScale(d.y); }, + line = d3.svg.line() + .x(x) + .interpolate(inter), + area = d3.svg.area() + .x(x) + .y1(self.yZero) + .interpolate(inter), + container, + fills, + paths; + + function datum(d) { + return [d.data]; + } + + container = self._g.selectAll(selector + className) + .data(data, function (d) { + return d.className; + }); + + container.enter().insert('g', insertBefore) + .attr('data-index', zIndex) + .attr('class', function (d, i) { + var cl = _.uniq((className + d.className).split('.')).join(' '); + return cl + ' line ' + _visutils.colorClass(this, i); + }); + + fills = container.selectAll('path.fill') + .data(datum); + + fills.enter().append('path') + .attr('class', 'fill') + .style('opacity', 0) + .attr('d', area.y0(y)); + + paths = container.selectAll('path.line') + .data(datum); + + paths.enter().append('path') + .attr('class', 'line') + .style('opacity', 0) + .attr('d', line.y(y)); + + storage.lineContainers = container; + storage.lineFills = fills; + storage.linePaths = paths; + storage.lineX = x; + storage.lineY = y; + storage.lineA = area; + storage.line = line; + } + + function update(self, storage, timing) { + storage.lineContainers + .attr('class', function (d, i) { + return _visutils.colorClass(this, i); + }); + + storage.lineFills.transition().duration(timing) + .style('opacity', 1) + .attr('d', storage.lineA.y0(storage.lineY)); + + storage.linePaths.transition().duration(timing) + .style('opacity', 1) + .attr('d', storage.line.y(storage.lineY)); + } + + function exit(self, storage) { + storage.linePaths.exit() + .style('opacity', 0) + .remove(); + storage.lineFills.exit() + .style('opacity', 0) + .remove(); + + storage.lineContainers.exit() + .remove(); + } + + function destroy(self, storage, timing) { + storage.linePaths.transition().duration(timing) + .style('opacity', 0); + storage.lineFills.transition().duration(timing) + .style('opacity', 0); + } + + _vis.line = { + enter: enter, + update: update, + exit: exit, + destroy: destroy + }; +}()); +(function () { + var line = _vis.line; + + function enter(self, storage, className, data, callbacks) { + var circles; + + line.enter(self, storage, className, data, callbacks); + + circles = storage.lineContainers.selectAll('circle') + .data(function (d) { + return d.data; + }, function (d) { + return d.x; + }); + + circles.enter().append('circle') + .style('opacity', 0) + .attr('cx', storage.lineX) + .attr('cy', storage.lineY) + .attr('r', 5) + .on('mouseover', callbacks.mouseover) + .on('mouseout', callbacks.mouseout) + .on('click', callbacks.click); + + storage.lineCircles = circles; + } + + function update(self, storage, timing) { + line.update.apply(null, _.toArray(arguments)); + + storage.lineCircles.transition().duration(timing) + .style('opacity', 1) + .attr('cx', storage.lineX) + .attr('cy', storage.lineY); + } + + function exit(self, storage) { + storage.lineCircles.exit() + .remove(); + line.exit.apply(null, _.toArray(arguments)); + } + + function destroy(self, storage, timing) { + line.destroy.apply(null, _.toArray(arguments)); + if (!storage.lineCircles) { + return; + } + storage.lineCircles.transition().duration(timing) + .style('opacity', 0); + } + + _vis['line-dotted'] = { + enter: enter, + update: update, + exit: exit, + destroy: destroy + }; +}()); +(function () { + var line = _vis['line-dotted']; + + function enter(self, storage, className, data, callbacks) { + line.enter(self, storage, className, data, callbacks); + } + + function _accumulate_data(data) { + function reduce(memo, num) { + return memo + num.y; + } + + var nData = _.map(data, function (set) { + var i = set.data.length, + d = _.clone(set.data); + set = _.clone(set); + while (i) { + i -= 1; + // Need to clone here, otherwise we are actually setting the same + // data onto the original data set. + d[i] = _.clone(set.data[i]); + d[i].y0 = set.data[i].y; + d[i].y = _.reduce(_.first(set.data, i), reduce, set.data[i].y); + } + return _.extend(set, { data: d }); + }); + + return nData; + } + + function _resetData(self) { + if (!self.hasOwnProperty('cumulativeOMainData')) { + return; + } + self._mainData = self.cumulativeOMainData; + delete self.cumulativeOMainData; + self._compData = self.cumulativeOCompData; + delete self.cumulativeOCompData; + } + + function preUpdateScale(self, data) { + _resetData(self); + self.cumulativeOMainData = self._mainData; + self._mainData = _accumulate_data(self._mainData); + self.cumulativeOCompData = self._compData; + self._compData = _accumulate_data(self._compData); + } + + function destroy(self, storage, timing) { + _resetData(self); + line.destroy.apply(null, _.toArray(arguments)); + } + + _vis.cumulative = { + preUpdateScale: preUpdateScale, + enter: enter, + update: line.update, + exit: line.exit, + destroy: destroy + }; +}()); +var emptyData = [[]], + defaults = { + // User interaction callbacks + mouseover: function (data, i) {}, + mouseout: function (data, i) {}, + click: function (data, i) {}, + + // Padding between the axes and the contents of the chart + axisPaddingTop: 0, + axisPaddingRight: 0, + axisPaddingBottom: 5, + axisPaddingLeft: 20, + + // Padding around the edge of the chart (space for axis labels, etc) + paddingTop: 0, + paddingRight: 0, + paddingBottom: 20, + paddingLeft: 60, + + // Axis tick formatting + tickHintX: 10, + tickFormatX: function (x) { return x; }, + tickHintY: 10, + tickFormatY: function (y) { return y; }, + + // Min/Max Axis Values + xMin: null, + xMax: null, + yMin: null, + yMax: null, + + // Pre-format input data + dataFormatX: function (x) { return x; }, + dataFormatY: function (y) { return y; }, + + unsupported: function (selector) { + d3.select(selector).text('SVG is not supported on your browser'); + }, + + // Callback functions if no data + empty: function (self, selector, d) {}, + notempty: function (self, selector) {}, + + timing: 750, + + // Line interpolation + interpolation: 'monotone', + + // Data sorting + sortX: function (a, b) { + return (!a.x && !b.x) ? 0 : (a.x < b.x) ? -1 : 1; + } + }; + +// What/how should the warning/error be presented? +function svgEnabled() { + var d = document; + return (!!d.createElementNS && + !!d.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect); +} + +/** + * Creates a new chart + * + * @param string type The drawing type for the main data + * @param array data Data to render in the chart + * @param string selector CSS Selector for the parent element for the chart + * @param object options Optional. See `defaults` for options + * + * Examples: + * var data = { + * "main": [ + * { + * "data": [ + * { + * "x": "2012-08-09T07:00:00.522Z", + * "y": 68 + * }, + * { + * "x": "2012-08-10T07:00:00.522Z", + * "y": 295 + * }, + * { + * "x": "2012-08-11T07:00:00.522Z", + * "y": 339 + * }, + * ], + * "className": ".foo" + * } + * ], + * "xScale": "ordinal", + * "yScale": "linear", + * "comp": [ + * { + * "data": [ + * { + * "x": "2012-08-09T07:00:00.522Z", + * "y": 288 + * }, + * { + * "x": "2012-08-10T07:00:00.522Z", + * "y": 407 + * }, + * { + * "x": "2012-08-11T07:00:00.522Z", + * "y": 459 + * } + * ], + * "className": ".comp.comp_foo", + * "type": "line-arrowed" + * } + * ] + * }, + * myChart = new Chart('bar', data, '#chart'); + * + */ +function xChart(type, data, selector, options) { + var self = this, + resizeLock; + + self._options = options = _.defaults(options || {}, defaults); + + if (svgEnabled() === false) { + return options.unsupported(selector); + } + + self._selector = selector; + self._container = d3.select(selector); + self._drawSvg(); + self._mainStorage = {}; + self._compStorage = {}; + + data = _.clone(data); + if (type && !data.type) { + data.type = type; + } + + self.setData(data); + + d3.select(window).on('resize.for.' + selector, function () { + if (resizeLock) { + clearTimeout(resizeLock); + } + resizeLock = setTimeout(function () { + resizeLock = null; + self._resize(); + }, 500); + }); +} + +/** + * Add a visualization type + * + * @param string type Unique key/name used with setType + * @param object vis object map of vis methods + */ +xChart.setVis = function (type, vis) { + if (_vis.hasOwnProperty(type)) { + throw 'Cannot override vis type "' + type + '".'; + } + _vis[type] = vis; +}; + +/** + * Get a clone of a visualization + * Useful for extending vis functionality + * + * @param string type Unique key/name of the vis + */ +xChart.getVis = function (type) { + if (!_vis.hasOwnProperty(type)) { + throw 'Vis type "' + type + '" does not exist.'; + } + + return _.clone(_vis[type]); +}; + +xChart.setScale = function (name, fn) { + if (_scales.hasOwnProperty(name)) { + throw 'Scale type "' + name + '" already exists.'; + } + + _scales[name] = fn; +}; + +xChart.getScale = function (name) { + if (!_scales.hasOwnProperty(name)) { + throw 'Scale type "' + name + '" does not exist.'; + } + return _scales[name]; +}; + +xChart.visutils = _visutils; + +_.defaults(xChart.prototype, { + /** + * Set or change the drawing type for the main data. + * + * @param string type Must be an available drawing type + * + */ + setType: function (type, skipDraw) { + var self = this; + + if (self._type && type === self._type) { + return; + } + + if (!_vis.hasOwnProperty(type)) { + throw 'Vis type "' + type + '" is not defined.'; + } + + if (self._type) { + self._destroy(self._vis, self._mainStorage); + } + + self._type = type; + self._vis = _vis[type]; + if (!skipDraw) { + self._draw(); + } + }, + + /** + * Set and update the data for the chart. Optionally skip drawing. + * + * @param object data New data. See new xChart example for format + * + */ + setData: function (data) { + var self = this, + o = self._options, + nData = _.clone(data); + + if (!data.hasOwnProperty('main')) { + throw 'No "main" key found in given chart data.'; + } + + switch (data.type) { + case 'bar': + // force the xScale to be ordinal + data.xScale = 'ordinal'; + break; + case undefined: + data.type = self._type; + break; + } + + o.xMin = (isNaN(parseInt(data.xMin, 10))) ? o.xMin : data.xMin; + o.xMax = (isNaN(parseInt(data.xMax, 10))) ? o.xMax : data.xMax; + o.yMin = (isNaN(parseInt(data.yMin, 10))) ? o.yMin : data.yMin; + o.yMax = (isNaN(parseInt(data.yMax, 10))) ? o.yMax : data.yMax; + + if (self._vis) { + self._destroy(self._vis, self._mainStorage); + } + + self.setType(data.type, true); + + function _mapData(set) { + var d = _.map(_.clone(set.data), function (p) { + var np = _.clone(p); + if (p.hasOwnProperty('x')) { + np.x = o.dataFormatX(p.x); + } + if (p.hasOwnProperty('y')) { + np.y = o.dataFormatY(p.y); + } + return np; + }).sort(o.sortX); + return _.extend(_.clone(set), { data: d }); + } + + nData.main = _.map(nData.main, _mapData); + self._mainData = nData.main; + self._xScaleType = nData.xScale; + self._yScaleType = nData.yScale; + + if (nData.hasOwnProperty('comp')) { + nData.comp = _.map(nData.comp, _mapData); + self._compData = nData.comp; + } else { + self._compData = []; + } + + self._draw(); + }, + + /** + * Change the scale of an axis + * + * @param string axis Name of an axis. One of 'x' or 'y' + * @param string type Name of the scale type + * + */ + setScale: function (axis, type) { + var self = this; + + switch (axis) { + case 'x': + self._xScaleType = type; + break; + case 'y': + self._yScaleType = type; + break; + default: + throw 'Cannot change scale of unknown axis "' + axis + '".'; + } + + self._draw(); + }, + + /** + * Create the SVG element and g container. Resize if necessary. + */ + _drawSvg: function () { + var self = this, + c = self._container, + options = self._options, + width = parseInt(c.style('width').replace('px', ''), 10), + height = parseInt(c.style('height').replace('px', ''), 10), + svg, + g, + gScale; + + svg = c.selectAll('svg') + .data(emptyData); + + svg.enter().append('svg') + // Inherit the height and width from the parent element + .attr('height', height) + .attr('width', width) + .attr('class', 'xchart'); + + svg.transition() + .attr('width', width) + .attr('height', height); + + g = svg.selectAll('g') + .data(emptyData); + + g.enter().append('g') + .attr( + 'transform', + 'translate(' + options.paddingLeft + ',' + options.paddingTop + ')' + ); + + gScale = g.selectAll('g.scale') + .data(emptyData); + + gScale.enter().append('g') + .attr('class', 'scale'); + + self._svg = svg; + self._g = g; + self._gScale = gScale; + + self._height = height - options.paddingTop - options.paddingBottom - + options.axisPaddingTop - options.axisPaddingBottom; + self._width = width - options.paddingLeft - options.paddingRight - + options.axisPaddingLeft - options.axisPaddingRight; + }, + + /** + * Resize the visualization + */ + _resize: function (event) { + var self = this; + + self._drawSvg(); + self._draw(); + }, + + /** + * Draw the x and y axes + */ + _drawAxes: function () { + if (this._noData) { + return; + } + var self = this, + o = self._options, + t = self._gScale.transition().duration(o.timing), + xTicks = o.tickHintX, + yTicks = o.tickHintY, + bottom = self._height + o.axisPaddingTop + o.axisPaddingBottom, + zeroLine = d3.svg.line().x(function (d) { return d; }), + zLine, + zLinePath, + xAxis, + xRules, + yAxis, + yRules, + labels; + + xRules = d3.svg.axis() + .scale(self.xScale) + .ticks(xTicks) + .tickSize(-self._height) + .tickFormat(o.tickFormatX) + .orient('bottom'); + + xAxis = self._gScale.selectAll('g.axisX') + .data(emptyData); + + xAxis.enter().append('g') + .attr('class', 'axis axisX') + .attr('transform', 'translate(0,' + bottom + ')'); + + xAxis.call(xRules); + + labels = self._gScale.selectAll('.axisX g')[0]; + if (labels.length > (self._width / 80)) { + labels.sort(function (a, b) { + var r = /translate\(([^,)]+)/; + a = a.getAttribute('transform').match(r); + b = b.getAttribute('transform').match(r); + return parseFloat(a[1], 10) - parseFloat(b[1], 10); + }); + + d3.selectAll(labels) + .filter(function (d, i) { + return i % (Math.ceil(labels.length / xTicks) + 1); + }) + .remove(); + } + + yRules = d3.svg.axis() + .scale(self.yScale) + .ticks(yTicks) + .tickSize(-self._width - o.axisPaddingRight - o.axisPaddingLeft) + .tickFormat(o.tickFormatY) + .orient('left'); + + yAxis = self._gScale.selectAll('g.axisY') + .data(emptyData); + + yAxis.enter().append('g') + .attr('class', 'axis axisY') + .attr('transform', 'translate(0,0)'); + + t.selectAll('g.axisY') + .call(yRules); + + // zero line + zLine = self._gScale.selectAll('g.axisZero') + .data([[]]); + + zLine.enter().append('g') + .attr('class', 'axisZero'); + + zLinePath = zLine.selectAll('line') + .data([[]]); + + zLinePath.enter().append('line') + .attr('x1', 0) + .attr('x2', self._width + o.axisPaddingLeft + o.axisPaddingRight) + .attr('y1', self.yZero) + .attr('y2', self.yZero); + + zLinePath.transition().duration(o.timing) + .attr('y1', self.yZero) + .attr('y2', self.yZero); + }, + + /** + * Update the x and y scales (used when drawing) + * + * Optional methods in drawing types: + * preUpdateScale + * postUpdateScale + * + * Example implementation in vis type: + * + * function postUpdateScale(self, scaleData, mainData, compData) { + * self.xScale2 = d3.scale.ordinal() + * .domain(d3.range(0, mainData.length)) + * .rangeRoundBands([0, self.xScale.rangeBand()], 0.08); + * } + * + */ + _updateScale: function () { + var self = this, + _unionData = function () { + return _.union(self._mainData, self._compData); + }, + scaleData = _unionData(), + vis = self._vis, + scale, + min; + + delete self.xScale; + delete self.yScale; + delete self.yZero; + + if (vis.hasOwnProperty('preUpdateScale')) { + vis.preUpdateScale(self, scaleData, self._mainData, self._compData); + } + + // Just in case preUpdateScale modified + scaleData = _unionData(); + scale = _scales.xy(self, scaleData, self._xScaleType, self._yScaleType); + + self.xScale = scale.x; + self.yScale = scale.y; + + min = self.yScale.domain()[0]; + self.yZero = (min > 0) ? self.yScale(min) : self.yScale(0); + + if (vis.hasOwnProperty('postUpdateScale')) { + vis.postUpdateScale(self, scaleData, self._mainData, self._compData); + } + }, + + /** + * Create (Enter) the elements for the vis + * + * Required method + * + * Example implementation in vis type: + * + * function enter(self, data, callbacks) { + * var foo = self._g.selectAll('g.foobar') + * .data(data); + * foo.enter().append('g') + * .attr('class', 'foobar'); + * self.foo = foo; + * } + */ + _enter: function (vis, storage, data, className) { + var self = this, + callbacks = { + click: self._options.click, + mouseover: self._options.mouseover, + mouseout: self._options.mouseout + }; + self._checkVisMethod(vis, 'enter'); + vis.enter(self, storage, className, data, callbacks); + }, + + /** + * Update the elements opened by the select method + * + * Required method + * + * Example implementation in vis type: + * + * function update(self, timing) { + * self.bars.transition().duration(timing) + * .attr('width', self.xScale2.rangeBand()) + * .attr('height', function (d) { + * return self.yScale(d.y); + * }); + * } + */ + _update: function (vis, storage) { + var self = this; + self._checkVisMethod(vis, 'update'); + vis.update(self, storage, self._options.timing); + }, + + /** + * Remove or transition out the elements that no longer have data + * + * Required method + * + * Example implementation in vis type: + * + * function exit(self) { + * self.bars.exit().remove(); + * } + */ + _exit: function (vis, storage) { + var self = this; + self._checkVisMethod(vis, 'exit'); + vis.exit(self, storage, self._options.timing); + }, + + /** + * Destroy the current vis type (transition to new type) + * + * Required method + * + * Example implementation in vis type: + * + * function destroy(self, timing) { + * self.bars.transition().duration(timing) + * attr('height', 0); + * delete self.bars; + * } + */ + _destroy: function (vis, storage) { + var self = this; + self._checkVisMethod(vis, 'destroy'); + try { + vis.destroy(self, storage, self._options.timing); + } catch (e) {} + }, + + /** + * Draw the visualization + */ + _draw: function () { + var self = this, + o = self._options, + comp, + compKeys; + + self._noData = _.flatten(_.pluck(self._mainData, 'data') + .concat(_.pluck(self._compData, 'data'))).length === 0; + + self._updateScale(); + self._drawAxes(); + + self._enter(self._vis, self._mainStorage, self._mainData, '.main'); + self._exit(self._vis, self._mainStorage); + self._update(self._vis, self._mainStorage); + + comp = _.chain(self._compData).groupBy(function (d) { + return d.type; + }); + compKeys = comp.keys(); + + // Find old comp vis items and remove any that no longer exist + _.each(self._compStorage, function (d, key) { + if (-1 === compKeys.indexOf(key).value()) { + var vis = _vis[key]; + self._enter(vis, d, [], '.comp.' + key.replace(/\W+/g, '')); + self._exit(vis, d); + } + }); + + comp.each(function (d, key) { + var vis = _vis[key], storage; + if (!self._compStorage.hasOwnProperty(key)) { + self._compStorage[key] = {}; + } + storage = self._compStorage[key]; + self._enter(vis, storage, d, '.comp.' + key.replace(/\W+/g, '')); + self._exit(vis, storage); + self._update(vis, storage); + }); + + if (self._noData) { + o.empty(self, self._selector, self._mainData); + } else { + o.notempty(self, self._selector); + } + }, + + /** + * Ensure drawing method exists + */ + _checkVisMethod: function (vis, method) { + var self = this; + if (!vis[method]) { + throw 'Required method "' + method + '" not found on vis type "' + + self._type + '".'; + } + } +}); +if (typeof define === 'function' && define.amd && typeof define.amd === 'object') { + define(function () { + return xChart; + }); + return; +} + +window.xChart = xChart; + +}()); diff --git a/plugins/web_gui/static/plugins/xcharts/xcharts.min.css b/plugins/web_gui/static/plugins/xcharts/xcharts.min.css new file mode 100644 index 0000000..d5912ea --- /dev/null +++ b/plugins/web_gui/static/plugins/xcharts/xcharts.min.css @@ -0,0 +1 @@ +.xchart .line{stroke-width:3px;fill:none}.xchart .fill{stroke-width:0}.xchart circle{stroke:#FFF;stroke-width:3px}.xchart .axis .domain{fill:none}.xchart .axis .tick line{stroke:#EEE;stroke-width:1px}.xchart .axis text{font-family:Helvetica,Arial,Verdana,sans-serif;fill:#666;font-size:12px}.xchart .color0 .line{stroke:#3880aa}.xchart .color0 .line .fill{pointer-events:none}.xchart .color0 rect,.xchart .color0 circle{fill:#3880aa}.xchart .color0 .fill{fill:rgba(56,128,170,0.1)}.xchart .color0.comp .line{stroke:#89bbd8}.xchart .color0.comp rect{fill:#89bbd8}.xchart .color0.comp .fill{display:none}.xchart .color0.comp circle,.xchart .color0.comp .pointer{fill:#89bbd8}.xchart .color1 .line{stroke:#4da944}.xchart .color1 .line .fill{pointer-events:none}.xchart .color1 rect,.xchart .color1 circle{fill:#4da944}.xchart .color1 .fill{fill:rgba(77,169,68,0.1)}.xchart .color1.comp .line{stroke:#9dd597}.xchart .color1.comp rect{fill:#9dd597}.xchart .color1.comp .fill{display:none}.xchart .color1.comp circle,.xchart .color1.comp .pointer{fill:#9dd597}.xchart .color2 .line{stroke:#f26522}.xchart .color2 .line .fill{pointer-events:none}.xchart .color2 rect,.xchart .color2 circle{fill:#f26522}.xchart .color2 .fill{fill:rgba(242,101,34,0.1)}.xchart .color2.comp .line{stroke:#f9b99a}.xchart .color2.comp rect{fill:#f9b99a}.xchart .color2.comp .fill{display:none}.xchart .color2.comp circle,.xchart .color2.comp .pointer{fill:#f9b99a}.xchart .color3 .line{stroke:#c6080d}.xchart .color3 .line .fill{pointer-events:none}.xchart .color3 rect,.xchart .color3 circle{fill:#c6080d}.xchart .color3 .fill{fill:rgba(198,8,13,0.1)}.xchart .color3.comp .line{stroke:#f8555a}.xchart .color3.comp rect{fill:#f8555a}.xchart .color3.comp .fill{display:none}.xchart .color3.comp circle,.xchart .color3.comp .pointer{fill:#f8555a}.xchart .color4 .line{stroke:#672d8b}.xchart .color4 .line .fill{pointer-events:none}.xchart .color4 rect,.xchart .color4 circle{fill:#672d8b}.xchart .color4 .fill{fill:rgba(103,45,139,0.1)}.xchart .color4.comp .line{stroke:#a869ce}.xchart .color4.comp rect{fill:#a869ce}.xchart .color4.comp .fill{display:none}.xchart .color4.comp circle,.xchart .color4.comp .pointer{fill:#a869ce}.xchart .color5 .line{stroke:#ce1797}.xchart .color5 .line .fill{pointer-events:none}.xchart .color5 rect,.xchart .color5 circle{fill:#ce1797}.xchart .color5 .fill{fill:rgba(206,23,151,0.1)}.xchart .color5.comp .line{stroke:#f075cb}.xchart .color5.comp rect{fill:#f075cb}.xchart .color5.comp .fill{display:none}.xchart .color5.comp circle,.xchart .color5.comp .pointer{fill:#f075cb}.xchart .color6 .line{stroke:#d9ce00}.xchart .color6 .line .fill{pointer-events:none}.xchart .color6 rect,.xchart .color6 circle{fill:#d9ce00}.xchart .color6 .fill{fill:rgba(217,206,0,0.1)}.xchart .color6.comp .line{stroke:#fff75a}.xchart .color6.comp rect{fill:#fff75a}.xchart .color6.comp .fill{display:none}.xchart .color6.comp circle,.xchart .color6.comp .pointer{fill:#fff75a}.xchart .color7 .line{stroke:#754c24}.xchart .color7 .line .fill{pointer-events:none}.xchart .color7 rect,.xchart .color7 circle{fill:#754c24}.xchart .color7 .fill{fill:rgba(117,76,36,0.1)}.xchart .color7.comp .line{stroke:#c98c50}.xchart .color7.comp rect{fill:#c98c50}.xchart .color7.comp .fill{display:none}.xchart .color7.comp circle,.xchart .color7.comp .pointer{fill:#c98c50}.xchart .color8 .line{stroke:#2eb9b4}.xchart .color8 .line .fill{pointer-events:none}.xchart .color8 rect,.xchart .color8 circle{fill:#2eb9b4}.xchart .color8 .fill{fill:rgba(46,185,180,0.1)}.xchart .color8.comp .line{stroke:#86e1de}.xchart .color8.comp rect{fill:#86e1de}.xchart .color8.comp .fill{display:none}.xchart .color8.comp circle,.xchart .color8.comp .pointer{fill:#86e1de}.xchart .color9 .line{stroke:#0e2e42}.xchart .color9 .line .fill{pointer-events:none}.xchart .color9 rect,.xchart .color9 circle{fill:#0e2e42}.xchart .color9 .fill{fill:rgba(14,46,66,0.1)}.xchart .color9.comp .line{stroke:#2477ab}.xchart .color9.comp rect{fill:#2477ab}.xchart .color9.comp .fill{display:none}.xchart .color9.comp circle,.xchart .color9.comp .pointer{fill:#2477ab} \ No newline at end of file diff --git a/plugins/web_gui/static/plugins/xcharts/xcharts.min.js b/plugins/web_gui/static/plugins/xcharts/xcharts.min.js new file mode 100644 index 0000000..4788a98 --- /dev/null +++ b/plugins/web_gui/static/plugins/xcharts/xcharts.min.js @@ -0,0 +1,5 @@ +/*! +xCharts v0.3.0 Copyright (c) 2012, tenXer, Inc. All Rights Reserved. +@license MIT license. http://github.com/tenXer/xcharts for details +*/ +(function(){var xChart,_vis={},_scales={},_visutils={};(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,v=e.reduce,h=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION="1.4.3";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O="Reduce of empty array with no initial value";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduce===v)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduceRight===h)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?-1!=n.indexOf(t):E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2);return w.map(n,function(n){return(w.isFunction(t)?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t){return w.isEmpty(t)?[]:w.filter(n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var F=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=F(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||void 0===r)return 1;if(e>r||void 0===e)return-1}return n.indexi;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,"length")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,""+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i};var I=function(){};w.bind=function(n,t){var r,e;if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));if(!w.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));I.prototype=n.prototype;var u=new I;I.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},w.bindAll=function(n){var t=o.call(arguments,1);return 0==t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==t+"";case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if("[object Array]"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=S(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&S(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return S(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return"[object Array]"==l.call(n)},w.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){w["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,"callee"))}),w.isFunction=function(n){return"function"==typeof n},w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return void 0===n},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+(0|Math.random()*(t-n+1))};var T={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};T.unescape=w.invert(T.escape);var M={escape:RegExp("["+w.keys(T.escape).join("")+"]","g"),unescape:RegExp("("+w.keys(T.unescape).join("|")+")","g")};w.each(["escape","unescape"],function(n){w[n]=function(t){return null==t?"":(""+t).replace(M[n],function(t){return T[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=""+ ++N;return n?n+t:t},w.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;w.template=function(n,t,r){r=w.defaults({},r,w.templateSettings);var e=RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(D,function(n){return"\\"+B[n]}),r&&(i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(i+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),a&&(i+="';\n"+a+"\n__p+='"),u=o+t.length,t}),i+="';\n",r.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var a=Function(r.variable||"obj","_",i)}catch(o){throw o.source=i,o}if(t)return a(t,w);var c=function(n){return a.call(this,n,w)};return c.source="function("+(r.variable||"obj")+"){\n"+i+"}",c},w.chain=function(n){return w(n).chain()};var z=function(n){return this._chain?w(n).chain():n};w.mixin(w),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];w.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this);function getInsertionPoint(zIndex){return _.chain(_.range(zIndex,10)).reverse().map(function(z){return'g[data-index="'+z+'"]'}).value().join(", ")}function colorClass(el,i){var c=el.getAttribute("class");return(c!==null?c.replace(/color\d+/g,""):"")+" color"+i}_visutils={getInsertionPoint:getInsertionPoint,colorClass:colorClass};var local=this,defaultSpacing=.25;function _getDomain(data,axis){return _.chain(data).pluck("data").flatten().pluck(axis).uniq().filter(function(d){return d!==undefined&&d!==null}).value().sort(d3.ascending)}_scales.ordinal=function(data,axis,bounds,extents){var domain=_getDomain(data,axis);return d3.scale.ordinal().domain(domain).rangeRoundBands(bounds,defaultSpacing)};_scales.linear=function(data,axis,bounds,extents){return d3.scale.linear().domain(extents).nice().rangeRound(bounds)};_scales.exponential=function(data,axis,bounds,extents){return d3.scale.pow().exponent(.65).domain(extents).nice().rangeRound(bounds)};_scales.time=function(data,axis,bounds,extents){return d3.time.scale().domain(_.map(extents,function(d){return new Date(d)})).range(bounds)};function _extendDomain(domain,axis){var min=domain[0],max=domain[1],diff,e;if(min===max){e=Math.max(Math.round(min/10),4);min-=e;max+=e}diff=max-min;min=min?min-diff/10:min;min=domain[0]>0?Math.max(min,0):min;max=max?max+diff/10:max;max=domain[1]<0?Math.min(max,0):max;return[min,max]}function _getExtents(options,data,xType,yType){var extents,nData=_.chain(data).pluck("data").flatten().value();extents={x:d3.extent(nData,function(d){return d.x}),y:d3.extent(nData,function(d){return d.y})};_.each([xType,yType],function(type,i){var axis=i?"y":"x",extended;extents[axis]=d3.extent(nData,function(d){return d[axis]});if(type==="ordinal"){return}_.each([axis+"Min",axis+"Max"],function(minMax,i){if(type!=="time"){extended=_extendDomain(extents[axis])}if(options.hasOwnProperty(minMax)&&options[minMax]!==null){extents[axis][i]=options[minMax]}else if(type!=="time"){extents[axis][i]=extended[i]}})});return extents}_scales.xy=function(self,data,xType,yType){var o=self._options,extents=_getExtents(o,data,xType,yType),scales={},horiz=[o.axisPaddingLeft,self._width],vert=[self._height,o.axisPaddingTop],xScale,yScale;_.each([xType,yType],function(type,i){var axis=i===0?"x":"y",bounds=i===0?horiz:vert,fn=xChart.getScale(type);scales[axis]=fn(data,axis,bounds,extents[axis])});return scales};(function(){var zIndex=2,selector="g.bar",insertBefore=_visutils.getInsertionPoint(zIndex);function postUpdateScale(self,scaleData,mainData,compData){self.xScale2=d3.scale.ordinal().domain(d3.range(0,mainData.length)).rangeRoundBands([0,self.xScale.rangeBand()],.08)}function enter(self,storage,className,data,callbacks){var barGroups,bars,yZero=self.yZero;barGroups=self._g.selectAll(selector+className).data(data,function(d){return d.className});barGroups.enter().insert("g",insertBefore).attr("data-index",zIndex).style("opacity",0).attr("class",function(d,i){var cl=_.uniq((className+d.className).split(".")).join(" ");return cl+" bar "+_visutils.colorClass(this,i)}).attr("transform",function(d,i){return"translate("+self.xScale2(i)+",0)"});bars=barGroups.selectAll("rect").data(function(d){return d.data},function(d){return d.x});bars.enter().append("rect").attr("width",0).attr("rx",3).attr("ry",3).attr("x",function(d){return self.xScale(d.x)+self.xScale2.rangeBand()/2}).attr("height",function(d){return Math.abs(yZero-self.yScale(d.y))}).attr("y",function(d){return d.y<0?yZero:self.yScale(d.y)}).on("mouseover",callbacks.mouseover).on("mouseout",callbacks.mouseout).on("click",callbacks.click);storage.barGroups=barGroups;storage.bars=bars}function update(self,storage,timing){var yZero=self.yZero;storage.barGroups.attr("class",function(d,i){return _visutils.colorClass(this,i)}).transition().duration(timing).style("opacity",1).attr("transform",function(d,i){return"translate("+self.xScale2(i)+",0)"});storage.bars.transition().duration(timing).attr("width",self.xScale2.rangeBand()).attr("x",function(d){return self.xScale(d.x)}).attr("height",function(d){return Math.abs(yZero-self.yScale(d.y))}).attr("y",function(d){return d.y<0?yZero:self.yScale(d.y)})}function exit(self,storage,timing){storage.bars.exit().transition().duration(timing).attr("width",0).remove();storage.barGroups.exit().transition().duration(timing).style("opacity",0).remove()}function destroy(self,storage,timing){var band=self.xScale2?self.xScale2.rangeBand()/2:0;delete self.xScale2;storage.bars.transition().duration(timing).attr("width",0).attr("x",function(d){return self.xScale(d.x)+band})}_vis.bar={postUpdateScale:postUpdateScale,enter:enter,update:update,exit:exit,destroy:destroy}})();(function(){var zIndex=3,selector="g.line",insertBefore=_visutils.getInsertionPoint(zIndex);function enter(self,storage,className,data,callbacks){var inter=self._options.interpolation,x=function(d,i){if(!self.xScale2&&!self.xScale.rangeBand){return self.xScale(d.x)}return self.xScale(d.x)+self.xScale.rangeBand()/2},y=function(d){return self.yScale(d.y)},line=d3.svg.line().x(x).interpolate(inter),area=d3.svg.area().x(x).y1(self.yZero).interpolate(inter),container,fills,paths;function datum(d){return[d.data]}container=self._g.selectAll(selector+className).data(data,function(d){return d.className});container.enter().insert("g",insertBefore).attr("data-index",zIndex).attr("class",function(d,i){var cl=_.uniq((className+d.className).split(".")).join(" ");return cl+" line "+_visutils.colorClass(this,i)});fills=container.selectAll("path.fill").data(datum);fills.enter().append("path").attr("class","fill").style("opacity",0).attr("d",area.y0(y));paths=container.selectAll("path.line").data(datum);paths.enter().append("path").attr("class","line").style("opacity",0).attr("d",line.y(y));storage.lineContainers=container;storage.lineFills=fills;storage.linePaths=paths;storage.lineX=x;storage.lineY=y;storage.lineA=area;storage.line=line}function update(self,storage,timing){storage.lineContainers.attr("class",function(d,i){return _visutils.colorClass(this,i)});storage.lineFills.transition().duration(timing).style("opacity",1).attr("d",storage.lineA.y0(storage.lineY));storage.linePaths.transition().duration(timing).style("opacity",1).attr("d",storage.line.y(storage.lineY))}function exit(self,storage){storage.linePaths.exit().style("opacity",0).remove();storage.lineFills.exit().style("opacity",0).remove();storage.lineContainers.exit().remove()}function destroy(self,storage,timing){storage.linePaths.transition().duration(timing).style("opacity",0);storage.lineFills.transition().duration(timing).style("opacity",0)}_vis.line={enter:enter,update:update,exit:exit,destroy:destroy}})();(function(){var line=_vis.line;function enter(self,storage,className,data,callbacks){var circles;line.enter(self,storage,className,data,callbacks);circles=storage.lineContainers.selectAll("circle").data(function(d){return d.data},function(d){return d.x});circles.enter().append("circle").style("opacity",0).attr("cx",storage.lineX).attr("cy",storage.lineY).attr("r",5).on("mouseover",callbacks.mouseover).on("mouseout",callbacks.mouseout).on("click",callbacks.click);storage.lineCircles=circles}function update(self,storage,timing){line.update.apply(null,_.toArray(arguments));storage.lineCircles.transition().duration(timing).style("opacity",1).attr("cx",storage.lineX).attr("cy",storage.lineY)}function exit(self,storage){storage.lineCircles.exit().remove();line.exit.apply(null,_.toArray(arguments))}function destroy(self,storage,timing){line.destroy.apply(null,_.toArray(arguments));if(!storage.lineCircles){return}storage.lineCircles.transition().duration(timing).style("opacity",0)}_vis["line-dotted"]={enter:enter,update:update,exit:exit,destroy:destroy}})();(function(){var line=_vis["line-dotted"];function enter(self,storage,className,data,callbacks){line.enter(self,storage,className,data,callbacks)}function _accumulate_data(data){function reduce(memo,num){return memo+num.y}var nData=_.map(data,function(set){var i=set.data.length,d=_.clone(set.data);set=_.clone(set);while(i){i-=1;d[i]=_.clone(set.data[i]);d[i].y0=set.data[i].y;d[i].y=_.reduce(_.first(set.data,i),reduce,set.data[i].y)}return _.extend(set,{data:d})});return nData}function _resetData(self){if(!self.hasOwnProperty("cumulativeOMainData")){return}self._mainData=self.cumulativeOMainData;delete self.cumulativeOMainData;self._compData=self.cumulativeOCompData;delete self.cumulativeOCompData}function preUpdateScale(self,data){_resetData(self);self.cumulativeOMainData=self._mainData;self._mainData=_accumulate_data(self._mainData);self.cumulativeOCompData=self._compData;self._compData=_accumulate_data(self._compData)}function destroy(self,storage,timing){_resetData(self);line.destroy.apply(null,_.toArray(arguments))}_vis.cumulative={preUpdateScale:preUpdateScale,enter:enter,update:line.update,exit:line.exit,destroy:destroy}})();var emptyData=[[]],defaults={mouseover:function(data,i){},mouseout:function(data,i){},click:function(data,i){},axisPaddingTop:0,axisPaddingRight:0,axisPaddingBottom:5,axisPaddingLeft:20,paddingTop:0,paddingRight:0,paddingBottom:20,paddingLeft:60,tickHintX:10,tickFormatX:function(x){return x},tickHintY:10,tickFormatY:function(y){return y},xMin:null,xMax:null,yMin:null,yMax:null,dataFormatX:function(x){return x},dataFormatY:function(y){return y},unsupported:function(selector){d3.select(selector).text("SVG is not supported on your browser")},empty:function(self,selector,d){},notempty:function(self,selector){},timing:750,interpolation:"monotone",sortX:function(a,b){return!a.x&&!b.x?0:a.xself._width/80){labels.sort(function(a,b){var r=/translate\(([^,)]+)/;a=a.getAttribute("transform").match(r);b=b.getAttribute("transform").match(r);return parseFloat(a[1],10)-parseFloat(b[1],10)});d3.selectAll(labels).filter(function(d,i){return i%(Math.ceil(labels.length/xTicks)+1)}).remove()}yRules=d3.svg.axis().scale(self.yScale).ticks(yTicks).tickSize(-self._width-o.axisPaddingRight-o.axisPaddingLeft).tickFormat(o.tickFormatY).orient("left");yAxis=self._gScale.selectAll("g.axisY").data(emptyData);yAxis.enter().append("g").attr("class","axis axisY").attr("transform","translate(0,0)");t.selectAll("g.axisY").call(yRules);zLine=self._gScale.selectAll("g.axisZero").data([[]]);zLine.enter().append("g").attr("class","axisZero");zLinePath=zLine.selectAll("line").data([[]]);zLinePath.enter().append("line").attr("x1",0).attr("x2",self._width+o.axisPaddingLeft+o.axisPaddingRight).attr("y1",self.yZero).attr("y2",self.yZero);zLinePath.transition().duration(o.timing).attr("y1",self.yZero).attr("y2",self.yZero)},_updateScale:function(){var self=this,_unionData=function(){return _.union(self._mainData,self._compData)},scaleData=_unionData(),vis=self._vis,scale,min;delete self.xScale;delete self.yScale;delete self.yZero;if(vis.hasOwnProperty("preUpdateScale")){vis.preUpdateScale(self,scaleData,self._mainData,self._compData)}scaleData=_unionData();scale=_scales.xy(self,scaleData,self._xScaleType,self._yScaleType);self.xScale=scale.x;self.yScale=scale.y;min=self.yScale.domain()[0];self.yZero=min>0?self.yScale(min):self.yScale(0);if(vis.hasOwnProperty("postUpdateScale")){vis.postUpdateScale(self,scaleData,self._mainData,self._compData)}},_enter:function(vis,storage,data,className){var self=this,callbacks={click:self._options.click,mouseover:self._options.mouseover,mouseout:self._options.mouseout};self._checkVisMethod(vis,"enter");vis.enter(self,storage,className,data,callbacks)},_update:function(vis,storage){var self=this;self._checkVisMethod(vis,"update");vis.update(self,storage,self._options.timing)},_exit:function(vis,storage){var self=this;self._checkVisMethod(vis,"exit");vis.exit(self,storage,self._options.timing)},_destroy:function(vis,storage){var self=this;self._checkVisMethod(vis,"destroy");try{vis.destroy(self,storage,self._options.timing)}catch(e){}},_draw:function(){var self=this,o=self._options,comp,compKeys;self._noData=_.flatten(_.pluck(self._mainData,"data").concat(_.pluck(self._compData,"data"))).length===0;self._updateScale();self._drawAxes();self._enter(self._vis,self._mainStorage,self._mainData,".main");self._exit(self._vis,self._mainStorage);self._update(self._vis,self._mainStorage);comp=_.chain(self._compData).groupBy(function(d){return d.type});compKeys=comp.keys();_.each(self._compStorage,function(d,key){if(-1===compKeys.indexOf(key).value()){var vis=_vis[key];self._enter(vis,d,[],".comp."+key.replace(/\W+/g,""));self._exit(vis,d)}});comp.each(function(d,key){var vis=_vis[key],storage;if(!self._compStorage.hasOwnProperty(key)){self._compStorage[key]={}}storage=self._compStorage[key];self._enter(vis,storage,d,".comp."+key.replace(/\W+/g,""));self._exit(vis,storage);self._update(vis,storage)});if(self._noData){o.empty(self,self._selector,self._mainData)}else{o.notempty(self,self._selector)}},_checkVisMethod:function(vis,method){var self=this;if(!vis[method]){throw'Required method "'+method+'" not found on vis type "'+self._type+'".'}}});if(typeof define==="function"&&define.amd&&typeof define.amd==="object"){define(function(){return xChart});return}window.xChart=xChart})(); \ No newline at end of file diff --git a/plugins/web_gui/static/restart.html b/plugins/web_gui/static/restart.html new file mode 100644 index 0000000..7e79a88 --- /dev/null +++ b/plugins/web_gui/static/restart.html @@ -0,0 +1,37 @@ + + + + + StarryPy WebGUI + + + + + + + + + + + + +
+
+
+
+
+ {% if handler.error_message == "" %} +

Server has been restarted!

+ {% else %} +

{{ handler.error_message }}

+ {% end %} +
+
+
+
+
+ + \ No newline at end of file diff --git a/plugins/web_gui/web_gui.py b/plugins/web_gui/web_gui.py new file mode 100644 index 0000000..efbbd11 --- /dev/null +++ b/plugins/web_gui/web_gui.py @@ -0,0 +1,320 @@ +#:coding=utf-8: +import os +import logging +import json +import tornado.web +import tornado.websocket +import subprocess +from datetime import datetime +from twisted.internet import reactor +from plugins.core.player_manager import PlayerManager, UserLevels +from plugins.core.player_manager.manager import Player +from tornado.ioloop import PeriodicCallback +from base_plugin import BasePlugin + + +class BaseHandler(tornado.web.RequestHandler): + + def get_current_user(self): + return self.get_secure_cookie("player") + + +class LoginHandler(BaseHandler): + + def initialize(self): + self.failed_login = False + + def get(self): + self.render("login.html") + + def post(self): + self.login_user = self.player_manager.get_by_name(self.get_argument("name")) + + if self.login_user is None or self.get_argument("password") != self.ownerpassword: + self.failed_login = True + self.render("login.html") + else: + self.set_secure_cookie("player", self.get_argument("name")) + self.factory.broadcast("An admin has joined the server through Web-GUI.", 0, "", self.get_argument("name")) + self.failed_login = False + self.redirect(self.get_argument("next", "/")) + + +class RestartHandler(BaseHandler): + + def initialize(self): + self.web_gui_user = self.player_manager.get_by_name(self.get_current_user()) + + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + if self.web_gui_user.access_level == self.levels["OWNER"]: + self.error_message = "" + self.render("restart.html") + subprocess.call(self.restart_script, shell=True) + else: + self.error_message = "Only owners can restart the server!" + self.render("restart.html") + + +class LogoutHandler(BaseHandler): + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + self.clear_cookie("player") + self.redirect("/login") + + +class IndexHandler(BaseHandler): + + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + self.render("index.html") + + +class DashboardHandler(BaseHandler): + + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + self.render("ajax/dashboard.html") + + +class PlayerListHandler(BaseHandler): + + def initialize(self): + self.playerlist = self.player_manager.all() + + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + self.render("ajax/playerlist.html") + + +class PlayerOnlineSideBarHandler(BaseHandler): + + def initialize(self): + self.playerlistonline = self.player_manager.who() + + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + self.render("ajax/playersonline.html") + + +class PlayerOnlineListHandler(BaseHandler): + + def initialize(self): + self.playerlistonline = self.player_manager.who() + + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + self.render("ajax/playerlistonline.html") + + +class PlayerEditHandler(BaseHandler): + + def initialize(self): + self.web_gui_user = self.player_manager.get_by_name(self.get_current_user()) + self.edit_player = self.player_manager.get_by_name(self.get_argument("playername")) + + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + try: + self.error_message = self.get_argument("error_message") + except tornado.web.MissingArgumentError: + self.error_message = "" + self.render("ajax/playeredit.html") + + @tornado.web.authenticated + @tornado.web.asynchronous + def post(self): + if self.web_gui_user.access_level > self.edit_player.access_level: + self.edit_player.access_level = self.get_argument("access_level") + self.error_message = "" + else: + error_message = "You are not allowed to change this users' data!" + self.redirect("ajax/playeredit.html?playername={n}&error_message={e}".format( + n=self.get_argument("playername"), e=error_message)) + self.render("ajax/playeredit.html") + + +class PlayerQuickMenuHandler(BaseHandler): + + def initialize(self): + self.edit_player = self.player_manager.get_by_name(self.get_argument("playername")) + + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + self.render("ajax/playerquickmenu.html") + + +class PlayerActionHandler(BaseHandler): + + def initialize(self): + self.web_gui_user = self.player_manager.get_by_name(self.get_current_user()) + self.edit_player = self.player_manager.get_by_name(self.get_argument("info")) + + @tornado.web.authenticated + @tornado.web.asynchronous + def post(self): + if self.get_argument("action") == "delete": + if self.web_gui_user.access_level == self.levels["OWNER"]: + if self.edit_player is not None: + self.player_manager.delete(self.edit_player) + response = json.dumps({"status": "OK", "msg": "Player was deleted"}) + else: + response = json.dumps({"status": "ERROR", "msg": "Player not found!"}) + else: + response = json.dumps({"status": "ERROR", "msg": "You don't have permission to do this."}) + elif self.get_argument("action") == "ban": + if self.web_gui_user.access_level >= self.levels["ADMIN"]: + self.player_manager.ban(self.edit_player.ip) + if self.edit_player.logged_in: + protocol = self.factory.protocols[self.edit_player.protocol] + protocol.transport.loseConnection() + response = json.dumps({"status": "OK", "msg": "IP was banned"}) + else: + response = json.dumps({"status": "ERROR", "msg": "You don't have permission to do this."}) + elif self.get_argument("action") == "unban": + if self.web_gui_user.access_level >= self.levels["ADMIN"]: + self.player_manager.unban(self.edit_player.ip) + response = json.dumps({"status": "OK", "msg": "IP was unbanned"}) + else: + response = json.dumps({"status": "ERROR", "msg": "You don't have permission to do this."}) + elif self.get_argument("action") == "kick": + if self.web_gui_user.access_level >= self.levels["ADMIN"]: + if self.edit_player.logged_in: + protocol = self.factory.protocols[self.edit_player.protocol] + protocol.transport.loseConnection() + response = json.dumps({"status": "OK", "msg": "Player was kicked."}) + else: + response = json.dumps({"status": "ERROR", "msg": "Player not online."}) + else: + response = json.dumps({"status": "ERROR", "msg": "You don't have permission to do this."}) + else: + response = json.dumps({"status": "ERROR", "msg": "Invalid action."}) + self.finish(response) + + +class AdminStopHandler(BaseHandler): + + def initialize(self): + self.web_gui_user = self.player_manager.get_by_name(self.get_current_user()) + + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + if self.web_gui_user.access_level == self.levels["OWNER"]: + self.error_message = "" + self.render("adminstop.html") + reactor.stop() + else: + self.error_message = "Only owners can stop the server!" + self.render("adminstop.html") + + +class WebSocketChatHandler(tornado.websocket.WebSocketHandler): + + def initialize(self): + self.clients = [] + self.callback = PeriodicCallback(self.update_chat, 500) + self.web_gui_user = self.player_manager.get_by_name(self.get_secure_cookie("player")) + + def open(self, *args): + self.clients.append(self) + for msg in self.messages_log: + self.write_message(msg) + self.callback.start() + + def on_message(self, message): + messagejson = json.loads(message) + + self.messages.append(message) + self.messages_log.append(message) + self.factory.broadcast("^yellow;<{d}> <^red;{u}^yellow;> {m}".format( + d=datetime.now().strftime("%H:%M"), u=self.web_gui_user.name, m=messagejson["message"]), 0, "") + + def update_chat(self): + if len(self.messages) > 0: + for message in sorted(self.messages): + for client in self.clients: + client.write_message(message) + del self.messages[0:len(self.messages)] + + def on_close(self): + self.clients.remove(self) + self.callback.stop() + + +class WebChatJsHandler(BaseHandler): + + @tornado.web.authenticated + @tornado.web.asynchronous + def get(self): + self.render("js/webgui.chat.js") + + +class WebGuiApp(tornado.web.Application): + def __init__(self, port, ownerpassword, playermanager, factory, cookie_secret, serverurl, messages, messages_log, + restart_script): + logging.getLogger('tornado.general').addHandler(logging.FileHandler(self.config["log_path"])) + logging.getLogger('tornado.application').addHandler(logging.FileHandler(self.config["log_path"])) + logging.getLogger('tornado.access').addHandler(logging.FileHandler(self.config["log_path_access"])) + + BaseHandler.factory = factory + BaseHandler.player_manager = playermanager + BaseHandler.messages = messages + BaseHandler.messages_log = messages_log + BaseHandler.restart_script = restart_script + BaseHandler.ownerpassword = ownerpassword + BaseHandler.levels = UserLevels.ranks + WebChatJsHandler.wsport = port + WebChatJsHandler.serverurl = serverurl + WebSocketChatHandler.factory = factory + WebSocketChatHandler.player_manager = playermanager + WebSocketChatHandler.messages = messages + WebSocketChatHandler.messages_log = messages_log + + handlers = [ + (r"/login", LoginHandler), + (r"/logout", LogoutHandler), + (r"/restart", RestartHandler), + (r'/chat', WebSocketChatHandler), + (r'/stopserver', AdminStopHandler), + (r'/ajax/playerlistonline.html', PlayerOnlineListHandler), + (r'/ajax/playerlist.html', PlayerListHandler), + (r'/ajax/playeredit.html', PlayerEditHandler), + (r'/ajax/playerquickmenu.html', PlayerQuickMenuHandler), + (r'/ajax/playersonline.html', PlayerOnlineSideBarHandler), + (r'/ajax/dashboard.html', DashboardHandler), + (r'/ajax/playeraction', PlayerActionHandler), + (r'/js/webgui.chat.js', WebChatJsHandler), + (r'/index.html', IndexHandler), + (r'/', IndexHandler), + (r'/ajax/(.*)', tornado.web.StaticFileHandler, + {'path': os.path.join(os.path.dirname(__file__), 'static/ajax')}), + (r'/css/(.*)', tornado.web.StaticFileHandler, + {'path': os.path.join(os.path.dirname(__file__), 'static/css')}), + (r'/js/(.*)', tornado.web.StaticFileHandler, + {'path': os.path.join(os.path.dirname(__file__), 'static/js')}), + (r'/plugins/(.*)', tornado.web.StaticFileHandler, + {'path': os.path.join(os.path.dirname(__file__), 'static/plugins')}), + (r'/img/(.*)', tornado.web.StaticFileHandler, + {'path': os.path.join(os.path.dirname(__file__), 'static/img')}), + (r'/images/(.*)', tornado.web.StaticFileHandler, + {'path': os.path.join(os.path.dirname(__file__), 'static/images')}) + ] + settings = dict( + template_path=os.path.join(os.path.dirname(__file__), "static"), + login_url="/login", + cookie_secret=cookie_secret, + xsrf_cookies=True, + debug=True + ) + tornado.web.Application.__init__(self, handlers, **settings) + self.listen(port) \ No newline at end of file diff --git a/plugins/web_gui/web_gui_plugin.py b/plugins/web_gui/web_gui_plugin.py new file mode 100644 index 0000000..098d8d3 --- /dev/null +++ b/plugins/web_gui/web_gui_plugin.py @@ -0,0 +1,90 @@ +#:coding=utf-8: +import os +import string +import random +import json +from datetime import datetime +from base_plugin import BasePlugin +from plugins.core.player_manager import PlayerManager +from packets import chat_sent, client_connect +from . import web_gui +import tornado.ioloop +from tornado.platform.twisted import TwistedIOLoop +TwistedIOLoop().install() + + +class WebGuiPlugin(BasePlugin, PlayerManager): + name = "web_gui" + depends = ['player_manager'] + + def __init__(self): + super(WebGuiPlugin, self).__init__() + try: + self.port = int(self.config.plugin_config['port']) + except (AttributeError, ValueError): + self.port = 8083 + self.ownerpassword = self.config.plugin_config['ownerpassword'] + self.restart_script = self.config.plugin_config['restart_script'] + if self.config.plugin_config['cookie_token'] == "" or not self.config.plugin_config['remember_cookie_token']: + self.cookie_token = self.config.plugin_config['cookie_token'] = self.generate_cookie_token() + else: + self.cookie_token = self.config.plugin_config['cookie_token'] + self.serverurl = self.config.plugin_config['serverurl'] + self.messages = [] + self.messages_log = [] + + def activate(self): + super(WebGuiPlugin, self).activate() + self.player_manager = self.plugins['player_manager'].player_manager + web_gui.WebGuiApp.config = self.config.plugin_config + self.web_gui_app = web_gui.WebGuiApp(port=self.port, ownerpassword=self.ownerpassword, + playermanager=self.player_manager, factory=self.factory, + cookie_secret=self.cookie_token, serverurl=self.serverurl, + messages=self.messages, messages_log=self.messages_log, + restart_script=self.restart_script) + self.logger.info("WebGUI listening on port {p}".format(p=self.port)) + self.gui_instance = tornado.ioloop.IOLoop.instance() + + def deactivate(self): + super(WebGuiPlugin, self).deactivate() + self.gui_instance.stop() + + def generate_cookie_token(self): + chars = string.ascii_letters + string.digits + random.seed(os.urandom(1024)) + return "".join(random.choice(chars) for i in range(64)) + + def on_chat_sent(self, data): + parsed = chat_sent().parse(data.data) + msgdate = datetime.now().strftime("[%H:%M:%S]") + message = json.dumps({"msgdate": msgdate, "author": self.protocol.player.name, + "message": parsed.message.decode("utf-8")}) + self.messages.append(message) + self.messages_log.append(message) + + return True + + def on_client_connect(self, data): + parsed = client_connect().parse(data.data) + msgdate = datetime.now().strftime("[%H:%M:%S]") + connect_player = self.player_manager.get_by_name(parsed.name.decode("utf-8")) + try: + if self.player_manager.check_bans(connect_player.ip): + msgtxt = "Banned Player {p} tried to join the server.".format(p=connect_player.name) + else: + msgtxt = "Player {p} has joined the server.".format(p=connect_player.name) + except AttributeError: + msgtxt = "New player {p} has joined the server.".format(p=connect_player.name) + message = json.dumps({"msgdate": msgdate, "author": "SERVER", "message": msgtxt}) + self.messages.append(message) + self.messages_log.append(message) + + return True + + def on_client_disconnect(self, data): + if self.protocol.player is not None: + msgdate = datetime.now().strftime("[%H:%M:%S]") + msgtxt = "Player {p} has left the server.".format(p=self.protocol.player.name.encode("utf-8")) + message = json.dumps({"msgdate": msgdate, "author": "SERVER", "message": msgtxt}) + self.messages.append(message) + self.messages_log.append(message)