dark mode and websockets
[kismet-logviewer.git] / logviewer / templates / index.html
1 <html>
2 <head>
3 <title>Kismet</title>
4
5 <meta http-equiv="X-UA-Compatible" content="IE=edge">
6 <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
8 <script src="js/jquery-3.1.0.min.js"></script>
9 <script src="js/js.storage.min.js"></script>
10 <script src="js/chart.umd.js"></script>
11
12 <script src="js/kismet.ui.theme.js"></script>
13
14 <script src="js/jquery-ui.min.js"></script>
15 <script src="js/jquery.ui.touch-punch.min.js"></script>
16 <script src="js/jquery.ajax.binary.js"></script>
17 <script src="js/jquery.jspanel-compiled.min.js"></script>
18 <script src="js/simple-expand.min.js"></script>
19 <script src="js/jqueryui-editable.min.js"></script>
20
21 <script src="js/datatables.min.js"></script>
22 <script src="js/dataTables.scrollResize.min.js"></script>
23 <script src="js/dataTables.pageResize.js"></script>
24
25 <script src="js/jquery.sparkline.min.js"></script>
26
27 <script src="js/raphael.min.js"></script>
28 <script src="js/morris.min.js"></script>
29
30 <script src="js/jquery.layout-latest.js"></script>
31
32 <script src="js/pushmenu.js"></script>
33
34 <script src="js/tooltipster.bundle.min.js"></script>
35
36 <script src="js/clipboard.min.js"></script>
37
38 <script src="js/kismet.utils.js"></script>
39
40 <!-- Core UI elements that get loaded first -->
41
42 <script src="js/kismet.ui.sidebar.js"></script>
43 <script src="js/kismet.ui.tabpane.js"></script>
44 <script src="js/kismet.ui.settings.js"></script>
45
46 <script src="js/kismet.ui.js"></script>
47
48 <script src="js/kismet.ui.base.js"></script>
49 <script src="js/kismet.ui.gadgets.js"></script>
50
51 <script src="js/jquery.kismet.devicedata.js"></script>
52 <script src="js/jquery.kismet.messagebus.js"></script>
53 <script src="js/jquery.kismet.channeldisplay.js"></script>
54 <script src="js/kismet.ui.alerts.js"></script>
55
56 <script src="js/kismet.ui.iconbar.js"></script>
57 <script src="js/jquery.kismet.battery.js"></script>
58 <script src="js/jquery.kismet.alert.js"></script>
59 <script src="js/jquery.kismet.gps.js"></script>
60 <script src="js/jquery.kismet.packetrate.js"></script>
61
62 <link rel="stylesheet" type="text/css" href="css/font-awesome.min.css">
63
64 <link rel="stylesheet" type="text/css" href="css/jquery.jspanel.min.css" />
65 <link rel="stylesheet" type="text/css" href="css/morris.css" />
66
67 <link rel="stylesheet" type="text/css" href="css/layout-default-1.4.0.css" />
68
69 <link rel="stylesheet" type="text/css" href="css/pushmenu.css" />
70
71 <link rel="stylesheet" type="text/css" href="css/tooltipster.bundle.min.css" />
72
73 <link rel="stylesheet" type="text/css" href="css/jqueryui-editable.css" />
74
75 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.messagebus.css" />
76 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.channeldisplay.css" />
77 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.alert.css" />
78 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.battery.css" />
79 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.auth.css" />
80 <link rel="stylesheet" type="text/css" href="css/jquery.kismet.gps.css" />
81
82 <link rel="stylesheet" type="text/css" href="css/reset.css" />
83 <link rel="stylesheet" type="text/css" href="css/text.css" />
84 <link rel="stylesheet" type="text/css" href="css/layout.css" />
85
86
87 <style type="text/css">
88 /* Fix the hover-highlight of the device table */
89 td.highlight {
90     background-color: #dddddd !important;
91 }
92
93 /* Accordion scroll */
94 div.autosize {
95     min-height: 10px;
96     overflow: scroll;
97 }
98
99 </style>
100
101 <script src="dynamic.js"></script>
102
103 <script>
104 var KISMET_PROXY_PREFIX = "";
105
106 const queryString = window.location.search;
107 const urlParams = new URLSearchParams(queryString);
108
109 window['censor_macs'] = urlParams.get('censor_macs')
110 window['censor_location'] = urlParams.get('censor_location')
111
112 if (urlParams.get('censor')) {
113     window['censor_macs'] = 1
114     window['censor_location'] = 1
115 }
116
117 var orig_title = "";
118
119 // Visibility detection from https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
120 // Set the name of the hidden property and the change event for visibility
121 var hidden, visibilityChange; 
122 if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support 
123       hidden = "hidden";
124       visibilityChange = "visibilitychange";
125 } else if (typeof document.msHidden !== "undefined") {
126       hidden = "msHidden";
127       visibilityChange = "msvisibilitychange";
128 } else if (typeof document.webkitHidden !== "undefined") {
129       hidden = "webkitHidden";
130       visibilityChange = "webkitvisibilitychange";
131 }
132
133 function handleVisibilityChange() {
134     if (document[hidden]) {
135         kismet_ui.window_visible = false;
136         orig_title = document.title;
137         document.title = orig_title + " (Paused)"
138     } else {
139         kismet_ui.window_visible = true;
140         document.title = orig_title;
141     }
142 }
143
144 // Warn if the browser doesn't support addEventListener or the Page Visibility API
145 if (typeof document.addEventListener === "undefined" || hidden === undefined) {
146     ; // Do nothing
147 } else {
148       // Handle page visibility change   
149       document.addEventListener(visibilityChange, handleVisibilityChange, false);
150 }
151
152 function load_main_ui() {
153     load_dynamics().then((res) => {
154     // Don't let DT make alerts
155     $.fn.dataTableExt.sErrMode = "console";
156
157     $('#pm_menu').pushmenu({ button : "#pm_open" });
158
159     // Compute 30% height of window
160     var southsize = $(window).height() * 0.30;
161
162     // Load the framework
163     var layout = $('#panelcontainer').layout({
164         paneClass: 'kismet-ui-layout-pane',
165         resizerClass: 'kismet-ui-layout-resizer',
166         resizeWithWindowDelay:  250,
167         north: {
168             closable: false,
169             resizeable: false,
170             slidable: false,
171             togglerLength_open: 0,
172             togglerLength_closed: -1,
173             fxName: "none",
174             spacing_open: 1,
175         },
176         center: {
177             onresize: function() {
178                 $('#centerpane-tabs').tabs("refresh");
179             },
180         },
181         south: {
182             // Default to computed percentage of total window
183             size: southsize,
184             onresize: function() {
185                 $('#southpane-tabs').tabs("refresh");
186             },
187         },
188     });
189
190
191     // Derive the proxy prefix, if any, from the headers.  We can't get this from our
192     // own current request, we have to do a HEAD req and nest everything inside that.
193     var jqxhr = $.ajax({
194         type: "HEAD",
195         url: Document.URL
196     })
197     .always(function() {
198         const pfx = jqxhr.getResponseHeader('X-Proxy-Dir');
199
200         if (pfx != null) {
201             KISMET_PROXY_PREFIX = pfx;
202         }
203
204         kismet_ui_base.OpenEventbusWs();
205     
206         kismet_ui_iconbar.AddIconbarItem({
207             id: 'gps',
208             priority: 110,
209             createCallback: function(div) {
210                 div.gps();
211             }
212         })
213     
214         kismet_ui_iconbar.AddIconbarItem({
215             id: 'alert',
216             priority: 125,
217             createCallback: function(div) {
218                 div.alert();
219             },
220         });
221
222         kismet_ui_iconbar.AddIconbarItem({
223             id: 'themepicker',
224             priority: 145,
225             createCallback: function(div) {
226                 div.thememode();
227             }
228         });
229     
230         kismet_ui_iconbar.AddIconbarItem({
231             id: 'battery',
232             priority: 150,
233             createCallback: function(div) {
234                 div.battery();
235             }
236         });
237     
238         kismet_ui_iconbar.AddIconbarItem({
239             id: 'packets',
240             priority: 0,
241             createCallback: function(div) {
242                 div.packetrate();
243             }
244         });
245     
246         kismet_ui_iconbar.makeIconbar($('#iconbar'));
247     
248         kismet_ui.HealthCheck();
249  
250         // Finalize the tabs
251         kismet_ui_tabpane.MakeTabPane($('#southpane-tabs'), 'south');
252         kismet_ui_tabpane.MakeTabPane($('#centerpane-tabs'), 'center');
253     
254         // Finalize the sidebar
255         kismet_ui_sidebar.MakeSidebar($('.k-sb-main'));
256    
257         // Try to scrape the server name
258         kismet_ui_base.FetchServerName(function(name) {
259             if (name.length > 0) {
260                 $('#topbar_title').html("Kismet - " + name);
261                 top.document.title = "Kismet - " + name;
262             }
263         
264         });
265     
266     }); // always head fetch
267
268     });
269 }
270
271 // jquery onload complete
272 $(function() {
273     // Set a global timeout
274     $.ajaxSetup({
275         timeout:5000,
276         xhrFields: {
277             withCredentials: true
278         }
279     });
280
281
282     kismet_ui_base.FirstLoginCheck(function() {
283         load_main_ui();
284     });
285
286 }); // onload
287 </script>
288
289 <style>
290 .resize_wrapper {
291     position: relative;
292     box-sizing: border-box;
293     height: calc(100% - 30px);
294     padding: 0.5em 0.5em 1.5em 0.5em;
295     border-radius: 0.5em;
296     xbackground-color: #f9f9f9;
297     overflow: hidden;
298 }
299 </style>
300
301 </head>
302 <body>
303     <div id="mainholder">
304         <div id="pm_menu" class="pm_hide pm_initial kismet_sidebar">
305             <div class="k-sb-header">
306                 <h1>Kismet</h1>
307                 <hr>
308             </div>
309             <div class="k-sb-main">
310             </div>
311         </div>
312
313         <div id="panelcontainer">
314
315             <div class="ui-layout-north">
316                 <div id="topbar">
317                     <i id="pm_open" class="fa fa-bars k-sb-hamburger"></i>
318                     <div id="topbar_title">Kismet</div>
319                     <div class="topright_holder" id="iconbar"></div>
320                 </div>
321             </div>
322
323             <!--
324                 <div class="ui-layout-east">East</div>
325
326                 <div class="ui-layout-west">West</div>
327             -->
328
329             <div class="ui-layout-center" id="main_center">
330                 <div id="centerpane-tabs" class="tabs-min"></div>
331                 <!--
332                 <div id="resize_wrapper">
333                     <table id="devices" class="stripe hover nowrap" cell-spacing="0" width="100%"></table>
334                 </div>
335                 -->
336                 <!-- Must be named foo_status 
337                 <div id="devices_status" style="padding-bottom: 10px;"></div>
338                 -->
339             </div>
340
341             <div class="ui-layout-south">
342                 <div id="southpane-tabs" class="tabs-min"></div>
343             </div>
344
345         </div>
346
347         <div id="creditbar">
348             <p>Powered by many OSS components, see the <a href="credit.html" target="_new">credits page</a>
349         </div>
350     </div>
351
352 </body>
353 </html>