login.html 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="robots" content="noindex" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  7. <link rel="author" href="humans.txt"/>
  8. <title locale="page/title">ArozOS - Login</title>
  9. <link rel="stylesheet" href="script/semantic/semantic.min.css">
  10. <link rel="stylesheet" href="script/ao.css">
  11. <script type="application/javascript" src="script/jquery.min.js"></script>
  12. <script type="application/javascript" src="script/semantic/semantic.min.js"></script>
  13. <script type="text/javascript" src="script/locale/login.js"></script>
  14. <style>
  15. @media only screen and (max-height: 1000px) {
  16. .leftPictureFrame {
  17. height:auto !important;
  18. }
  19. }
  20. :root{
  21. --main_theme_color: #061735;
  22. --secondary_theme_color: #304a6b;
  23. --dimmer_theme_color: #9aafc4;
  24. --inverse_theme_color: #283851;
  25. }
  26. .leftPictureFrame{
  27. position:fixed;
  28. top:0px;
  29. left:0px;
  30. min-width:calc(100% - 500px);
  31. min-height:100%;
  32. background-color:#faf7eb;
  33. background-image:url("./system/info/wallpaper.jpg");
  34. -webkit-background-size: cover;
  35. -moz-background-size: cover;
  36. -o-background-size: cover;
  37. background-size: cover;
  38. background-repeat: no-repeat, no-repeat;
  39. background-position:bottom left;
  40. }
  41. .rightLoginFrame{
  42. position:fixed;
  43. top:0;
  44. right:0;
  45. height:100%;
  46. width:500px;
  47. background:white;
  48. z-index:100%;
  49. padding-left: 30px;
  50. padding-right: 20px;
  51. }
  52. @media (max-width: 600px) {
  53. .rightLoginFrame{
  54. width: 100%;
  55. }
  56. }
  57. @media (min-width: 600px) {
  58. @supports (backdrop-filter: blur(10px)) {
  59. /* This browser support backdrop filter */
  60. .rightLoginFrame {
  61. margin-top: 5em;
  62. margin-right: 5em;
  63. margin-left: 5em;
  64. height:calc(100% - 10em);
  65. border-radius: 1em;
  66. }
  67. .leftPictureFrame{
  68. min-width:calc(100%);
  69. }
  70. }
  71. }
  72. .fullHeightImage{
  73. height:100% !important;
  74. position:relative;
  75. left:-20px;
  76. }
  77. .bottombar{
  78. position:absolute;
  79. bottom:1em;
  80. left:0;
  81. padding-left: 20px;
  82. width:100%;
  83. }
  84. #animationFrame{
  85. position:absolute;
  86. bottom:0px;
  87. width:100%;
  88. }
  89. .textbox{
  90. margin-bottom:15px;
  91. }
  92. .themecolor{
  93. background-color: var(--main_theme_color) !important;
  94. transition: background-color 0.1s;
  95. }
  96. .themecolor:hover{
  97. background-color: var(--secondary_theme_color) !important;
  98. }
  99. .subthemecolor{
  100. background-color: var(--secondary_theme_color) !important;
  101. transition: background-color 0.1s;
  102. }
  103. .subthemecolor:hover{
  104. background-color: var(--dimmer_theme_color) !important;
  105. }
  106. .inversehighlight{
  107. padding: 0.4em;
  108. padding-top: 0.2em;
  109. padding-bottom: 0.3em;
  110. background-color: var(--dimmer_theme_color);
  111. color: white;
  112. border-radius: 0.4em;
  113. margin-top: 0.4em;
  114. }
  115. .loginbtn{
  116. color:white !important;
  117. margin-top:4em;
  118. }
  119. .oauthbtn{
  120. color:white !important;
  121. margin-top:1em;
  122. }
  123. .alternativeAccount:not(.disabled){
  124. cursor: pointer;
  125. }
  126. .alternativeAccount:not(.disabled):hover{
  127. background-color: rgb(245, 245, 245);
  128. }
  129. .alternativeAccount:disabled{
  130. opacity: 0.6;
  131. pointer-events: none !important;
  132. user-select: none;
  133. cursor: not-allowed;
  134. }
  135. .loginLogo{
  136. margin-top: 4em;
  137. }
  138. .languageSelector{
  139. position: absolute;
  140. top: 1em;
  141. right: 1em;
  142. z-index: 1000;
  143. }
  144. .languageSelector .ui.dropdown{
  145. min-width: 120px;
  146. background: rgba(255, 255, 255, 0.9);
  147. border: 1px solid rgba(0, 0, 0, 0.1);
  148. border-radius: 0.3em;
  149. }
  150. .languageSelector .ui.dropdown .menu{
  151. min-width: 140px;
  152. }
  153. @media (max-width: 600px) {
  154. .languageSelector {
  155. position: fixed;
  156. top: 0.5em;
  157. right: 0.5em;
  158. }
  159. }
  160. @media (orientation: landscape) and (max-height: 765px) {
  161. .rightLoginFrame{
  162. width: 500px !important;
  163. margin-left: auto;
  164. margin-right: auto;
  165. margin-top: 0;
  166. height: 100%;
  167. overflow-y: auto;
  168. border-radius: 0;
  169. }
  170. .loginLogo{
  171. margin-top: 1.2em;
  172. }
  173. }
  174. </style>
  175. </head>
  176. <body>
  177. <div class="leftPictureFrame">
  178. </div>
  179. <!-- Language Selector -->
  180. <div class="languageSelector">
  181. <div class="ui selection dropdown">
  182. <input id="language" type="hidden" name="language">
  183. <i class="dropdown icon"></i>
  184. <div class="default text">Language</div>
  185. <div class="menu" id="langlist">
  186. <div class="item" data-value="default" locale="locale/browser-default">Browser Default</div>
  187. </div>
  188. </div>
  189. </div>
  190. <div id="loginInterface" class="rightLoginFrame">
  191. <img class="ui medium image loginLogo" src="data:image/png;base64, {{service_logo}}">
  192. <div class="ui borderless basic segment">
  193. <p><span locale="login/introPrefix">Sign in to </span><span class="hostname">ArozOS</span><span locale="login/introSuffix"> </span><span locale="login/description">with your username and password</span></p>
  194. <div class="ui fluid input textbox">
  195. <input id="username" type="text" placeholder="Username" locale="username">
  196. </div>
  197. <div class="ui fluid input textbox">
  198. <input id="magic" type="password" placeholder="Password" locale="password">
  199. </div>
  200. <div class="ui checkbox">
  201. <input id="rmbme" type="checkbox">
  202. <label for="rmbme" locale="login/rememberMe">Remember Me</label>
  203. </div>
  204. <br><br>
  205. <button id="loginbtn" class="ui button loginbtn themecolor" style="display:inline-block;" locale="login/signinButton">Sign In</button>
  206. <div class="oauthonly" style="display:inline-block;">
  207. <a class="ui button oauthbtn subthemecolor" href="system/auth/oauth/login" locale="login/oauthButton">Sign In via OAuth 2.0</a><br>
  208. </div>
  209. <div class="ldaponly" style="display:inline-block;">
  210. <a class="ui button oauthbtn subthemecolor" href="ldapLogin.system" locale="login/ldapButton">Sign In via LDAP</a><br>
  211. </div>
  212. <div class="resumableOnly" style="display:none;">
  213. <br>
  214. <div class="ui clickable segment alternativeAccount" style="margin-bottom: 0px; padding-bottom: 8px; width: 100%; padding-top: 0px;">
  215. <div style="margin-top: 0.6em;">
  216. <div class="ui header">
  217. <img class="usericon ui circular image" src="img/public/user.svg">
  218. <div class="content" style="font-size: 95% !important;">
  219. <span class="username"><i class="ui loading spinner icon"></i></span>
  220. <div class="sub header usergroup"><i class="ui green check circle icon" style="margin-right: 0px;"></i> <span locale="login/resumableSession">Resumable Session</span></div>
  221. </div>
  222. </div>
  223. </div>
  224. </div>
  225. <br>
  226. <button class="ui subthemecolor newResumableSession button" style="color: white; display:none;"><i class="ui add icon"></i> <span locale="login/createNewSession">Create New Session</span></button>
  227. </div>
  228. <br>
  229. <div class="ui breadcrumb" style="margin-top:12px;">
  230. <a class="section signup" style="cursor:pointer; display:none;" href="public/register/register.system" locale="login/signUp">Sign Up</a>
  231. <div class="divider signup"> / </div>
  232. <a id="forgetpw" class="section" style="cursor:pointer" href="reset.system" locale="login/forgotPassword">Forgot Password</a>
  233. </div>
  234. <p style="margin-top:18px;color:#ff7a70; display:none;font-size:1.2em;"><i class="remove icon"></i><span id="errmsg" locale="login/errorIncorrect">Error. Incorrect username or password.</span></p>
  235. </div>
  236. <div class="bottombar">
  237. © <a href="https://os.aroz.org">ArozOS</a> 2017 - <span class="thisyear"></span><br>
  238. <small class="inversehighlight" style="font-size: 80%"><span locale="login/requestTimestamp">Request Timestamp</span>: <span id="requestTime"></span> | <span id="requestHostCommonName"></span></small>
  239. </div>
  240. </div>
  241. <script>
  242. var localeManager = window.LoginLocale || null;
  243. if (localeManager && typeof localeManager.init === "function") {
  244. localeManager.init();
  245. }
  246. function localeGetString(key, fallback) {
  247. if (localeManager && typeof localeManager.getString === "function") {
  248. return localeManager.getString(key, fallback);
  249. }
  250. return fallback;
  251. }
  252. var redirectionAddress = "{{redirection_addr}}";
  253. var loginAddress = "{{login_addr}}";
  254. var systemUserCount = "{{usercount}}" - 0; //Magic way to convert string to int :)
  255. var autoRedirectTimer;
  256. var isMobile = false; //initiate as false
  257. // device detection
  258. if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent)
  259. || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) {
  260. isMobile = true;
  261. }
  262. if (isMobile){
  263. //Full screen the login panel
  264. $("#loginInterface").css("width","100%");
  265. }
  266. if (systemUserCount == 0){
  267. //There are no user in this system yet. Rediect to user setup
  268. window.location.href = "/user.html";
  269. }
  270. //Hide elements by default
  271. $(".ldaponly").hide();
  272. $(".oauthonly").hide();
  273. $(document).ready(function(){
  274. function zeroPad(num) {
  275. return num < 10 ? '0' + num : num;
  276. }
  277. var currentdate = new Date();
  278. var datetime = zeroPad(currentdate.getDate()) + "/"
  279. + zeroPad(currentdate.getMonth() + 1) + "/"
  280. + currentdate.getFullYear() + " "
  281. + zeroPad(currentdate.getHours()) + ":"
  282. + zeroPad(currentdate.getMinutes()) + ":"
  283. + zeroPad(currentdate.getSeconds());
  284. $("#requestTime").text(datetime);
  285. $("#requestHostCommonName").text(location.hostname);
  286. $(".ui.checkbox").checkbox();
  287. // Initialize language dropdown using settings method
  288. var storedLanguage = localStorage.getItem('global_language') || 'default';
  289. $("#language").val(storedLanguage);
  290. $('.selection.dropdown').dropdown({
  291. onChange: function(value) {
  292. localStorage.setItem('global_language', value);
  293. if (localeManager && typeof localeManager.setLanguage === 'function') {
  294. localeManager.setLanguage(value);
  295. }
  296. }
  297. });
  298. function populateLanguageOptions() {
  299. if (!localeManager || typeof localeManager.getAvailableLocales !== 'function') {
  300. return;
  301. }
  302. var locales = localeManager.getAvailableLocales();
  303. for (var key in locales) {
  304. if (!Object.prototype.hasOwnProperty.call(locales, key)) {
  305. continue;
  306. }
  307. if (!$("#langlist .item[data-value='" + key + "']").length) {
  308. var value = locales[key];
  309. var langName = (value && value.name) ? value.name : key;
  310. $("#langlist").append('<div class="item" data-value="' + key + '">' + langName + '</div>');
  311. }
  312. }
  313. var currentLang = localStorage.getItem('global_language') || 'default';
  314. $("#language").val(currentLang);
  315. $('.selection.dropdown').dropdown('refresh');
  316. $('.selection.dropdown').dropdown('set selected', currentLang);
  317. }
  318. function updateHostnameAndTitle() {
  319. $.get("system/info/getArOZInfo", function(data){
  320. if (data && data.HostName){
  321. $(".hostname").text(data.HostName);
  322. var titleSuffix = localeGetString('page/titleSuffix', 'Sign In');
  323. document.title = data.HostName + " - " + titleSuffix;
  324. }
  325. });
  326. }
  327. window.updateHostnameAndTitle = updateHostnameAndTitle;
  328. window.updateDropdownText = function() {
  329. var localeManager = window.LoginLocale;
  330. if (!localeManager) return;
  331. var currentLang = localeManager.getCurrentLanguage();
  332. var text = 'Language';
  333. if (currentLang === 'default') {
  334. text = localeGetString('locale/browser-default', 'Browser Default');
  335. } else {
  336. var locales = localeManager.getAvailableLocales();
  337. var langData = locales[currentLang];
  338. if (langData && langData.name) {
  339. text = langData.name;
  340. }
  341. }
  342. $('.selection.dropdown .text').text(text);
  343. };
  344. var runLocaleEnhancements = function () {
  345. populateLanguageOptions();
  346. updateHostnameAndTitle();
  347. updateDropdownText();
  348. };
  349. if (localeManager && typeof localeManager.onReady === 'function') {
  350. localeManager.onReady(runLocaleEnhancements);
  351. } else {
  352. runLocaleEnhancements();
  353. }
  354. //Check if the user already logged in
  355. $.get("system/auth/checkLogin",function(data){
  356. try{
  357. if (data === true || data.trim() == "true"){
  358. //User already logged in. Redirect to target page.
  359. if (redirectionAddress == ""){
  360. //Redirect back to index
  361. window.location.href = "/";
  362. }else{
  363. console.log(data);
  364. //window.location.href = redirectionAddress;
  365. }
  366. }
  367. }catch(ex){
  368. //Assume not logged in
  369. console.log(data);
  370. }
  371. });
  372. //Check if the system is open for registry
  373. $.get("public/register/checkPublicRegister",function(data){
  374. if (data == true){
  375. $(".signup").show();
  376. }else{
  377. $(".signup").remove();
  378. }
  379. });
  380. //OAuth related code, check if system is open for ext login
  381. $.getJSON("system/auth/oauth/checkoauth",function(data){
  382. if (data.enabled == true){
  383. $(".oauthonly").show();
  384. }else{
  385. $(".oauthonly").hide();
  386. }
  387. //if auto redirect is on
  388. if(data.auto_redirect == true) {
  389. //checking if they come from desktop.system or mobile.system
  390. //if they come from that two pages, usually mean they are just logged out.
  391. if(document.referrer != ''){
  392. var path = new URL(document.referrer);
  393. } else {
  394. var path = new URL('http://0.0.0.0');
  395. }
  396. if(document.referrer != window.location.origin + "/desktop.system" && document.referrer != window.location.origin + "/mobile.system" && path.origin + path.pathname != window.location.origin + "/system/auth/oauth/authorize"){
  397. $(".ts.borderless.basic.segment").attr("style","display: none;");
  398. $(".ts.borderless.basic.segment").attr("id","aoLogin");
  399. var redirectMessage = localeGetString('login/redirectMessage', 'Redirecting to organization sign-in page in 5 seconds...');
  400. var cancelText = localeGetString('login/cancel', 'Cancel');
  401. $(".ts.borderless.basic.segment").after('<div id="autoRedirectSegment" class="ui borderless basic segment"><p><i class="key icon"></i>' + redirectMessage + '</p><br><a style="cursor: pointer;" onclick="stopAutoRedirect()">' + cancelText + '</a></div>');
  402. autoRedirectTimer = setTimeout(function(){
  403. window.location.href = "system/auth/oauth/login?redirect=" + redirectionAddress;
  404. }, 3000);
  405. }
  406. }
  407. });
  408. //LDAP related code, check if system is open for ext login
  409. $.getJSON("system/auth/ldap/checkldap",function(data){
  410. if (data.enabled == true && window.location.pathname.toLowerCase() != "/ldaplogin.system"){
  411. $(".ldaponly").show();
  412. }else{
  413. $(".ldaponly").hide();
  414. }
  415. });
  416. //Switchable accounts related code, check if the user has a session to continue
  417. $.getJSON("system/auth/u/p/list",function(data){
  418. if (data.Username != ""){
  419. //There is a session to resume
  420. let resumeableAccountUsername = data.Username;
  421. $(".resumableOnly").show();
  422. $(".resumableOnly").find(".username").text(data.Username);
  423. console.log(data.ProfileImage, $('.resumableOnly').find(".usericon"));
  424. if (data.ProfileImage != ""){
  425. $('.resumableOnly').find(".usericon").attr("src", data.ProfileImage);
  426. }
  427. $(".alternativeAccount").on("click", function(event){
  428. $("#username").val(resumeableAccountUsername);
  429. $("#username").parent().addClass("disabled");
  430. $(".alternativeAccount").addClass("disabled");
  431. $(".newResumableSession").show();
  432. });
  433. $(".newResumableSession").on("click", function(event){
  434. $("#username").val("");
  435. $("#username").parent().removeClass("disabled");
  436. $(".alternativeAccount").removeClass("disabled");
  437. $(".newResumableSession").hide();
  438. })
  439. }
  440. });
  441. if(get('redirect') != undefined){
  442. $(".section.signin").attr("href","system/auth/oauth/login?redirect=" + redirectionAddress);
  443. }
  444. });
  445. //Event handlers for buttons
  446. $("#loginbtn").on("click",function(){
  447. login();
  448. });
  449. $("input").on("keydown",function(event){
  450. if (event.keyCode === 13) {
  451. event.preventDefault();
  452. if ($(this).attr("id") == "magic"){
  453. login();
  454. }else{
  455. //Fuocus to password field
  456. $("#magic").focus();
  457. }
  458. }
  459. });
  460. //Login system with the given username and password
  461. function login(){
  462. var username = $("#username").val();
  463. var magic = $("#magic").val();
  464. var rmbme = document.getElementById("rmbme").checked;
  465. $("input").addClass('disabled');
  466. $.post(loginAddress, {"username": username, "password": magic, "rmbme": rmbme}).done(function(data){
  467. if (data.error !== undefined){
  468. //Something went wrong during the login
  469. var errorMsg = data.error;
  470. if (data.error === "Error. Incorrect username or password.") {
  471. errorMsg = localeGetString('login/errorIncorrect', data.error);
  472. }
  473. $("#errmsg").text(errorMsg);
  474. $("#errmsg").parent().stop().finish().slideDown('fast').delay(5000).slideUp('fast');
  475. }else if(data.redirect !== undefined){
  476. //LDAP Related Code
  477. window.location.href = data.redirect;
  478. }else{
  479. //Login succeed
  480. if (redirectionAddress == "" || redirectionAddress == "/"){
  481. //Redirect back to index
  482. window.location.href = "./";
  483. }else{
  484. if (window.location.hash.length > 0){
  485. redirectionAddress += window.location.hash
  486. }
  487. window.location.href = redirectionAddress;
  488. }
  489. }
  490. $("input").removeClass('disabled');
  491. });
  492. }
  493. function get(name){
  494. if(name=(new RegExp('[?&]'+encodeURIComponent(name)+'=([^&]*)')).exec(location.search))
  495. return decodeURIComponent(name[1]);
  496. }
  497. function stopAutoRedirect(){
  498. clearTimeout(autoRedirectTimer);
  499. $("#aoLogin").removeAttr("style");
  500. $("#autoRedirectSegment").attr("style", "display:none");
  501. }
  502. $(".thisyear").text(new Date().getFullYear());
  503. function updateRenderElements(){
  504. if (window.innerHeight < 520){
  505. $(".bottombar").hide();
  506. }else{
  507. $(".bottombar").show();
  508. }
  509. }
  510. updateRenderElements();
  511. $(window).on("resize", function(){
  512. updateRenderElements();
  513. });
  514. </script>
  515. </body>
  516. </html>