Make sure invokeOperation is set once
[controller.git] / opendaylight / adsal / web / root / src / main / resources / js / open.js
1 one.main = {};
2
3 one.main.constants = {
4   address : {
5     menu : "/web.json",
6     prefix : "/controller/web",
7     save : "/save"
8   }
9 }
10
11 one.main.menu = {
12   registry : {
13     load : false
14   },
15   load : function() {
16     one.main.menu.ajax(function(data) {
17       // reparse the ajax data
18       var result = one.main.menu.data.menu(data);
19       // transform into list to append to menu
20       var $div = one.main.menu.menu(result);
21       // append to menu
22       $("#menu .nav").append($div.children());
23       // binding all menu items
24       var $menu = $("#menu .nav a");
25       $menu.click(function() {
26         if (one.main.menu.registry.load === true) {
27           return false;
28         }
29         one.main.menu.registry.load = true;
30         var href = $(this).attr('href').substring(1);
31         one.main.page.load(href);
32         var $li = $(this).parent();
33         // reset all other active
34         $menu.each(function(index, value) {
35           $(value).parent().removeClass('active');
36         });
37         $li.addClass('active');
38       });
39       // reset or go to first menu item by default
40       var currentLocation = location.hash;
41       if (data[currentLocation.substring(1)] == undefined) {
42         $($menu[0]).click();
43       } else {
44         $menu.each(function(index, value) {
45           var menuLocation = $(value).attr('href');
46           if (currentLocation == menuLocation) {
47             $($menu[index]).click();
48             return;
49           }
50         });
51       }
52     });
53   },
54   menu : function(result) {
55     var $div = $(document.createElement('div'));
56     $(result).each(function(index, value) {
57       if (value != undefined) {
58         var $li = $(document.createElement('li'));
59         var $a = $(document.createElement('a'));
60         $a.text(value['name']);
61         $a.attr('href', '#' + value['id']);
62         $li.append($a);
63         $div.append($li);
64       }
65     });
66     return $div;
67   },
68   ajax : function(successCallback) {
69     $.getJSON(one.main.constants.address.menu, function(data) {
70       successCallback(data);
71     });
72   },
73   data : {
74     menu : function(data) {
75       var result = [];
76       $.each(data, function(key, value) {
77         var order = value['order'];
78         if (order >= 0) {
79           var name = value['name'];
80           var entry = {
81             'name' : name,
82         'id' : key
83           };
84           result[order] = entry;
85         }
86       });
87       return result;
88     }
89   }
90 }
91
92 one.main.page = {
93   load : function(page) {
94     if (one.f !== undefined && one.f.cleanUp !== undefined) {
95       one.f.cleanUp();
96     }
97     // clear page related
98     delete one.f;
99     $('.dashlet', '#main').empty();
100     $('.nav', '#main').empty();
101     // fetch page's js
102     $.getScript(one.main.constants.address.prefix+"/"+page+"/js/page.js")
103       .success(function() {
104         one.main.menu.registry.load = false;
105       });
106
107     $.ajaxSetup({
108       data : {
109         'x-page-url' : page
110       }
111     });
112   },
113   dashlet : function($nav, dashlet) {
114     var $li = $(document.createElement('li'));
115     var $a = $(document.createElement('a'));
116     $a.text(dashlet.name);
117     $a.attr('id', dashlet.id);
118     $a.attr('href', '#');
119     $li.append($a);
120     $nav.append($li);
121   }
122 }
123
124 one.main.admin = {
125   id : {
126     modal : {
127       main : "one_main_admin_id_modal_main",
128       close : "one_main_admin_id_modal_close",
129       user : "one_main_admin_id_modal_user",
130       add : {
131         user : "one_main_admin_id_modal_add_user",
132         close : "one_main_admin_id_modal_add_close",
133         form : {
134           name : "one_main_admin_id_modal_add_form_name",
135           role : "one_main_admin_id_modal_add_form_role",
136           password : "one_main_admin_id_modal_add_form_password",
137           verify : "one_main_admin_id_modal_add_form_verify"
138         }
139       },
140       remove : {
141         user : "one_main_admin_id_modal_remove_user",
142         close : "one_main_admin_id_modal_remove_close",
143         password : 'one_main_admin_id_modal_remove_password'
144       },
145       modify : {
146           user : "one_main_admin_id_modal_modify_user",
147       },
148       password : {
149         modal : 'one_main_admin_id_modal_password_modal',
150         submit : 'one_main_admin_id_modal_password_submit',
151         cancel : 'one_main_admin_id_modal_password_cancel',
152         form : {
153           old : 'one_main_admin_id_modal_password_form_old',
154           set : 'one_main_admin_id_modal_password_form_new',
155           verify : 'one_main_admin_id_modal_password_form_verify'
156         }
157       }
158     },
159     add : {
160       user : "one_main_admin_id_add_user"
161     }
162   },
163   registry :{
164
165   },
166   address : {
167     root : "/admin",
168     users : "/users",
169     modifyUser : "/user/modify",
170     password : '/admin/users/password/'
171   },
172   modal : {
173     initialize : function(callback) {
174       var h3 = "Welcome " + $('#admin').text();
175       var footer = one.main.admin.modal.footer();
176       var $modal = one.lib.modal.spawn(one.main.admin.id.modal.main, h3,
177           '', footer);
178
179       // close binding
180       $('#' + one.main.admin.id.modal.close, $modal).click(function() {
181         $modal.modal('hide');
182       });
183
184       // body inject
185       one.main.admin.ajax.users(function($body) {
186         one.lib.modal.inject.body($modal, $body);
187       });
188
189       // modal show callback
190       callback($modal);
191     },
192     footer : function() {
193       var footer = [];
194       var closeButton = one.lib.dashlet.button.single('Close', one.main.admin.id.modal.close, '', '');
195       var $closeButton = one.lib.dashlet.button.button(closeButton);
196       footer.push($closeButton);
197       return footer;
198     }
199   },
200   ajax : {
201     users : function(callback) {
202       $.getJSON(one.main.admin.address.root
203           + one.main.admin.address.users, function(data) {
204             var body = one.main.admin.data.users(data);
205             one.main.admin.registry["users"] = data;
206             var $body = one.main.admin.body.users(body);
207             callback($body);
208           });
209     }
210   },
211   data : {
212     users : function(data) {
213       var body = [];
214       $(data).each(function(index, value) {
215         var tr = {};
216         var entry = [];
217         entry.push(value['user']);
218         entry.push(value['roles']);
219         tr['entry'] = entry;
220         tr['id'] = value['user'];
221         body.push(tr);
222       });
223       return body;
224     }
225   },
226   body : {
227     users : function(body) {
228       var $div = $(document.createElement('div'));
229       var $h5 = $(document.createElement('h5'));
230       $h5.append("Manage Users");
231       var attributes = [ "table-striped", "table-bordered",
232           "table-hover", "table-cursor" ];
233       var $table = one.lib.dashlet.table.table(attributes);
234       var headers = [ "User", "Role" ];
235       var $thead = one.lib.dashlet.table.header(headers);
236       var $tbody = one.lib.dashlet.table.body(body);
237       $table.append($thead).append($tbody);
238
239       // bind table
240       if (one.role < 2) {
241         $table.find('tr').click(function() {
242           var id = $(this).data('id');
243           one.main.admin.remove.modal.initialize(id);
244         });
245       }
246
247       // append to div
248       $div.append($h5).append($table);
249
250       if (one.role < 2) {
251         var addUserButton = one.lib.dashlet.button.single("Add User",
252             one.main.admin.id.add.user, "btn-primary", "btn-mini");
253         var $addUserButton = one.lib.dashlet.button
254           .button(addUserButton);
255         $div.append($addUserButton);
256
257         // add user binding
258         $addUserButton.click(function() {
259           one.main.admin.add.modal.initialize();
260         });
261       }
262
263       return $div;
264     }
265   },
266   remove : {
267     modal : {
268       initialize : function(id) {
269         var h3 = "Manage user - " + id;
270         var footer = one.main.admin.remove.footer();
271         var $body = one.main.admin.remove.body();
272         var $modal = one.lib.modal.spawn(one.main.admin.id.modal.user,
273             h3, $body, footer);
274         // close binding
275         $('#'+one.main.admin.id.modal.remove.close, $modal).click(function() {
276           $modal.modal('hide');
277         });
278         // close binding
279         $('#'+one.main.admin.id.modal.modify.user, $modal).click(function() {
280           one.main.admin.add.modal.initialize(id, true);
281         });
282         // remove binding
283         $('#' + one.main.admin.id.modal.remove.user, $modal).click(function() {
284           one.main.admin.remove.modal.ajax(id, function(result) {
285             if (result.description == 'Success') {
286               $modal.modal('hide');
287               // body inject
288               var $admin = $('#'+one.main.admin.id.modal.main);
289               one.main.admin.ajax.users(function($body) {
290                 one.lib.modal.inject.body($admin, $body);
291               });
292             } else {
293               alert("Failed to remove user: " + result.description);
294             }
295           });
296         });
297         // change password binding
298         $('#' + one.main.admin.id.modal.remove.password, $modal).click(function() {
299           one.main.admin.password.initialize(id, function() {
300             $modal.modal('hide');
301           });
302         });
303         $modal.modal();
304       },
305       ajax : function(id, callback) {
306         $.post(one.main.admin.address.root + one.main.admin.address.users + '/' + id, function(data) {
307           callback(data);
308         });
309       },
310     },
311     footer : function() {
312       var footer = [];
313       var removeButton = one.lib.dashlet.button.single("Remove User",
314           one.main.admin.id.modal.remove.user, "btn-danger", "");
315       var $removeButton = one.lib.dashlet.button.button(removeButton);
316       footer.push($removeButton);
317       var modifyButton = one.lib.dashlet.button.single("Change Role",
318               one.main.admin.id.modal.modify.user, "btn-success", "");
319       var $modifyButton = one.lib.dashlet.button.button(modifyButton);
320       footer.push($modifyButton);
321       var change = one.lib.dashlet.button.single('Change Password',
322           one.main.admin.id.modal.remove.password, 'btn-success', '');
323       var $change = one.lib.dashlet.button.button(change);
324       footer.push($change);
325       var closeButton = one.lib.dashlet.button.single("Close",
326           one.main.admin.id.modal.remove.close, "", "");
327       var $closeButton = one.lib.dashlet.button.button(closeButton);
328       footer.push($closeButton);
329       return footer;
330     },
331     body : function() {
332       var $p = $(document.createElement('p'));
333       $p.append('Select an action');
334       return $p;
335     },
336   },
337   add : {
338     modal : {
339       initialize : function(id, edit) {
340         var h3 = edit? "Change Role of user " + id:"Add User";
341         var footer = one.main.admin.add.footer(edit);
342         var $body = one.main.admin.add.body(id, edit);
343         var $modal = one.lib.modal.spawn(one.main.admin.id.modal.user,
344             h3, $body, footer);
345         // close binding
346         $('#' + one.main.admin.id.modal.add.close, $modal).click(function() {
347           $modal.modal('hide');
348         });
349         // add binding
350         $('#' + one.main.admin.id.modal.add.user, $modal).click(function() {
351           one.main.admin.add.modal.add($modal, edit, function(result) {
352             if (result.description == 'Success') {
353               $modal.modal('hide');
354               // body inject
355               var $admin = $('#'+one.main.admin.id.modal.main);
356               one.main.admin.ajax.users(function($body) {
357                one.lib.modal.inject.body($admin, $body);
358               });
359             } else {
360               var action = edit? "edit" :"add";
361               alert("Failed to "+ action +" user: "+result.description);
362             }
363           });
364         });
365         $modal.modal();
366       },
367       add : function($modal, edit, callback) {
368         var user = {};
369         user['user'] = $modal.find(
370             '#' + one.main.admin.id.modal.add.form.name).val();
371         if (!edit) {
372             user['password'] = $modal.find(
373                 '#' + one.main.admin.id.modal.add.form.password).val();
374         }
375         roles = new Array();
376         roles[0] = $modal.find(
377             '#' + one.main.admin.id.modal.add.form.role).find(
378               'option:selected').attr('value');
379         user['roles'] = roles;
380
381         if (!edit) {
382             // password check
383             var verify = $('#'+one.main.admin.id.modal.add.form.verify).val();
384             if (user.password != verify) {
385               alert('Passwords do not match');
386               return false;
387             }
388         }
389         var resource = {};
390         resource['json'] = JSON.stringify(user);
391         resource['action'] = 'add'
392
393         one.main.admin.add.modal.ajax(resource, edit, callback);
394       },
395       ajax : function(data, edit, callback) {
396           if(edit) {
397             $.post(one.main.admin.address.root
398               + one.main.admin.address.modifyUser, data, function(data) {
399                 callback(data);
400               });
401           } else {  
402             $.post(one.main.admin.address.root
403               + one.main.admin.address.users, data, function(data) {
404                 callback(data);
405               });
406           }
407       }
408     },
409     body : function(id, edit) {
410       var $form = $(document.createElement('form'));
411       var $fieldset = $(document.createElement('fieldset'));
412       var users = one.main.admin.registry["users"];
413       var currentUser;
414       if(edit) {
415         $(users).each(function(index, val) {
416              if(val.user == id){
417             currentUser = val;
418           }
419         });
420       }
421
422       // user
423       var $label = one.lib.form.label('Username');
424       var $input = one.lib.form.input('Username');
425       $input.attr('id', one.main.admin.id.modal.add.form.name);
426       if(edit) {
427          $input.attr("disabled",true);
428          $input.val(id);
429       }
430       $fieldset.append($label).append($input);
431       if(!edit) {
432           // password
433           var $label = one.lib.form.label('Password');
434           var $input = one.lib.form.input('Password');
435           $input.attr('id', one.main.admin.id.modal.add.form.password);
436           $input.attr('type', 'password');
437           $fieldset.append($label).append($input);
438           // password verify
439           var $label = one.lib.form.label('Verify Password');
440           var $input = one.lib.form.input('Verify Password');
441           $input.attr('id', one.main.admin.id.modal.add.form.verify);
442           $input.attr('type', 'password');
443           $fieldset.append($label).append($input);
444       }
445       // roles
446       var $label = one.lib.form.label('Roles');
447       var options = {
448         "Network-Admin" : "Network Administrator",
449         "Network-Operator" : "Network Operator"
450       };
451       var $select = one.lib.form.select.create(options);
452       $select.attr('id', one.main.admin.id.modal.add.form.role);
453       if(edit) {
454           $select.children().each(function() {
455                  this.selected = (this.text == options[currentUser.roles[0]]);
456           });
457       }
458
459       $fieldset.append($label).append($select);
460       $form.append($fieldset);
461       return $form;
462     },
463     footer : function(edit) {
464       var footer = [];
465
466       var buttonText = edit ? "Update User" : "Add User";
467
468       var addButton = one.lib.dashlet.button.single(buttonText,
469           one.main.admin.id.modal.add.user, "btn-primary", "");
470       var $addButton = one.lib.dashlet.button.button(addButton);
471       footer.push($addButton);
472
473       var closeButton = one.lib.dashlet.button.single("Close",
474           one.main.admin.id.modal.add.close, "", "");
475       var $closeButton = one.lib.dashlet.button.button(closeButton);
476       footer.push($closeButton);
477
478       return footer;
479     }
480   },
481   password : {
482     initialize : function(id, successCallback) {
483       var h3 = 'Change Password';
484       var footer = one.main.admin.password.footer();
485       var $body = one.main.admin.password.body(id);;
486       var $modal = one.lib.modal.spawn(one.main.admin.id.modal.password.modal,
487           h3, $body, footer);
488
489       // cancel binding
490       $('#'+one.main.admin.id.modal.password.cancel, $modal).click(function() {
491         $modal.modal('hide');
492       });
493
494       // change password binding
495       $('#'+one.main.admin.id.modal.password.submit, $modal).click(function() {
496         one.main.admin.password.submit(id, $modal, function(result) {
497           if (result.success) {
498             //if changed own password, enforce relogin
499             if (id.trim() == $('#currentuser').val().trim()) {
500                 alert("Password changed successfully. Please re-login with your new password.");
501                 window.location = '/';
502             }
503           } else {
504             alert(result.code+': '+result.description);
505           }
506         });
507       });
508
509       $modal.modal();
510     },
511     submit : function(id, $modal, callback) {
512       var resource = {};
513       resource.newPassword = $('#'+one.main.admin.id.modal.password.form.set, $modal).val();
514
515       // verify password
516       var verify = $('#'+one.main.admin.id.modal.password.form.verify, $modal).val();
517       if (verify != resource.newPassword) {
518         alert('Passwords do not match');
519         return false;
520       }
521
522       resource.currentPassword = $('#'+one.main.admin.id.modal.password.form.old, $modal).val();
523
524       $.post(one.main.admin.address.password+id, resource, function(data) {
525         callback(data);
526       });
527     },
528     body : function(id) {
529       var $form = $(document.createElement('form'));
530       var $fieldset = $(document.createElement('fieldset'));
531       // user
532       var $label = one.lib.form.label('Username');
533       var $input = one.lib.form.input('');
534       $input.attr('disabled', 'disabled');
535       $input.val(id);
536       $fieldset.append($label)
537         .append($input);
538       // old password
539       var $label = one.lib.form.label('Old Password');
540       var $input = one.lib.form.input('Old Password');
541       $input.attr('id', one.main.admin.id.modal.password.form.old);
542       $input.attr('type', 'password');
543       $fieldset.append($label).append($input);
544       // new password
545       var $label = one.lib.form.label('New Password');
546       var $input = one.lib.form.input('New Password');
547       $input.attr('id', one.main.admin.id.modal.password.form.set);
548       $input.attr('type', 'password');
549       $fieldset.append($label).append($input);
550       // verify new password
551       var $label = one.lib.form.label('Verify Password');
552       var $input = one.lib.form.input('Verify Password');
553       $input.attr('id', one.main.admin.id.modal.password.form.verify);
554       $input.attr('type', 'password');
555       $fieldset.append($label).append($input);
556       // return
557       $form.append($fieldset);
558       return $form;
559     },
560     footer : function() {
561       var footer = [];
562       var submit = one.lib.dashlet.button.single('Submit',
563           one.main.admin.id.modal.password.submit, 'btn-primary', '');
564       var $submit = one.lib.dashlet.button.button(submit);
565       footer.push($submit);
566       var cancel = one.lib.dashlet.button.single('Cancel',
567           one.main.admin.id.modal.password.cancel, '', '');
568       var $cancel = one.lib.dashlet.button.button(cancel);
569       footer.push($cancel);
570       return footer;
571     }
572   }
573 }
574
575 one.main.cluster = {
576   id : { // one.main.cluster.id
577     modal : 'one-main-cluster-id-modal',
578     close : 'one-main-cluster-id-close',
579     datagrid : 'one-main-cluster-id-datagrid'
580   },
581   initialize : function() {
582     var h3 = 'Cluster Management';
583     var footer = one.main.cluster.footer();
584     var $body = '';
585     var $modal = one.lib.modal.spawn(one.main.cluster.id.modal, h3, $body, footer); 
586
587     // close
588     $('#'+one.main.cluster.id.close, $modal).click(function() {
589       $modal.modal('hide');
590     });
591
592     // body
593     $.getJSON('/admin/cluster', function(data) {
594       var $gridHTML = one.lib.dashlet.datagrid.init(one.main.cluster.id.datagrid, {
595         searchable: true,
596           filterable: false,
597           pagination: true,
598           flexibleRowsPerPage: true
599       }, 'table-striped table-condensed table-cursor');
600       var source = one.main.cluster.data(data);
601       $gridHTML.datagrid({dataSource : source}).on('loaded', function() {
602         $(this).find('tbody tr').click(function() {
603           var $tr = $(this);
604           if ($tr.find('td:nth-child(1)').attr('colspan') === '1') {
605             return false;
606           }
607           var address = $tr.find('.ux-id').text();
608           one.main.cluster.nodes.initialize(address);
609         });
610       });
611       one.lib.modal.inject.body($modal, $gridHTML);
612     });
613
614     $modal.modal();
615   },
616   data : function(data) {
617     var tdata = [];
618     var registry = [];
619     $(data).each(function(idx, controller) {
620       var name = controller.name;
621       var address = controller.address;
622       var $registry = $(document.createElement('span'));
623       $registry
624       .append(JSON.stringify(address))
625       .css('display', 'none')
626       .addClass('ux-id');
627     name = one.lib.dashlet.label(name, null)[0].outerHTML;
628     name += $registry[0].outerHTML;
629     if (controller.me === true) {
630       var me = one.lib.dashlet.label('*', 'label-inverse')[0].outerHTML;
631       name += '&nbsp;'+me;
632     }
633     if (controller.coordinator === true) {
634       var coord = one.lib.dashlet.label('C')[0].outerHTML;
635       name += '&nbsp;'+coord;
636     }
637     tdata.push({
638       'controller' : name,
639       'numNodes'   : controller.numConnectedNodes
640     });
641     });
642     var source = new StaticDataSource({
643         columns : [
644             {
645               property : 'controller',
646                 label : 'Controller',
647                 sortable : true
648             },
649             {
650                 property : 'numNodes',
651                 label    : 'Nodes',
652                 sortable : true
653             }
654         ],
655         data : tdata,
656         delay : 0
657     });
658     return source;
659   },
660   footer : function() {
661     var footer = [];
662     var close = one.lib.dashlet.button.single('Close', one.main.cluster.id.close, '', '');
663     var $close = one.lib.dashlet.button.button(close);
664     footer.push($close);
665     return footer;
666   }
667 }
668
669 one.main.cluster.nodes = {
670   id : { // one.main.cluster.nodes.id
671     modal : 'one-main-cluster-nodes-id-modal',
672     close : 'one-main-cluster-nodes-id-close',
673     datagrid : 'one-main-cluser-nodes-id-datagrid'
674   },
675   initialize : function(address) { // one.main.cluster.nodes.initialize
676     var h3 = 'Connected Nodes';
677     var footer = one.main.cluster.nodes.footer();
678     var $body = '';
679     var $modal = one.lib.modal.spawn(one.main.cluster.nodes.id.modal, h3, $body, footer);
680
681     // close
682     $('#'+one.main.cluster.nodes.id.close, $modal).click(function() {
683       $modal.modal('hide');
684     });
685
686     // body
687     $.getJSON('/admin/cluster/controller/'+address, function(data) {
688       var $gridHTML = one.lib.dashlet.datagrid.init(one.main.cluster.nodes.id.datagrid, {
689         searchable: true,
690           filterable: false,
691           pagination: true,
692           flexibleRowsPerPage: true
693       }, 'table-striped table-condensed');
694       var source = one.main.cluster.nodes.data(data);
695       $gridHTML.datagrid({dataSource : source});
696       one.lib.modal.inject.body($modal, $gridHTML);
697     });
698
699     $modal.modal();
700   },
701   data : function(data) {
702     var tdata = [];
703     $(data).each(function(idx, val) {
704       tdata.push({
705         'node' : val.description
706       });
707     });
708     var source = new StaticDataSource({
709       columns : [
710     {
711       property : 'node',
712         label : 'Node',
713         sortable : true
714     }
715     ],
716         data : tdata,
717         delay : 0
718     });
719     return source;
720   },
721   footer : function() { // one.main.cluster.nodes.footer
722     var footer = [];
723     var close = one.lib.dashlet.button.single('Close', one.main.cluster.nodes.id.close, '', '');
724     var $close = one.lib.dashlet.button.button(close);
725     footer.push($close);
726     return footer;
727   }
728 }
729
730 one.main.dashlet = {
731   left : {
732     top : $("#left-top .dashlet"),
733     bottom : $("#left-bottom .dashlet")
734   },
735   right : {
736     bottom : $("#right-bottom .dashlet")
737   }
738 }
739
740 /** BOOTSTRAP */
741 $(".modal").on('hidden', function() {
742   $(this).remove();
743 });
744
745 $("#alert .close").click(function() {
746   $("#alert").hide();
747 });
748
749 /** INIT */
750
751 // parse role
752 one.role = $('#admin').data('role');
753
754 // user admin
755 $("#admin").click(function() {
756   one.main.admin.modal.initialize(function($modal) {
757     $modal.modal();
758   });
759 });
760
761 // cluster
762 $('#cluster').click(function() {
763   one.main.cluster.initialize();
764 });
765
766 // save
767 $("#save").click(function() {
768   $.post(one.main.constants.address.save, function(data) {
769     if (data == "Success") {
770       one.lib.alert("Configuration Saved");
771     } else {
772       one.lib.alert("Unable to save configuration: " + data);
773     }
774   });
775 });
776
777 // logout
778 $("#logout").click(function() {
779   location.href = "/logout";
780 });
781
782 // felix osgi runtime
783 $("#osgi").click(function() {
784   window.open("/controller/osgi/system/console", '_newtab');
785 });
786
787 $.ajaxSetup({
788   complete : function(xhr, textStatus) {
789     var mime = xhr.getResponseHeader('Content-Type');
790     if (mime.substring(0, 9) == 'text/html') {
791       location.href = '/';
792     }
793   }
794 });
795
796 /** MAIN PAGE LOAD */
797 one.main.menu.load();