PageSourceSearch

https://neoone.moolahgo.com/login

html moolahgo.com collected 2026-09-24 10:52:55 UTC 54,650 bytes, 1,211 lines download raw bytes

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.