www/login.js

Code
Comments
Other
Rev Date Author Line
7604 25 Feb 19 nicklas 1 /* $Id $
7604 25 Feb 19 nicklas 2   ------------------------------------------------------------------
7604 25 Feb 19 nicklas 3   Copyright (C) 2012 Nicklas Nordborg
7604 25 Feb 19 nicklas 4
7604 25 Feb 19 nicklas 5   This file is part of BASE - BioArray Software Environment.
7604 25 Feb 19 nicklas 6   Available at http://base.thep.lu.se/
7604 25 Feb 19 nicklas 7
7604 25 Feb 19 nicklas 8   BASE is free software; you can redistribute it and/or
7604 25 Feb 19 nicklas 9   modify it under the terms of the GNU General Public License
7604 25 Feb 19 nicklas 10   as published by the Free Software Foundation; either version 3
7604 25 Feb 19 nicklas 11   of the License, or (at your option) any later version.
7604 25 Feb 19 nicklas 12
7604 25 Feb 19 nicklas 13   BASE is distributed in the hope that it will be useful,
7604 25 Feb 19 nicklas 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
7604 25 Feb 19 nicklas 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7604 25 Feb 19 nicklas 16   GNU General Public License for more details.
7604 25 Feb 19 nicklas 17
7604 25 Feb 19 nicklas 18   You should have received a copy of the GNU General Public License
7604 25 Feb 19 nicklas 19   along with BASE. If not, see <http://www.gnu.org/licenses/>.
7604 25 Feb 19 nicklas 20   ------------------------------------------------------------------
7604 25 Feb 19 nicklas 21
7604 25 Feb 19 nicklas 22   @author Nicklas
7604 25 Feb 19 nicklas 23 */
7604 25 Feb 19 nicklas 24 'use strict';
7604 25 Feb 19 nicklas 25
7604 25 Feb 19 nicklas 26 var Login = function()
7604 25 Feb 19 nicklas 27 {
7604 25 Feb 19 nicklas 28   var pUseLastLogin = 1;
7604 25 Feb 19 nicklas 29   
7604 25 Feb 19 nicklas 30   var login = {};
7604 25 Feb 19 nicklas 31   
7604 25 Feb 19 nicklas 32   login.initPage = function()
7604 25 Feb 19 nicklas 33   {
7604 25 Feb 19 nicklas 34     // If there is no requested login form, we try to use the last one that was used
7604 25 Feb 19 nicklas 35     var requestedForm = Data.get(document.body, 'requested-form');
7604 25 Feb 19 nicklas 36     if (!requestedForm)
7604 25 Feb 19 nicklas 37     {
7604 25 Feb 19 nicklas 38       var lastLoginForm = login.getLastLoginForm();
7604 25 Feb 19 nicklas 39       var selectedLoginForm = Data.get(document.body, 'login-form');
7604 25 Feb 19 nicklas 40       if (lastLoginForm && selectedLoginForm && lastLoginForm != selectedLoginForm)
7604 25 Feb 19 nicklas 41       {
7604 25 Feb 19 nicklas 42         login.switchLoginForm(lastLoginForm);
7604 25 Feb 19 nicklas 43         return;
7604 25 Feb 19 nicklas 44       }
7604 25 Feb 19 nicklas 45     }
7604 25 Feb 19 nicklas 46     
7604 25 Feb 19 nicklas 47     // Information links
7604 25 Feb 19 nicklas 48     Buttons.addClickHandler('aboutServer', login.showAbout);
7604 25 Feb 19 nicklas 49     Buttons.addClickHandler('getAccount', login.showGetAccount);
7604 25 Feb 19 nicklas 50     Buttons.addClickHandler('forgotPassword', login.showForgotPassword);
7604 25 Feb 19 nicklas 51     
7604 25 Feb 19 nicklas 52     // Login buttons
7604 25 Feb 19 nicklas 53     Events.doOnEnter('login', login.setFocus);
7604 25 Feb 19 nicklas 54     Buttons.addClickHandler('btnLogin', login.doLogin);
7604 25 Feb 19 nicklas 55     Buttons.addClickHandler('btnLoginAnyway', login.enableLogin);
7604 25 Feb 19 nicklas 56     Buttons.addClickHandler('close', App.closeWindow);
7604 25 Feb 19 nicklas 57     
7604 25 Feb 19 nicklas 58     Events.addEventHandler('loginForm', 'change', login.loginFormOnChange);
7604 25 Feb 19 nicklas 59     
7604 25 Feb 19 nicklas 60     var extraField = Doc.element('extraField');
7604 25 Feb 19 nicklas 61     if (extraField == null)
7604 25 Feb 19 nicklas 62     {
7604 25 Feb 19 nicklas 63       // Password field should login if 'ENTER' is pressed
7604 25 Feb 19 nicklas 64       Events.doOnEnter('password', login.doLogin);
7604 25 Feb 19 nicklas 65     }
7604 25 Feb 19 nicklas 66     else
7604 25 Feb 19 nicklas 67     {
7604 25 Feb 19 nicklas 68       // Password field should move focus to the 'extraField' if 'ENTER' is pressed
7604 25 Feb 19 nicklas 69       Events.doOnEnter('password', login.setFocus);
7604 25 Feb 19 nicklas 70       Events.doOnEnter(extraField, login.doLogin);
7604 25 Feb 19 nicklas 71     }
7604 25 Feb 19 nicklas 72     
7604 25 Feb 19 nicklas 73     Doc.show('the-login-form', 'table');
7604 25 Feb 19 nicklas 74     login.initForm();
7604 25 Feb 19 nicklas 75     
7604 25 Feb 19 nicklas 76     var footNoteFrame = App.topWindow().frames['footnote'];
7604 25 Feb 19 nicklas 77     if (footNoteFrame)
7604 25 Feb 19 nicklas 78     {
7604 25 Feb 19 nicklas 79       setTimeout(login.reloadFootnote, 500);
7604 25 Feb 19 nicklas 80     }
7604 25 Feb 19 nicklas 81   }
7604 25 Feb 19 nicklas 82   
7604 25 Feb 19 nicklas 83   
7604 25 Feb 19 nicklas 84   login.loginFormOnChange = function(event)
7604 25 Feb 19 nicklas 85   {
7604 25 Feb 19 nicklas 86     login.switchLoginForm(event.currentTarget.value);
7604 25 Feb 19 nicklas 87   }
7604 25 Feb 19 nicklas 88   
7604 25 Feb 19 nicklas 89   login.switchLoginForm = function(loginForm)
7604 25 Feb 19 nicklas 90   {
7604 25 Feb 19 nicklas 91     var frm = document.forms['login'];
7604 25 Feb 19 nicklas 92     var url = location.pathname+'?ID='+App.getSessionId();
7604 25 Feb 19 nicklas 93     url += '&loginForm='+encodeURIComponent(loginForm);
7604 25 Feb 19 nicklas 94     if (frm.again) url += '&again='+encodeURIComponent(frm.again.value);
7604 25 Feb 19 nicklas 95     location.replace(url);
7604 25 Feb 19 nicklas 96   }
7604 25 Feb 19 nicklas 97   
7604 25 Feb 19 nicklas 98   login.reloadFootnote = function()
7604 25 Feb 19 nicklas 99   {
7604 25 Feb 19 nicklas 100     var footNoteFrame = App.topWindow().frames['footnote'];
7604 25 Feb 19 nicklas 101     footNoteFrame.location.reload();      
7604 25 Feb 19 nicklas 102   }
7604 25 Feb 19 nicklas 103   
7604 25 Feb 19 nicklas 104   /**
7604 25 Feb 19 nicklas 105     Initialize the login form by populating it with the last used login
7604 25 Feb 19 nicklas 106     and setting focus to either the login or password field.
7604 25 Feb 19 nicklas 107   */
7604 25 Feb 19 nicklas 108   login.initForm = function()
7604 25 Feb 19 nicklas 109   {
7604 25 Feb 19 nicklas 110     var frm = document.forms['login'];
7604 25 Feb 19 nicklas 111     if (!frm.login) return;
7604 25 Feb 19 nicklas 112     pUseLastLogin = Data.int(frm.login, 'use-last-login', 1);
7604 25 Feb 19 nicklas 113     if (pUseLastLogin)
7604 25 Feb 19 nicklas 114     {
7604 25 Feb 19 nicklas 115       var lastLogin = login.getLastLogin();
7604 25 Feb 19 nicklas 116       if (!frm.login.value && lastLogin) 
7604 25 Feb 19 nicklas 117       {
7604 25 Feb 19 nicklas 118         frm.login.value = lastLogin;
7604 25 Feb 19 nicklas 119       }
7604 25 Feb 19 nicklas 120     }
7604 25 Feb 19 nicklas 121     login.setFocus();
7604 25 Feb 19 nicklas 122   }
7604 25 Feb 19 nicklas 123
7604 25 Feb 19 nicklas 124   
7604 25 Feb 19 nicklas 125   /*
7604 25 Feb 19 nicklas 126     Save the last login. If local storage is available we use that,
7604 25 Feb 19 nicklas 127     otherwise we simply save it on the top frameset.
7604 25 Feb 19 nicklas 128   */
7604 25 Feb 19 nicklas 129   login.saveLastLogin = function(lastLogin)
7604 25 Feb 19 nicklas 130   {
7604 25 Feb 19 nicklas 131     var storage = App.localStorage();
7604 25 Feb 19 nicklas 132     if (storage)
7604 25 Feb 19 nicklas 133     {
7604 25 Feb 19 nicklas 134       App.setLocal('last-login', lastLogin);
7604 25 Feb 19 nicklas 135     }
7604 25 Feb 19 nicklas 136     else
7604 25 Feb 19 nicklas 137     {
7604 25 Feb 19 nicklas 138       App.topWindow().lastLogin = lastLogin;
7604 25 Feb 19 nicklas 139     }
7604 25 Feb 19 nicklas 140   }
7604 25 Feb 19 nicklas 141   
7604 25 Feb 19 nicklas 142   /**
7604 25 Feb 19 nicklas 143     Get the last used login. If local storage is available we
7604 25 Feb 19 nicklas 144     use that, otherwise we use the top frameset.
7604 25 Feb 19 nicklas 145    */
7604 25 Feb 19 nicklas 146   login.getLastLogin = function()
7604 25 Feb 19 nicklas 147   {
7604 25 Feb 19 nicklas 148     var lastLogin;
7604 25 Feb 19 nicklas 149     var storage = App.localStorage();
7604 25 Feb 19 nicklas 150     if (storage)
7604 25 Feb 19 nicklas 151     {
7604 25 Feb 19 nicklas 152       lastLogin = App.getLocal('last-login');
7604 25 Feb 19 nicklas 153     }
7604 25 Feb 19 nicklas 154     if (!lastLogin)
7604 25 Feb 19 nicklas 155     {
7604 25 Feb 19 nicklas 156       lastLogin = App.topWindow().lastLogin;
7604 25 Feb 19 nicklas 157     }
7604 25 Feb 19 nicklas 158     return lastLogin;
7604 25 Feb 19 nicklas 159   }
7604 25 Feb 19 nicklas 160   
7604 25 Feb 19 nicklas 161   
7604 25 Feb 19 nicklas 162   /*
7604 25 Feb 19 nicklas 163     Save the last login form. If local storage is available we use that,
7604 25 Feb 19 nicklas 164     otherwise we simply save it on the top frameset.
7604 25 Feb 19 nicklas 165   */
7604 25 Feb 19 nicklas 166   login.saveLastLoginForm = function(lastLoginForm)
7604 25 Feb 19 nicklas 167   {
7604 25 Feb 19 nicklas 168     var storage = App.localStorage();
7604 25 Feb 19 nicklas 169     if (storage)
7604 25 Feb 19 nicklas 170     {
7604 25 Feb 19 nicklas 171       App.setLocal('last-login-form', lastLoginForm);
7604 25 Feb 19 nicklas 172     }
7604 25 Feb 19 nicklas 173     else
7604 25 Feb 19 nicklas 174     {
7604 25 Feb 19 nicklas 175       App.topWindow().lastLoginForm = lastLoginForm;
7604 25 Feb 19 nicklas 176     }
7604 25 Feb 19 nicklas 177   }
7604 25 Feb 19 nicklas 178   
7604 25 Feb 19 nicklas 179   /**
7604 25 Feb 19 nicklas 180     Get the last used login form. If local storage is available we
7604 25 Feb 19 nicklas 181     use that, otherwise we use the top frameset.
7604 25 Feb 19 nicklas 182    */
7604 25 Feb 19 nicklas 183   login.getLastLoginForm = function()
7604 25 Feb 19 nicklas 184   {
7604 25 Feb 19 nicklas 185     var lastLoginForm;
7604 25 Feb 19 nicklas 186     var storage = App.localStorage();
7604 25 Feb 19 nicklas 187     if (storage)
7604 25 Feb 19 nicklas 188     {
7604 25 Feb 19 nicklas 189       lastLoginForm = App.getLocal('last-login-form');
7604 25 Feb 19 nicklas 190     }
7604 25 Feb 19 nicklas 191     if (!lastLoginForm)
7604 25 Feb 19 nicklas 192     {
7604 25 Feb 19 nicklas 193       lastLoginForm = App.topWindow().lastLoginForm;
7604 25 Feb 19 nicklas 194     }
7604 25 Feb 19 nicklas 195     return lastLoginForm;
7604 25 Feb 19 nicklas 196   }
7604 25 Feb 19 nicklas 197
7604 25 Feb 19 nicklas 198   
7604 25 Feb 19 nicklas 199   /**
7604 25 Feb 19 nicklas 200     Set focus on the login field if empty, otherwise the password field 
7604 25 Feb 19 nicklas 201     or the extraField
7604 25 Feb 19 nicklas 202   */
7604 25 Feb 19 nicklas 203   login.setFocus = function()
7604 25 Feb 19 nicklas 204   {
7604 25 Feb 19 nicklas 205     var frm = document.forms['login'];
7604 25 Feb 19 nicklas 206     var fieldToFocus = null;
7604 25 Feb 19 nicklas 207     if (!frm.login.value)
7604 25 Feb 19 nicklas 208     {
7604 25 Feb 19 nicklas 209       fieldToFocus = frm.login;
7604 25 Feb 19 nicklas 210     }
7604 25 Feb 19 nicklas 211     else if (frm.password.value && frm.extraField)
7604 25 Feb 19 nicklas 212     {
7604 25 Feb 19 nicklas 213       fieldToFocus = frm.extraField;
7604 25 Feb 19 nicklas 214     }
7604 25 Feb 19 nicklas 215     else
7604 25 Feb 19 nicklas 216     {
7604 25 Feb 19 nicklas 217       fieldToFocus = frm.password;
7604 25 Feb 19 nicklas 218     }
7604 25 Feb 19 nicklas 219     fieldToFocus.focus();
7604 25 Feb 19 nicklas 220     fieldToFocus.select();
7604 25 Feb 19 nicklas 221   }
7604 25 Feb 19 nicklas 222   
7604 25 Feb 19 nicklas 223   /**
7604 25 Feb 19 nicklas 224     Enable the (disabled) login form.
7604 25 Feb 19 nicklas 225   */
7604 25 Feb 19 nicklas 226   login.enableLogin = function()
7604 25 Feb 19 nicklas 227   {
7604 25 Feb 19 nicklas 228     var frm = document.forms['login'];
7604 25 Feb 19 nicklas 229     frm.login.disabled = false;
7604 25 Feb 19 nicklas 230     frm.password.disabled = false;
7604 25 Feb 19 nicklas 231     if (frm.extraField) frm.extraField.disabled = false;
7604 25 Feb 19 nicklas 232     Doc.hide('btnLoginAnyway');
7604 25 Feb 19 nicklas 233     Doc.removeClass('btnLogin', 'disabled');
7604 25 Feb 19 nicklas 234     login.setFocus();
7604 25 Feb 19 nicklas 235   }
7604 25 Feb 19 nicklas 236   
7604 25 Feb 19 nicklas 237   /**
7604 25 Feb 19 nicklas 238     Send the login form.
7604 25 Feb 19 nicklas 239   */
7604 25 Feb 19 nicklas 240   login.doLogin = function(event)
7604 25 Feb 19 nicklas 241   {
7604 25 Feb 19 nicklas 242     var frm = document.forms['login'];
7604 25 Feb 19 nicklas 243     // Check if login has been disabled
7604 25 Feb 19 nicklas 244     if (frm.login && frm.login.disabled) return;
7604 25 Feb 19 nicklas 245
7604 25 Feb 19 nicklas 246     // Disable start page extension if special key is used
7604 25 Feb 19 nicklas 247     var specialKey = event.altKey || event.ctrlKey || event.shiftKey;
7604 25 Feb 19 nicklas 248     
7604 25 Feb 19 nicklas 249     // Check if the login is not recommended
7604 25 Feb 19 nicklas 250     var denyLogin = Doc.element('denyLogin');
7604 25 Feb 19 nicklas 251     if (denyLogin)
7604 25 Feb 19 nicklas 252     {
7604 25 Feb 19 nicklas 253       if (!confirm('Login has been disabled by an administrator. Do you want to continue anyway?'))
7604 25 Feb 19 nicklas 254       {
7604 25 Feb 19 nicklas 255         return;
7604 25 Feb 19 nicklas 256       }
7604 25 Feb 19 nicklas 257     }
7604 25 Feb 19 nicklas 258     
7604 25 Feb 19 nicklas 259     // On the impersonate form, check that a user has been selected
7604 25 Feb 19 nicklas 260     if (frm.user_id && !frm.user_id.value)
7604 25 Feb 19 nicklas 261     {
7604 25 Feb 19 nicklas 262       Forms.showNotification('user_id.select', 'Please select a user');
7604 25 Feb 19 nicklas 263       return;
7604 25 Feb 19 nicklas 264     }
7604 25 Feb 19 nicklas 265
7604 25 Feb 19 nicklas 266     // Store the last login
7604 25 Feb 19 nicklas 267     if (pUseLastLogin && frm.login)
7604 25 Feb 19 nicklas 268     {
7604 25 Feb 19 nicklas 269       Login.saveLastLogin(frm.login.value);
7604 25 Feb 19 nicklas 270     }
7604 25 Feb 19 nicklas 271     if (frm.loginForm)
7604 25 Feb 19 nicklas 272     {
7604 25 Feb 19 nicklas 273       Login.saveLastLoginForm(frm.loginForm.value);
7604 25 Feb 19 nicklas 274     }
7604 25 Feb 19 nicklas 275     
7604 25 Feb 19 nicklas 276     // Check 'remain on page' and 'redirect' options
7604 25 Feb 19 nicklas 277     if (frm.remainOnPage && frm.redirect)
7604 25 Feb 19 nicklas 278     {
7604 25 Feb 19 nicklas 279       if (frm.remainOnPage.checked) 
7604 25 Feb 19 nicklas 280       {
7604 25 Feb 19 nicklas 281         frm.redirect.value = window.opener ? window.opener.location.href : '';
7604 25 Feb 19 nicklas 282       }
7604 25 Feb 19 nicklas 283       else
7604 25 Feb 19 nicklas 284       {
7604 25 Feb 19 nicklas 285         frm.useAutoStartPage.value = '1';
7604 25 Feb 19 nicklas 286         frm.redirect.value = App.getRoot()+'my_base/index.jsp?ID='+App.getSessionId();
7604 25 Feb 19 nicklas 287       }
7604 25 Feb 19 nicklas 288     }
7604 25 Feb 19 nicklas 289     
7604 25 Feb 19 nicklas 290     if (specialKey && frm.useAutoStartPage) frm.useAutoStartPage.value = '0'; 
7604 25 Feb 19 nicklas 291     
7604 25 Feb 19 nicklas 292     if (frm.target) Dialogs.openPopup('', frm.target, 300, 200);
7604 25 Feb 19 nicklas 293     // Set the deviceToken if we have it in local storage
7604 25 Feb 19 nicklas 294     if (frm.deviceToken)
7604 25 Feb 19 nicklas 295     {
7604 25 Feb 19 nicklas 296       var deviceToken = App.getLocal('deviceToken');
7815 05 Jun 20 nicklas 297       if (deviceToken) 
7815 05 Jun 20 nicklas 298       {
7815 05 Jun 20 nicklas 299         frm.deviceToken.value = deviceToken;
7815 05 Jun 20 nicklas 300       }
7815 05 Jun 20 nicklas 301       else
7815 05 Jun 20 nicklas 302       {
7815 05 Jun 20 nicklas 303         // Otherwise we save the auto-generated value
7815 05 Jun 20 nicklas 304         App.setLocal('deviceToken', frm.deviceToken.value);
7815 05 Jun 20 nicklas 305       }
7604 25 Feb 19 nicklas 306     }
8045 03 Jun 22 nicklas 307     
8045 03 Jun 22 nicklas 308     // Send custom event to let extensions do stuff before submitting
8045 03 Jun 22 nicklas 309     Doc.hide('login-error');
8045 03 Jun 22 nicklas 310     var evt = new CustomEvent('before-login', {  cancelable: true, bubbles: true });
8045 03 Jun 22 nicklas 311     if (frm.dispatchEvent(evt)) 
8045 03 Jun 22 nicklas 312     {
8045 03 Jun 22 nicklas 313       login.submitLoginForm();
8045 03 Jun 22 nicklas 314     }
8045 03 Jun 22 nicklas 315   }
8045 03 Jun 22 nicklas 316   
8045 03 Jun 22 nicklas 317   /**
8045 03 Jun 22 nicklas 318     Submit the login form with no questions asked.
8045 03 Jun 22 nicklas 319   */
8045 03 Jun 22 nicklas 320   login.submitLoginForm = function()
8045 03 Jun 22 nicklas 321   {
8045 03 Jun 22 nicklas 322     var frm = document.forms['login'];
7604 25 Feb 19 nicklas 323     if (!pUseLastLogin)
7604 25 Feb 19 nicklas 324     {
7604 25 Feb 19 nicklas 325       // Duplicate in hidden form
7604 25 Feb 19 nicklas 326       var frm2 = Forms.cloneAsHidden(frm);
7604 25 Feb 19 nicklas 327       document.body.appendChild(frm2);
7604 25 Feb 19 nicklas 328       frm2.submit();
7604 25 Feb 19 nicklas 329       document.body.removeChild(frm2);
7604 25 Feb 19 nicklas 330     }
7604 25 Feb 19 nicklas 331     else
7604 25 Feb 19 nicklas 332     {
7604 25 Feb 19 nicklas 333       frm.submit();
7604 25 Feb 19 nicklas 334     }
7604 25 Feb 19 nicklas 335   }
7604 25 Feb 19 nicklas 336   
7604 25 Feb 19 nicklas 337   /**
7604 25 Feb 19 nicklas 338     Show popup dialog with information about this server.
7604 25 Feb 19 nicklas 339   */
7604 25 Feb 19 nicklas 340   login.showAbout = function()
7604 25 Feb 19 nicklas 341   {
7604 25 Feb 19 nicklas 342     var url = App.getRoot()+'info/about.jsp?ID='+App.getSessionId();
7604 25 Feb 19 nicklas 343     url += '&page=about';
7604 25 Feb 19 nicklas 344     Dialogs.openPopup(url, 'About', 600, 400);
7604 25 Feb 19 nicklas 345   }
7604 25 Feb 19 nicklas 346   
7604 25 Feb 19 nicklas 347   /**
7604 25 Feb 19 nicklas 348     Show popup dialog with information about how to get an account on this server.
7604 25 Feb 19 nicklas 349   */
7604 25 Feb 19 nicklas 350   login.showGetAccount = function()
7604 25 Feb 19 nicklas 351   {
7604 25 Feb 19 nicklas 352     var url = App.getRoot()+'info/get_account.jsp?ID='+App.getSessionId();
7604 25 Feb 19 nicklas 353     Dialogs.openPopup(url, 'GetAccount', 450, 300);
7604 25 Feb 19 nicklas 354   }
7604 25 Feb 19 nicklas 355   
7604 25 Feb 19 nicklas 356   /**
7604 25 Feb 19 nicklas 357     Show popup dialog with information about what to do if a password has been lost.
7604 25 Feb 19 nicklas 358   */
7604 25 Feb 19 nicklas 359   login.showForgotPassword = function()
7604 25 Feb 19 nicklas 360   {
7604 25 Feb 19 nicklas 361     var url = App.getRoot()+'info/forgot_password.jsp?ID='+App.getSessionId();
7604 25 Feb 19 nicklas 362     Dialogs.openPopup(url, 'ForgotPassword', 450, 300);
7604 25 Feb 19 nicklas 363   }
7604 25 Feb 19 nicklas 364   
7604 25 Feb 19 nicklas 365   return login;
7604 25 Feb 19 nicklas 366 }();
7604 25 Feb 19 nicklas 367
7604 25 Feb 19 nicklas 368 Doc.onLoad(Login.initPage);
7604 25 Feb 19 nicklas 369