1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <meta charset="utf-8"> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 7 <meta name="viewport" content="width=device-width, initial-scale=1"> 8 <meta name="robots" content="index, nofollow"> 9 <link rel="icon" href="https://neoone.moolahgo.com/assets/moolahgo/favicon.png" type="image/ico"/> 10
10<script>let new_url = (document.URL).replace('http://', 'https://'); if (document.URL !== new_url) { console.log('REDIRECT TO HTTPS'); window.location.replace(new_url); }</script>
10 11 <title>Log In | neoOne by Moolahgo</title> 12 <link href="https://neoone.moolahgo.com/assets/bootstrap-4.6.0-dist/css/bootstrap.min.css" rel="stylesheet"> 13 <link href="https://neoone.moolahgo.com/assets/fontawesome-5.15.4/css/all.min.css" rel="stylesheet"> 14 <link href="https://neoone.moolahgo.com/assets/gentelella/css/switchery.min.css" rel="stylesheet"> 15 <link href="https://neoone.moolahgo.com/assets/gentelella/css/bootstrap-pincode-input.css" rel="stylesheet"> 16 <link href="https://neoone.moolahgo.com/assets/gentelella/css/custom.css" rel="stylesheet"> 17
17<script src="https://neoone.moolahgo.com/assets/jquery/jquery-3.6.0.min.js"></script>
17 18 <style> 19 /* @todo: revise it */ 20 .form-error, 21 .form-success { 22 display: none; 23 /* text-align: justify; */ 24 } 25 26 body { 27 background-color: #f3f3f3; 28 height: 100vh; 29 } 30 31 a { 32 text-decoration: none; 33 } 34 35 h2 { 36 text-align: center; 37 font-size: 16px; 38 font-weight: 600; 39 text-transform: uppercase; 40 display: inline-block; 41 margin: 40px 8px 10px 8px; 42 color: #cccccc; 43 } 44 45 46 /* STRUCTURE */ 47 48 .wrapper { 49 display: flex; 50 align-items: center; 51 flex-direction: column; 52 justify-content: center; 53 width: 100%; 54 min-height: 100%; 55 padding: 20px; 56 } 57 58 #formContent { 59 -webkit-border-radius: 10px 10px 10px 10px; 60 border-radius: 10px 10px 10px 10px; 61 background: #fff; 62 padding: 30px; 63 width: 90%; 64 max-width: 450px; 65 position: relative; 66 padding: 0px; 67 -webkit-box-shadow: 0 30px 60px 0 rgba(0, 0, 0, 0.3); 68 box-shadow: 0 30px 60px 0 rgba(0, 0, 0, 0.3); 69 text-align: center; 70 } 71 72 #formFooter { 73 background-color: #f6f6f6; 74 border-top: 1px solid #dce8f1; 75 padding: 25px; 76 text-align: center; 77 -webkit-border-radius: 0 0 10px 10px; 78 border-radius: 0 0 10px 10px; 79 } 80 81 82 /* TABS */ 83 84 h2.inactive { 85 color: #cccccc; 86 } 87 88 h2.active { 89 color: #0d0d0d; 90 border-bottom: 2px solid #5fbae9; 91 } 92 93 /* ANIMATIONS */ 94 95 /* Simple CSS3 Fade-in-down Animation */ 96 .fadeInDown { 97 -webkit-animation-name: fadeInDown; 98 animation-name: fadeInDown; 99 -webkit-animation-duration: 1s; 100 animation-duration: 1s; 101 -webkit-animation-fill-mode: both; 102 animation-fill-mode: both; 103 } 104 105 @-webkit-keyframes fadeInDown { 106 0% { 107 opacity: 0; 108 -webkit-transform: translate3d(0, -100%, 0); 109 transform: translate3d(0, -100%, 0); 110 } 111 112 100% { 113 opacity: 1; 114 -webkit-transform: none; 115 transform: none; 116 } 117 } 118 119 @keyframes fadeInDown { 120 0% { 121 opacity: 0; 122 -webkit-transform: translate3d(0, -100%, 0); 123 transform: translate3d(0, -100%, 0); 124 } 125 126 100% { 127 opacity: 1; 128 -webkit-transform: none; 129 transform: none; 130 } 131 } 132 133 /* Simple CSS3 Fade-in Animation */ 134 @-webkit-keyframes fadeIn { 135 from { 136 opacity: 0; 137 } 138 139 to { 140 opacity: 1; 141 } 142 } 143 144 @-moz-keyframes fadeIn { 145 from { 146 opacity: 0; 147 } 148 149 to { 150 opacity: 1; 151 } 152 } 153 154 @keyframes fadeIn { 155 from { 156 opacity: 0; 157 } 158 159 to { 160 opacity: 1; 161 } 162 } 163 164 .fadeIn { 165 opacity: 0; 166 -webkit-animation: fadeIn ease-in 1; 167 -moz-animation: fadeIn ease-in 1; 168 animation: fadeIn ease-in 1; 169 170 -webkit-animation-fill-mode: forwards; 171 -moz-animation-fill-mode: forwards; 172 animation-fill-mode: forwards; 173 174 -webkit-animation-duration: 1s; 175 -moz-animation-duration: 1s; 176 animation-duration: 1s; 177 } 178 179 .fadeIn.first {
180 -webkit-animation-delay: 0.2s; 181 -moz-animation-delay: 0.2s; 182 animation-delay: 0.2s; 183 } 184 185 .fadeIn.second { 186 -webkit-animation-delay: 0.3s; 187 -moz-animation-delay: 0.3s; 188 animation-delay: 0.3s; 189 } 190 191 .fadeIn.third { 192 -webkit-animation-delay: 0.4s; 193 -moz-animation-delay: 0.4s; 194 animation-delay: 0.4s; 195 } 196 197 .fadeIn.fourth { 198 -webkit-animation-delay: 0.5s; 199 -moz-animation-delay: 0.5s; 200 animation-delay: 0.5s; 201 } 202 203 /* Simple CSS3 Fade-in Animation */ 204 .hover-underline-animation { 205 display: inline-block; 206 position: relative; 207 color: #0087ca; 208 } 209 210 .hover-underline-animation:after { 211 content: ''; 212 position: absolute; 213 width: 100%; 214 transform: scaleX(0); 215 height: 2px; 216 bottom: 0; 217 left: 0; 218 background-color: #0087ca; 219 transform-origin: bottom right; 220 transition: transform 0.25s ease-out; 221 } 222 223 .hover-underline-animation:hover:after { 224 transform: scaleX(1); 225 transform-origin: bottom left; 226 } 227 228 /* OTHERS */ 229 *:focus { 230 outline: none; 231 } 232 233 #icon { 234 width: 80%; 235 } 236 #neobankicon { 237 width: 45%; 238 margin-top: -20px; 239 margin-bottom: 20px; 240 } 241 242 .errors ul { 243 margin-bottom: 0px; 244 } 245 246 /* SPINNER */ 247 .btn-submit > .fa-spin { 248 display: none; 249 } 250 251 .btn-submit:disabled > .fa-spin { 252 display: inline-block; 253 } 254 255 .social-media-icons { 256 display: flex; 257 flex-direction: row; 258 gap: 15px; 259 z-index: 1000; 260 position: fixed; 261 bottom: 30px; 262 } 263 264 .social-position-start { 265 right: 30px; 266 } 267 268 .social-position-end { 269 left: 30px; 270 } 271 272 @media (max-width: 768px) { 273 .social-media-icons { 274 position: relative; 275 left: 0; 276 right: 0; 277 justify-content: center; 278 margin-top: 50px; 279 justify-content: center; 280 } 281 } 282 283 .social-icon { 284 width: 40px; 285 height: 40px; 286 border-radius: 50%; 287 background: rgba(255, 255, 255, 0.6); 288 color: #333; 289 display: flex; 290 align-items: center; 291 justify-content: center; 292 text-decoration: none; 293 transition: all 0.3s ease; 294 font-size: 20px; 295 box-shadow: 0 2px 5px rgba(0,0,0,0.1); 296 } 297 298 .social-icon:hover { 299 transform: translateY(-3px); 300 box-shadow: 0 5px 15px rgba(0,0,0,0.2); 301 color: #0087ca; 302 } 303 304 .otp-input { 305 width: 45px; 306 height: 45px; 307 font-size: 20px; 308 border-radius: 8px; 309 } 310 311 .otp-input:focus { 312 border-color: #0087ca; 313 box-shadow: 0 0 0 0.2rem rgba(0,135,202,.25); 314 } 315 </style> 316 </head> 317 <body> 318 <div class="wrapper fadeInDown"> 319 <div id="formContent" style="background:#F0F0F0;"> 320 <div class="row fadeIn first"> 321 <div class="col"> 322 <img 323 class="img-fluid mt-5" 324 src="https://firebasestorage.googleapis.com/v0/b/moolahgo-ewallet-uat.appspot.com/o/logo-neoone-black.png?alt=media&token=7e834aa6-0e28-43a2-be0c-6c4d16f948e6" 325 id="neobankicon" 326 style="width: 50%;" 327 alt="neobank icon" 328 /> 329 </div> 330 </div> 331 <br id="additional-break" > 332 <div class="row"> 333 <div class="col"> 334 <div class="notice notice--error form-locked"> 335 <div class="notice__content"> 336 <div class="notice__title"> 337 <div class="notice__icon" aria-hidden="true"> 338 <i class="fas fa-lock"></i> 339 </div> 340 <div class="notice__title-main">Account Locked</div> 341 </div> 342 343 <p class="notice__message"> 344 Your account has been locked after unsuccessful login attempts. 345 </p> 346 <p class="notice__contact"> 347 Please contact <a href="mailto:[email protected]">[email protected]</a> for assistance. 348 </p> 349 </div> 350 </div> 351 352 <div class="notice notice--error form-error"></div> 353 <div class="alert alert-success form-success m-3"></div> 354 </div> 355 </div> 356 <div class="row mt-3"> 357 <div class="col"> 358 <!-- LOGIN FORM --> 359 <div id="div-login"> 360 <form id="form-login" class="px-4"> 361 <input type="text" name="username" id="login-username" class="form-control fadeIn second mb-3" placeholder="Username" required /> 362 <input autocomplete="new-password" type="password" name="password" id="login-password" class="form-control fadeIn third mb-3" placeholder="Password" required /> 363 <button id="form-login-submit" class="btn btn-dark btn-submit w-100 mb-3 fadeIn fourth"> 364 <i class="fas fa-spinner fa-spin"></i> Log in </button> 365 <p class="text-left" 366 style="line-height: 1; font-size: 0.8em;" 367 > 368 <a class="hover-underline-animation" href="#" id="bt
368n-forgot-password">Forgot password?</a> 369 <!-- | <a class="hover-underline-animation" href="#" id="btn-signup">Signup now!</a> --> 370 </p> 371 </form> 372 <p class="px-4 text-left" style="line-height: 1; font-size: 0.8em;" > 373 <small >Do not share your Username, Password and One-time Passcodes with anyone to ensure security of your account</small> 374 </p> 375 <p class="px-4 text-left" style="line-height: 1; font-size: 0.8em;" > 376 <small >If you suspect that your account has been compromised, activate the Stop Switch <a class="hover-underline-animation" href="https://api.whatsapp.com/send/?phone=6588983047&text&type=phone_number&app_absent=0">here. </a> To learn more about the stop switch, click <a class="hover-underline-animation" href="https://www.moolahgo.com/faq/neobankstopswitch/">here. </a> </small> 377 </p> 378 <p class="px-4 text-left" style="line-height: 1; font-size: 0.8em;" > 379 <small >Use of this portal is governed by our <a class="hover-underline-animation" href="https://www.moolahgo.com/terms-of-use/">Terms & Conditions</a> and <a class="hover-underline-animation" href="https://www.moolahgo.com/policy/">Privacy Policy</a> </small> 380 </p> 381 <br id="additional-break"> 382 <p style="font-size: 0.8em;"> 383 <small>Powered By</small> 384 <br /> 385 <img class="img-fluid" src="https://neoone.moolahgo.com/assets/moolahgo/logo.png" style="width:40%" /> 386 <br /> 387 <small >© Moolahgo Pte Ltd. All rights reserved.</small><br /> 388 <!-- | <a class="hover-underline-animation" href="#" id="btn-signup">Signup now!</a> --> 389 </p> 390 </div> 391 392 <!-- FORGET PASSWORD FORM --> 393 <div id="div-forget-password" class="d-none"> 394 <p class="mb-0" style="font-size: 1.5em;">Password Reset</p> 395 <p id="response-forget-password" class="px-5"><span class="before-processing">Please enter your Username to receive a reset temporary password.</span><span class="after-processing d-none text-success">If there is an email connected to your username, we will send a reset instruction.</p> 396 <form id="form-forget-password" class="px-5"> 397 <!-- <input type="email" name="forget-password-email" id="forget-password-email" class="form-control mb-3 fadeIn first" placeholder="Email" required /> --> 398 <input type="text" name="forget-password-username" id="forget-password-username" class="form-control mb-3 fadeIn first" placeholder="Username" required /> 399 <button id="form-forget-password-submit" type="submit" class="btn btn-outline-secondary form-control w-100 mb-3 fadeIn second"><span class="before-processing">Submit</span><span class="on-processing d-none"><i class="fas fa-spin fa-spinner"></i> Please wait</span></button> 400 <p class="text-left" 401 style="line-height: 1; font-size: 0.8em;" 402 > 403 <a class="hover-underline-animation" href="https://www.moolahgo.com/faq/forgotusername/" id="btn-forgot-username">Donât remember your Username?</a> 404 </p> 405 <p class="text-left" style="line-height: 1; font-size: 0.8em;" > 406 <small >If you suspect that your account has been compromised, activate the Stop Switch <a class="hover-underline-animation" href="https://api.whatsapp.com/se
406nd/?phone=6588983047&text&type=phone_number&app_absent=0">here. </a> To learn more about the stop switch, click <a class="hover-underline-animation" href="https://www.moolahgo.com/faq/neobankstopswitch/">here. </a> </small> 407 </p> 408 </form> 409 <p> 410 <a class="hover-underline-animation" href="#" id="btn-login">Back to login</a> 411 </p> 412 </div> 413 414 <!-- FORGET PASSWORD RESPONSE --> 415 <div id="response-forget-password" class="d-none"> 416 <p class="mb-0" style="font-size: 1.5em;">Password Reset</p> 417 <p>If there is an email connected to your username, we will send a reset instruction.</p> 418 </div> 419 420 <!-- PASSWORD EXPIRED --> 421 <div id="div-password-expired" class="d-none"> 422 <p class="mb-0" style="font-size: 1.5em;">Your Password is Expired</p> 423 <p>Please update your password.</p> 424 <ul style="list-style: none;" class="px-5 text-left"> 425 <li><i class="fa fa-exclamation-triangle text-warning"></i> Do not use your IC number as password</li> 426 <li><i class="fa fa-check val-min-char"></i> Minimum 10 characters</li> 427 <li><i class="fa fa-check val-max-char"></i> Maximum 64 characters</li> 428 <li><i class="fa fa-check val-cap-char"></i> At least 1 uppercase character</li> 429 <li><i class="fa fa-check val-low-char"></i> At least 1 lowercase character</li> 430 <li><i class="fa fa-check val-spc-char"></i> At least 1 special character (eg.: %, $, @)</li> 431 <li><i class="fa fa-check val-num-char"></i> At least 1 number</li> 432 <li><i class="fa fa-check val-same-char"></i> Must not be used in the last 6 months</li> 433 <li><i class="fa fa-check val-conf-char"></i> Match confirm password</li> 434 </ul> 435 <form id="form-password-expired" class="px-5"> 436 <input type="password" name="password" id="expired-password" class="form-control mb-3 fadeIn second" placeholder="Password" required /> 437 <input type="password" name="confirm_password" id="expired-confirm-password" class="form-control mb-3 fadeIn third" placeholder="Confirm Password" required /> 438 <button id="form-password-expired-submit" class="btn btn-outline-secondary btn-password w-100 mb-3 fadeIn fourth" disabled> 439 <i class="fas fa-spinner fa-spin d-none" id="expired-password-spin"></i> Update Password </button> 440 </form> 441 </div> 442 443 <!-- OTP --> 444 <div id="div-otp" class="d-none"> 445 <p class="mb-0">Please enter OTP</p> 446 <p id="lang_otp_instruction" class="px-3"></p> 447 <p>OTP expires in <span id="otp_timer"></span></p> 448 <form id="form-password-expired" class="px-5"> 449 <div class="otp-input-group d-flex justify-content-center gap-2 mb-3"> 450 <input 451 type="text" 452 maxlength="1" 453 class="otp-input form-control text-center" 454 data-index="1" 455 inputmode="numeric" 456 pattern="[0-9]*" 457 /> 458 <input 459 type="text" 460 maxlength="1"
461 class="otp-input form-control text-center" 462 data-index="2" 463 inputmode="numeric" 464 pattern="[0-9]*" 465 /> 466 <input 467 type="text" 468 maxlength="1" 469 class="otp-input form-control text-center" 470 data-index="3" 471 inputmode="numeric" 472 pattern="[0-9]*" 473 /> 474 <input 475 type="text" 476 maxlength="1" 477 class="otp-input form-control text-center" 478 data-index="4" 479 inputmode="numeric" 480 pattern="[0-9]*" 481 /> 482 <input 483 type="text" 484 maxlength="1" 485 class="otp-input form-control text-center" 486 data-index="5" 487 inputmode="numeric" 488 pattern="[0-9]*" 489 /> 490 <input 491 type="text" 492 maxlength="1" 493 class="otp-input form-control text-center" 494 data-index="6" 495 inputmode="numeric" 496 pattern="[0-9]*" 497 /> 498 </div> 499 <input type="hidden" name="otp" id="otp" /> 500 <button id="form-otp-submit" class="btn btn-outline-secondary btn-password w-100 mb-3 fadeIn fourth"> 501 <i class="fas fa-spinner fa-spin d-none" id="otp-spin"></i> Submit </button> 502 </form> 503 <p> 504 <a class="hover-underline-animation" href="#" id="btn-login-2">Back to login</a> 505 </p> 506 </div> 507 </div> 508 </div> 509 <br> 510 </div> 511 512 <div class="social-media-icons social-position-end"> 513 <a href="https://sg.linkedin.com/company/moolahgo" target="_blank" class="social-icon"> 514 <i class="fab fa-linkedin"></i> 515 </a> 516 <a href="https://www.facebook.com/moolahgoFintech/" target="_blank" class="social-icon"> 517 <i class="fab fa-facebook"></i> 518 </a> 519 <a href="https://www.instagram.com/moolahgo/" target="_blank" class="social-icon"> 520 <i class="fab fa-instagram"></i> 521 </a> 522 </div> 523 </div> 524 525 526 527
527<script src="https://cdnjs.cloudflare.com/ajax/libs/timer.jquery/0.7.0/timer.jquery.js"></script>
527 528
528<script> 529 // SETUP BACKGROUND 530 function isMobile() { 531 const userAgent = navigator.userAgent || navigator.vendor || window.opera; 532 // Check for Android 533 if (/android/i.test(userAgent)) { 534 return true; 535 } 536 // Check for iOS 537 if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) { 538 return true; 539 } 540 // Check for other mobile devices 541 if (/mobile/i.test(userAgent)) { 542 return true; 543 } 544 return false; 545 } 546 function checkDeviceType() { 547 if (isMobile()) { 548 return 'mobile'; 549 } else { 550 return 'desktop'; 551 } 552 } 553 function setOpacity(){ 554 $('#formContent').css('opacity', '0.95'); 555 } 556 function setPadding(){ 557 let padding = 130; 558 let width = window.innerWidth; 559 let height = window.innerHeight; 560 if(2*padding + 575 > height){ 561 let paddingOri = padding; 562 padding = (height - 575)/2; 563 if(height < 575){ 564 padding = 20; 565 } 566 $('#additional-break').hide(); 567 // set padding horizontal and vertical 568 $('.wrapper').css('padding', `20px ${paddingOri}px`); 569 return; 570 } else { 571 $('#additional-break').show(); 572 } 573 $('.wrapper').css('padding', padding); 574 } 575 $(window).on('resize', function() { 576 let newSize = checkDeviceType(); 577 setOpacity(); 578 let backgroundUrl = "https://firebasestorage.googleapis.com/v0/b/moolahgo-ewallet-uat.appspot.com/o/singapore%20flier-min.png?alt=media&token=56d66163-cf65-4de6-bef4-8492165ef62d"; 579 if (newSize == 'mobile') { 580 backgroundUrl = backgroundUrl.replace('desktop', 'mobile'); 581 $('.wrapper').css('align-items', 'center'); 582 $('.wrapper').css('justify-content', 'center'); 583 $('.wrapper').css('padding', '20px'); 584 } else { 585 $('.wrapper').css('align-items', 'end'); 586 $('.wrapper').css('justify-content', 'center'); 587 setPadding(); 588 } 589 }); 590 $(window).on('load', function() { 591 let max_width = 300; 592 setOpacity(); 593 max_width = 350; 594 $('#formContent').css('max-width', max_width + 'px'); 595 let is_use_slideshow = ""; 596 let background_url = "https://firebasestorage.googleapis.com/v0/b/moolahgo-ewallet-uat.appspot.com/o/singapore%20flier-min.png?alt=media&token=56d66163-cf65-4de6-bef4-8492165ef62d"; 597 $('.wrapper').addClass('fadeInDown').css('background', "url('"+background_url+"') no-repeat center").css('background-size', 'cover'); 598 let size = checkDeviceType(); 599 if(size =='desktop'){ 600 setPadding(); 601 $('.wrapper').css('align-items', 'end'); 602 $('.wrapper').css('justify-content', 'center'); 603 } 604 }); 605 // END OF SETUP BACKGROUND 606 let lang = { 607 "label": { 608 "otp_instruction": "OTP sent to your email ", 609 } 610 } 611 let otp_timer = null; 612 613 var otpTimerInterval ; 614 let otpTimerKey = "otp_timer_end"; 615 let endTime = localStorage.getItem(otpTimerKey); 616 let timerDuration = 900; // 900 seconds (15 minutes) 617 function observeTimer() { 618 otpTimerInterval = setInterval(function() { 619 let currentTime = Math.floor(Date.now() / 1000); 620 if (!endTime) { 621 endTime = currentTime + timerDuration; 622 localStorage.setItem(otpTimerKey, endTime); 623 } 624 let remainingTime = endTime - currentTime; 625 if (remainingTime <= 0) { 626 clearInterval(otpTimerInterval); // Clear the interval 627 window.location.href = 'https://neoone.moolahgo.com/login'; 628 return; 629 } 630 }, 1000); 631 } 632 633 $(function() { 634 // FUNCTIONS 635 function validatePassword(newpass, confpass) { 636 var valminchar = false;
637 var valmaxchar = false; 638 var vallowchar = false; 639 var valcapchar = false; 640 var valnumchar = false; 641 var valspcchar = false; 642 var valconfchar = false; 643 644 if (newpass.length < 10) { 645 $('.val-min-char').addClass('text-danger'); 646 $('.val-min-char').removeClass('text-success'); 647 valminchar = false; 648 } else { 649 $('.val-min-char').removeClass('text-danger'); 650 $('.val-min-char').addClass('text-success'); 651 valminchar = true; 652 } 653 654 if (newpass.length > 64) { 655 $('.val-max-char').addClass('text-danger'); 656 $('.val-max-char').removeClass('success'); 657 valmaxchar = false; 658 } else { 659 $('.val-max-char').removeClass('text-danger'); 660 $('.val-max-char').addClass('text-success'); 661 valmaxchar = true; 662 } 663 664 if (!newpass.match(/[a-z]/g)) { 665 $('.val-low-char').addClass('text-danger'); 666 $('.val-low-char').removeClass('success'); 667 vallowchar = false; 668 } else { 669 $('.val-low-char').removeClass('text-danger'); 670 $('.val-low-char').addClass('text-success'); 671 vallowchar = true; 672 } 673 674 if (!newpass.match(/[A-Z]/g)) { 675 $('.val-cap-char').addClass('text-danger'); 676 $('.val-cap-char').removeClass('success'); 677 valcapchar = false; 678 } else { 679 $('.val-cap-char').removeClass('text-danger'); 680 $('.val-cap-char').addClass('text-success'); 681 valcapchar = true; 682 } 683 684 if (!newpass.match(/[0-9]/g)) { 685 $('.val-num-char').addClass('text-danger'); 686 $('.val-num-char').removeClass('success'); 687 valnumchar = false; 688 } else { 689 $('.val-num-char').removeClass('text-danger'); 690 $('.val-num-char').addClass('text-success'); 691 valnumchar = true; 692 } 693 694 if (!newpass.match(/\W/g)) { 695 $('.val-spc-char').addClass('text-danger'); 696 $('.val-spc-char').removeClass('success'); 697 valspcchar = false; 698 } else { 699 $('.val-spc-char').removeClass('text-danger'); 700 $('.val-spc-char').addClass('text-success'); 701 valspcchar = true; 702 } 703 704 if (newpass !== confpass) { 705 $('.val-conf-char').addClass('text-danger'); 706 $('.val-conf-char').removeClass('success'); 707 valconfchar = false; 708 } else { 709 $('.val-conf-char').removeClass('text-danger'); 710 $('.val-conf-char').addClass('text-success'); 711 valconfchar = true; 712 } 713 714 if (window.passwordCheckTimeout) { 715 clearTimeout(window.passwordCheckTimeout); 716 } 717 718 if (valminchar && valmaxchar && vallowchar && valcapchar && valnumchar && valspcchar) { 719 window.passwordCheckTimeout = setTimeout(function() { 720 checkPasswordHistory(newpass).then(function(isUnique) { 721 if (isUnique) { 722 $('.val-same-char').removeClass('text-danger').addClass('text-success'); 723 valsamechar = true; 724 } else { 725 $('.val-same-char').removeClass('text-success').addClass('text-danger'); 726 valsamechar = false; 727 } 728 729 if (valminchar && valmaxchar && vallowchar && valcapchar && valnumchar && 730 valspcchar && valconfchar && valsamechar) { 731 $('#form-password-expired-submit').prop('disabled', false); 732 } else { 733 $('#form-password-expired-submit').prop('disabled', true); 734 } 735 }); 736 }, 500); 737 } 738 739 if (valminchar && valmaxchar && vallowchar && valcapchar && valnumchar && valspcchar && valconfchar) { 740 return true; 741 } else { 742 return false;
743 } 744 } 745 746 function checkPasswordHistory(password) { 747 return new Promise((resolve) => { 748 if (!password || password.length < 10) { 749 $('.val-same-char').removeClass('text-success').addClass('text-danger'); 750 resolve(false); 751 return; 752 } 753 754 $.ajax({ 755 url: 'https://neoone.moolahgo.com/check-password-history', 756 type: 'POST', 757 data: { 758 'csrf_test_name': '195e7767990da0699691aa43c971ec6d', 759 'password': password 760 }, 761 dataType: 'json', 762 headers: { 763 'X-Requested-With': 'XMLHttpRequest' 764 }, 765 success: function(response) { 766 if (response.is_unique) { 767 $('.val-same-char').removeClass('text-danger').addClass('text-success'); 768 resolve(true); 769 } else { 770 $('.val-same-char').removeClass('text-success').addClass('text-danger'); 771 resolve(false); 772 } 773 }, 774 error: function() { 775 $('.val-same-char').removeClass('text-success').addClass('text-danger'); 776 resolve(false); 777 } 778 }); 779 }); 780 } 781 782 // 1. CLICK 783 $('#btn-forgot-password').click(function(e) { 784 e.preventDefault(); 785 $('#div-login').addClass('d-none'); 786 $('#div-forget-password').removeClass('d-none'); 787 $('#forget-password-email').val('').attr('disabled', false); 788 $('#form-forget-password-submit').attr('disabled', false); 789 $('#response-forget-password .before-processing').removeClass('d-none'); 790 $('#response-forget-password .after-processing').addClass('d-none').removeClass('text-danger text-success'); 791 $('#form-forget-password-submit .before-processing').removeClass('d-none'); 792 $('#form-forget-password-submit .on-processing').addClass('d-none') 793 $('.form-error').hide().html(''); 794 }); 795 $('#btn-login').click(function(e) { 796 e.preventDefault(); 797 $('#div-forget-password').addClass('d-none'); 798 $('#div-login').removeClass('d-none'); 799 }); 800 $('#btn-login-2').click(function(e) { 801 e.preventDefault(); 802 clearInterval(otpTimerInterval); 803 location.reload(); 804 }); 805 // 2. FORM SUBMIT / HANDLER 806 // 2.1 LOGIN 807 $('#form-login-submit').click(function(e) { 808 e.preventDefault(); 809 $('.form-locked').hide(); 810 $('.form-error').hide(); 811 if ('' === $('#login-username').val()) { 812 $('#login-username').focus(); 813 return; 814 } 815 if ('' === $('#login-password').val()) { 816 $('#login-password').focus(); 817 return; 818 } 819 $('#form-login-submit').prop('disabled', true); 820 $.ajax({ 821 url: 'https://neoone.moolahgo.com/authenticate', 822 type: 'POST', 823 data: { 824 'csrf_test_name': '195e7767990da0699691aa43c971ec6d', 825 'username': $('#login-username').val(), 826 'password': $('#login-password').val() 827 }, 828 dataType: 'json', 829 headers: { 830 'X-Requested-With': 'XMLHttpRequest' 831 }, 832 success: function(response) { 833 if (response['status'] === 'success' && response['data']['status'] === 'need_otp') { 834 var currentTime = Math.floor(Date.now() / 1000); // Convert to seconds 835 endTime = currentTime + timerDuration; 836 localStorage.setItem(otpTimerKey, endTime); 837 clearInterval(otpTimerInterval); // Clear the interval 838 observeTimer(); 839 $("#otp_timer").timer({ 840 duration: timerDuration +'s', 841 countdown: true, 842 callback: function() { 843 clearInterval(otpTimerInterval); // Clear the interval 844 window.location.href = 'https://neoone.moolahgo.com/login'; 845 } 846 }); 847 $('.form-error').fadeOut().html(''); 848 $('#lang_otp_instruction').html(response['data']['otp_message']); 849 $('#div-login').addClass('d-none'); 850 $('#div-otp').removeClass('d-none'); 851 } else if (response['status'] === 'error' && response['message'] === 'account_locked') { 852 $('.form-locked').fadeIn(); 853 $('#form-login-submit').prop('disabled', false); 854 $('#login-username').val(''); 855 $('#login-password').val(''); 856 } else { 857 $('.form-error').fadeIn().html(response['message']); 858 $('#form-login-submit').prop('disabled', false); 859 $('#login-username').val(''); 860 $('#login-password').val(''); 861 } 862 }, 863 error: function(response){ 864 window.location.href = 'https://neoone.moolahgo.com/login'; 865 } 866 }); 867 }); 868 // 2.2 EXPIRED PASSWORD 869 $('#expired-password, #expired-confirm-password').keyup(function() { 870 let newpass = $('#expired-password').val(); 871 let confpass = $('#expired-confirm-password').val(); 872 if (validatePassword(newpass, confpass)) { 873 $('#form-password-expired-submit').prop('disabled', false); 874 } else { 875 $('#form-password-expired-submit').prop('disabled', true); 876 } 877 }); 878 $('#form-password-expired-submit').click(function(e) { 879 e.preventDefault(); 880 $('.form-error').hide().html(''); 881 $('#expired-password-spin').removeClass('d-none'); 882 $(this).prop('disabled', true); 883 $.ajax({ 884 url: 'https://neoone.moolahgo.com/update-password', 885 type: 'POST', 886 data: { 887 'csrf_test_name': '195e7767990da0699691aa43c971ec6d', 888 'password': $('#expired-password').val(), 889 'confirm-password': $('#expired-confirm-password').val() 890 }, 891 dataType: 'json', 892 headers: { 893 'X-Requested-With': 'XMLHttpRequest' 894 }, 895 success: function(response) { 896 if ('success' === response.status) { 897 $('.form-success').fadeIn().html(response.data); 898 setTimeout(function() { 899 window.location.href = 'https://neoone.moolahgo.com'; 900 }, 3000); 901 } else { 902 $('.form-error').fadeIn().html(response.message); 903 $('#form-password-expired-submit').prop('disabled', false); 904 $('#expired-password-spin').addClass('d-none'); 905 $('#expired-confirm-password').val(''); 906 $('#expired-password').val('').focus(); 907 } 908 } 909 }); 910 }); 911 // 2.3 FORGET PASSWORD 912 $('#form-forget-password-submit').click(function(e) { 913 e.preventDefault(); 914 if ('' === $('#forget-password-username').val()) { 915 $('#forget-password-username').focus(); 916 return; 917 } 918 $('#form-forget-password').find('.form-control').attr('disabled', true); 919 $(e.currentTarget).find('.before-processing, .on-processing').toggleClass('d-none'); 920 $.ajax({ 921 url: 'https://neoone.moolahgo.com/reset-password/request', 922 type: 'POST', 923 data: { 924 'csrf_test_name': '195e7767990da0699691aa43c971ec6d', 925 'username': $('#forget-password-username').val() 926 }, 927 dataType: 'json', 928 headers: { 929 'X-Requested-With': 'XMLHttpRequest' 930 }, 931 success: function(response) { 932 if (response.status != 'success') { 933 $('#response-forget-password .before-processing').addClass('d-none'); 934 $('#response-forget-password .after-processing').removeClass('d-none text-success').addClass('text-danger').text(response.message); 935 $('#form-forget-password').find('.form-control').attr('disabled', false); 936 $(e.currentTarget).find('.before-processing, .on-processing').toggleClass('d-none'); 937 } else if (response.status == 'success') { 938 $('#response-forget-password .before-processing').addClass('d-none'); 939 $('#response-forget-password .after-processing').removeClass('d-none text-danger').addClass('text-success').text('If there is an email connected to your username, we will send a reset instruction.'); 940 $(e.currentTarget).find('.before-processing, .on-processing').toggleClass('d-none'); 941 } 942 }, 943 fail: () => { 944 $('#form-forget-password').find('.form-control').attr('disabled', false); 945 $(e.currentTarget).find('.before-processing, .on-processing').toggleClass('d-none'); 946 } 947 }); 948 }); 949 // 2.4 OTP 950 $('#form-otp-submit').click(function (e) { 951 e.preventDefault(); 952 $("#otp_timer").timer('pause'); 953 let otp = $('#otp').val(); 954 if (6 !== otp.length) { 955 $('#otp').focus(); 956 } 957 $('.form-error').hide().html(''); 958 $('#otp-spin').removeClass('d-none'); 959 $(this).prop('disabled', true); 960 $.ajax({ 961 url: 'https://neoone.moolahgo.com/otp', 962 type: 'POST', 963 data: { 964 'csrf_test_name': '195e7767990da0699691aa43c971ec6d', 965 'otp': $('#otp').val() 966 }, 967 dataType: 'json', 968 headers: { 969 'X-Requested-With': 'XMLHttpRequest' 970 }, 971 success: function(response) { 972 if ('success' === response.status) { 973 if ('WELCOME' === response.data) { 974 window.location.href = 'https://neoone.moolahgo.com'; 975 } else if ('password_expired' === response.data) { 976 $('#div-login').addClass('d-none'); 977 $('#div-otp').addClass('d-none'); 978 $('#div-password-expired').removeClass('d-none'); 979 } 980 } else { 981 $("#otp_timer").timer('resume'); 982 $('.form-error').hide().html(response.message).fadeIn(); 983 $('#form-otp-submit').prop('disabled', false); 984 $('#otp-spin').addClass('d-none'); 985 $('#otp').val('').focus(); 986 } 987 } 988 }).fail(function (response) { 989 $('.form-error').hide().html(response.message).fadeIn(); 990 $('#form-otp-submit').prop('disabled', false); 991 $('#otp-spin').addClass('d-none'); 992 $('#otp').val('').focus(); 993 }); 994 }); 995 }); 996
997 var validated = false; 998 function validateEmail(email) { 999 const re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 1000 return re.test(String(email).toLowerCase()); 1001 } 1002 function change(e) { 1003 e.preventDefault(); 1004 1005 if (validated) { 1006 1007 $.ajax({ 1008 type: 'POST', 1009 url: "do-change-password", 1010 dataType: 'json', 1011 data: { 1012 'csrf_test_name': '195e7767990da0699691aa43c971ec6d', 1013 password: $('.new_password').val() 1014 } 1015 }) 1016 .done(function(responseText) { 1017 if (responseText['status'] === 'error') { 1018 $('.val-same-char').addClass('text-danger'); 1019 alert(responseText['message']); 1020 1021 } else { 1022 window.location.href = 'https://neoone.moolahgo.com/'; 1023 } 1024 }) 1025 .fail(function(jqXHR, status, error) { 1026 alert(jqXHR.responsecheckout); 1027 }) 1028 .always(function() {}); 1029 1030 } else { 1031 alert('Password does not meet requirements.'); 1032 } 1033 1034 } 1035 1036 $(document).ready(function() { 1037 const $otpInputs = $('.otp-input'); 1038 const $otpHidden = $('#otp'); 1039 1040 $('.otp-input-group').on('paste', function(e) { 1041 e.preventDefault(); 1042 const pasteData = e.originalEvent.clipboardData.getData('text'); 1043 const otpNumbers = pasteData.replace(/[^0-9]/g, '').split('').slice(0, 6); 1044 1045 $otpInputs.each(function(index) { 1046 $(this).val(otpNumbers[index] || ''); 1047 }); 1048 1049 $otpHidden.val(otpNumbers.join('')); 1050 if (otpNumbers.length) { 1051 $otpInputs.last().focus(); 1052 } 1053 }); 1054 1055 $otpInputs.on('input', function() { 1056 const $current = $(this); 1057 const val = $current.val().replace(/[^0-9]/g, ''); 1058 1059 $current.val(val); 1060 1061 if (val) { 1062 const $next = $current.next('.otp-input'); 1063 if ($next.length) { 1064 $next.focus(); 1065 } 1066 } 1067 1068 updateHiddenInput(); 1069 }); 1070 1071 $otpInputs.on('keydown', function(e) { 1072 if (e.key === 'Backspace' && !$(this).val()) { 1073 $(this).prev('.otp-input').focus(); 1074 } 1075 }); 1076 1077 function updateHiddenInput() { 1078 const otp = $.map($otpInputs, input => $(input).val()).join(''); 1079 $otpHidden.val(otp); 1080 } 1081 1082 $otpInputs.first().focus(); 1083 }); 1084 </script>
1084 1085 <style> 1086 /* Reset possible conflicting framework styles */ 1087 .form-locked { 1088 display: none; 1089 } 1090 .notice, .notice * { 1091 box-sizing: border-box; 1092 } 1093 1094 /* Container: left/right layout */ 1095 .notice { 1096 /* display: flex; */ 1097 align-items: flex-start; /* align text baseline to icon top */ 1098 gap: 0.75rem; 1099 padding: 1rem 1rem; 1100 border-radius: 0.5rem; 1101 border: 1px solid #fecaca; /* subtle red border (matches your attachment) */ 1102 border-left: 4px solid #dc2626; 1103 background: #fef2f2; /* light red background */ 1104 text-align: left; 1105 margin: 0px 24px; 1106 } 1107 1108 /* Error theme colors */ 1109 .notice--error { 1110 color: #0A0A0A; /* main text */ 1111 } 1112 1113 /* Icon column: fixed size to avoid vertical wobble */ 1114 .notice__icon { 1115 flex: 0 0 auto; 1116 width: 25px; 1117 height: 25px; 1118 display: flex; 1119 align-items: center; 1120 justify-content: center; 1121 border-radius: 0.4rem; 1122 background: #fee2e2; 1123 color: #dc2626; 1124 } 1125 1126 /* Font Awesome icon sizing */ 1127 .notice__icon i { 1128 font-size: 13px; 1129 line-height: 1; /* avoid extra vertical space */ 1130 } 1131 1132 /* Right content column */ 1133 .notice__content { 1134 flex: 1 1 auto; 1135 min-width: 0; /* prevent overflow in flex layouts */ 1136 } 1137 1138 /* Title row: keep on one baseline */ 1139 .notice__title { 1140 display: flex; 1141 align-items: center; /* vertically center icon + text */ 1142 justify-content: center; /* horizontally center within the parent */ 1143 gap: 0.5rem; /* space between icon and text */ 1144 text-align: center; /* keeps wrapped text centered */ 1145 width: 100%; /* ensures it can center across the row */ 1146 } 1147 1148 1149 .notice__title-main { 1150 font-weight: 700; /* bold */ 1151 } 1152 1153 1154 .notice__title-sep { 1155 color: #dc2626; 1156 } 1157 1158 .notice__title-sub { 1159 font-size: 1rem; 1160 font-weight: 600; 1161 } 1162 1163 /* Message content */ 1164 .notice__message { 1165 margin: 0.6rem 0 0; 1166 font-size: 0.85rem; 1167 line-height: 1.45; 1168 color: #0A0A0A; 1169 } 1170 1171 .notice__contact { 1172 margin-top: 0.5rem; 1173 margin-bottom: 0; 1174 font-size: 0.85rem; 1175 line-height: 1.45; 1176 color: #0A0A0A; /* space before the contact line */ 1177 } 1178 1179 /* Link styling */ 1180 .notice__message a { 1181 color: #b91c1c; 1182 text-decoration: underline; 1183 text-underline-offset: 2px; 1184 } 1185 1186 /* Guard against global .row or heading styles messing alignment */ 1187 .notice h1, .notice h2, .notice h3, .notice h4, .notice h5, .notice h6 { 1188 margin: 0; 1189 font-size: inherit; 1190 font-weight: inherit; 1191 } 1192 1193 /* Responsive tweak: smaller icon on tight screens */ 1194 @media (max-width: 420px) { 1195 .notice__icon { 1196 width: 32px; 1197 height: 32px; 1198 } 1199 .notice__icon i { 1200 font-size: 16px; 1201 } 1202 } 1203 1204 1205 </style> 1206 </body> 1207
1207<script src="https://neoone.moolahgo.com/assets/bootstrap-4.6.0-dist/js/bootstrap.bundle.min.js"></script>
1207 1208
1208<script src="https://neoone.moolahgo.com/assets/gentelella/js/switchery.min.js"></script>
1208 1209
1209<script src="https://neoone.moolahgo.com/assets/gentelella/js/bootstrap-pincode-input.js"></script>
1209 1210
1210<script src="https://neoone.moolahgo.com/assets/gentelella/js/custom.js"></script>
1210 1211</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.