1 2<!DOCTYPE html> 3<html lang="en"> 4<head> 5 <meta charset="utf-8" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>Student Login (Ddugu)</title> 8 <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700;800&family=Playfair+Display:wght@600;700;800&display=swap" rel="stylesheet"> 9 <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/tailwind.min.css" rel="stylesheet"> 10 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/toastify-js/1.12.0/toastify.min.css" /> 11 12 <style> 13 :root { 14 --navy: #0f172a; 15 --navy-2: #1e293b; 16 --gold: #c5a059; 17 --indigo: #4B0082; 18 --blue: #2563eb; 19 --muted: #64748b; 20 --glass: rgba(255, 255, 255, 0.98); 21 } 22 23 * { box-sizing: border-box; margin: 0; padding: 0; } 24 25 html, body { height: 100%; } 26 27 body { 28 font-family: 'Montserrat', sans-serif; 29 background: #0b1220; 30 display: flex; 31 align-items: center; 32 justify-content: center; 33 padding: 20px; 34 min-height: 100vh; 35 overflow-x: hidden; 36 } 37 38 /* Ambient animated background */ 39 body::before { 40 content: ""; 41 position: fixed; 42 inset: -20%; 43 background: 44 radial-gradient(circle at 15% 20%, rgba(75, 0, 130, .55), transparent 55%), 45 radial-gradient(circle at 85% 80%, rgba(37, 99, 235, .45), transparent 55%), 46 radial-gradient(circle at 50% 50%, rgba(197, 160, 89, .18), transparent 60%); 47 filter: blur(30px); 48 animation: ambient 18s ease-in-out infinite alternate; 49 z-index: 0; 50 } 51 52 @keyframes ambient { 53 0% { transform: translate(0, 0) scale(1); } 54 100% { transform: translate(-4%, 3%) scale(1.08); } 55 } 56 57 /* ===================== MAIN CARD ===================== */ 58 .login-shell { 59 position: relative; 60 z-index: 2; 61 display: grid; 62 grid-template-columns: 1fr 1fr; 63 width: 100%; 64 max-width: 880px; 65 min-height: 540px; 66 border-radius: 22px; 67 overflow: hidden; 68 box-shadow: 69 0 30px 80px rgba(0,0,0,.55), 70 0 0 0 1px rgba(255,255,255,.06); 71 background: var(--glass); 72 animation: shellIn .7s cubic-bezier(.2,.8,.2,1) both; 73 } 74 75 @keyframes shellIn { 76 from { opacity: 0; transform: translateY(20px) scale(.98); } 77 to { opacity: 1; transform: translateY(0) scale(1); } 78 } 79 80 /* ===================== LEFT PANEL ===================== */ 81 .brand-panel { 82 position: relative; 83 padding: 40px 36px; 84 color: #fff; 85 background: 86 linear-gradient(150deg, rgba(15,23,42,.96) 0%, rgba(30,27,75,.94) 45%, rgba(75,0,130,.92) 100%), 87 url('/Images/cover.jpg') center / cover no-repeat; 88 display: flex; 89 flex-direction: column; 90 justify-content: space-between; 91 overflow: hidden; 92 } 93 94 .brand-panel::before { 95 content: ""; 96 position: absolute; 97 width: 320px; 98 height: 320px; 99 border-radius: 50%; 100 background: radial-gradient(circle, rgba(197,160,89,.28), transparent 70%); 101 top: -110px; 102 right: -120px; 103 pointer-events: none; 104 } 105 106 .brand-panel::after { 107 content: ""; 108 position: absolute; 109 width: 260px; 110 height: 260px; 111 border-radius: 50%; 112 background: radial-gradient(circle, rgba(37,99,235,.32), transparent 70%); 113 bottom: -110px; 114 left: -100px; 115 pointer-events: none; 116 } 117 118 .brand-top { 119 position: relative; 120 z-index: 2; 121 display: flex; 122 align-items: center; 123 gap: 12px; 124 } 125 126 .brand-logo { 127 width: 54px; 128 height: 54px; 129 border-radius: 14px; 130 border: 2px solid rgba(255,255,255,.85); 131 box-shadow: 0 10px 24px rgba(0,0,0,.4); 132 object-fit: cover; 133 background: #fff; 134 } 135 136 .brand-name { 137 font-family: 'Playfair Display', serif; 138 font-size: 13px; 139 letter-spacing: 1.8px; 140 text-transform: uppercase; 141 font-weight: 700; 142 color: rgba(255,255,255,.92); 143 line-height: 1.3; 144 } 145 146 .brand-name span { 147 display: block; 148 font-size: 10px; 149 letter-spacing: 2.6px; 150 font-weight: 500; 151 color: var(--gold); 152 margin-top: 3px; 153 } 154 155 .brand-center { 156 position: relative; 157 z-index: 2; 158 } 159 160 .brand-heading { 161 font-family: 'Playfair Display', serif; 162 font-size: 42px; 163 line-height: 1.05; 164 font-weight: 800; 165 letter-spacing: -.5px; 166 margin-bottom: 14px; 167 } 168 169 .brand-heading span { 170 background: linear-gradient(135deg, #facc6b 0%, var(--gold) 45%, #fde68a 100%); 171 -webkit-background-clip: text; 172 background-clip: text; 173 -webkit-text-fill-color: transparent; 174 display: inline-block; 175 } 176 177 .brand-sub { 178 font-size: 13.5px; 179 font-weight: 400; 180 line-height: 1.65; 181 color: rgba(255,255,255,.72); 182 max-width: 320px; 183 } 184 185 .brand-features { 186 position: relative; 187 z-index: 2; 188 list-style: none; 189 margin-top: 22px; 190 display: flex; 191 flex-direction: column; 192 gap: 10px; 193 } 194 195 .brand-features li { 196 display: flex; 197 align-items: center; 198 gap: 10px; 199 font-size: 12px; 200 color: rgba(255,255,255,.78); 201 font-weight: 500; 202 } 203 204 .brand-features li::before { 205 content: ""; 206 flex-shrink: 0;
207 width: 20px; 208 height: 20px; 209 border-radius: 50%; 210 background: rgba(197,160,89,.15); 211 border: 1px solid rgba(197,160,89,.5); 212 background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23c5a059' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>"); 213 background-size: 11px; 214 background-position: center; 215 background-repeat: no-repeat; 216 } 217 218 .brand-footer { 219 position: relative; 220 z-index: 2; 221 font-size: 10px; 222 letter-spacing: 1.5px; 223 text-transform: uppercase; 224 color: rgba(255,255,255,.4); 225 font-weight: 500; 226 } 227 228 /* ===================== RIGHT PANEL ===================== */ 229 .form-panel { 230 position: relative; 231 padding: 40px 40px; 232 display: flex; 233 flex-direction: column; 234 justify-content: center; 235 background: #ffffff; 236 } 237 238 .form-panel-inner { 239 width: 100%; 240 max-width: 340px; 241 margin: 0 auto; 242 } 243 244 .form-eyebrow { 245 font-size: 10.5px; 246 font-weight: 700; 247 letter-spacing: 2.2px; 248 text-transform: uppercase; 249 color: var(--indigo); 250 margin-bottom: 8px; 251 display: flex; 252 align-items: center; 253 gap: 8px; 254 } 255 256 .form-eyebrow::after { 257 content: ""; 258 flex: 1; 259 height: 1px; 260 background: linear-gradient(90deg, rgba(75,0,130,.35), transparent); 261 } 262 263 .form-heading { 264 font-family: 'Playfair Display', serif; 265 font-size: 26px; 266 font-weight: 700; 267 color: var(--navy); 268 line-height: 1.15; 269 margin-bottom: 5px; 270 } 271 272 .form-desc { 273 font-size: 12.5px; 274 color: var(--muted); 275 margin-bottom: 22px; 276 line-height: 1.5; 277 } 278 279 .form-group { margin-bottom: 14px; } 280 281 label { 282 display: block; 283 font-size: 10px; 284 font-weight: 700; 285 letter-spacing: 1.1px; 286 text-transform: uppercase; 287 color: var(--navy); 288 margin-bottom: 6px; 289 } 290 291 .input { 292 width: 100%; 293 padding: 11px 14px; 294 border-radius: 11px; 295 border: 1.5px solid #e2e8f0; 296 background: #f8fafc; 297 font-size: 13.5px; 298 color: var(--navy); 299 font-family: 'Montserrat', sans-serif; 300 transition: all .25s ease; 301 } 302 303 .input::placeholder { color: #94a3b8; } 304 305 .input:focus { 306 outline: none; 307 background: #fff; 308 border-color: var(--indigo); 309 box-shadow: 0 0 0 4px rgba(75, 0, 130, .12); 310 } 311 312 /* ================= CAPTCHA ================= */ 313 .captcha-row { 314 display: flex; 315 align-items: center; 316 gap: 8px; 317 margin-bottom: 8px; 318 } 319 320 #captchaImg { 321 flex: 1; 322 height: 54px; 323 border-radius: 11px; 324 border: 1.5px solid #e0e7ff; 325 background: #eef2ff; 326 cursor: pointer; 327 transition: transform .15s ease, box-shadow .15s ease; 328 object-fit: cover; 329 } 330 331 #captchaImg:hover { 332 transform: scale(1.01); 333 box-shadow: 0 5px 14px rgba(99,102,241,.22); 334 } 335 336 .btn-refresh { 337 flex-shrink: 0; 338 width: 54px; 339 height: 54px; 340 border-radius: 11px; 341 background: #eef2ff; 342 border: 1.5px solid #c7d2fe; 343 color: #4338ca; 344 display: inline-flex; 345 align-items: center; 346 justify-content: center; 347 cursor: pointer; 348 transition: all .25s ease; 349 } 350 351 .btn-refresh:hover { 352 background: #e0e7ff; 353 transform: rotate(90deg); 354 } 355 356 .btn-refresh:active { transform: rotate(180deg) scale(.95); } 357 358 .btn-refresh svg { width: 18px; height: 18px; } 359 360 #txtCaptcha { 361 letter-spacing: 5px; 362 font-weight: 700; 363 text-transform: uppercase; 364 text-align: center; 365 font-size: 15px; 366 } 367 368 /* ================= LOCKOUT BANNER ================= */ 369 .lockout-banner { 370 display: none; 371 align-items: flex-start; 372 gap: 10px; 373 padding: 11px 13px; 374 border-radius: 11px; 375 background: linear-gradient(135deg, #fee2e2, #fecaca); 376 border: 1.5px solid #f87171; 377 color: #7f1d1d; 378 font-size: 12px; 379 font-weight: 600; 380 margin-bottom: 14px; 381 animation: shakeIn .45s ease; 382 } 383 384 .lockout-banner.show { display: flex; } 385 386 .lockout-banner svg { 387 flex-shrink: 0; 388 width: 18px; 389 height: 18px; 390 color: #b91c1c; 391 } 392 393 .lockout-banner .title { font-weight: 700; margin-bottom: 2px; } 394 .lockout-banner .sub { font-weight: 500; opacity: .85; font-size: 11px; } 395 396 @keyframes shakeIn { 397 0% { transform: translateX(0); } 398 25% { transform: translateX(-6px); } 399 50% { transform: translateX(6px); } 400 75% { transform: translateX(-4px); } 401 100% { transform: translateX(0); } 402 } 403 404 /* ================= BUTTON ================= */ 405 .login-btn { 406 width: 100%; 407 padding: 13px; 408 border-radius: 12px; 409 border: none; 410 background: linear-gradient(135deg, var(--indigo), var(--blue)); 411 color: #fff; 412 font-weight: 800; 413 font-size: 12.5px; 414 letter-spacing: 1.5px; 415 text-transform: uppercase; 416 cursor: pointer; 417 margin-top: 6px; 418 font-family: 'Montserrat', sans-serif; 419 transition: all .3s ease; 420 box-shadow: 0 8px 20px rgba(75, 0, 130, .26); 421 position: relative; 422 overflow: hidden; 423 } 424 425 .login-btn::after { 426 content: ""; 427 position: absolute; 428 inset: 0; 429 background: linear-gradient(135deg, transparent 30%, rgba(255,255,255,.22), transparent 70%); 430 transform: translateX(-100%); 431 transition: transform .6s ease; 432 } 433 434 .login-btn:hover:not(:disabled) { 435 transform: translateY(-2px); 436 box-shadow: 0 14px 28px rgba(37, 99, 235, .38); 437 } 438 439 .login-btn:hover:not(:disabled)::after { 440 transform: translateX(100%); 441 } 442 443 .login-btn:disabled { 444 opacity: .55;
445 cursor: not-allowed; 446 } 447 448 /* Divider */ 449 .divider { 450 display: flex; 451 align-items: center; 452 text-align: center; 453 margin: 16px 0 12px; 454 color: var(--muted); 455 font-size: 10px; 456 font-weight: 700; 457 letter-spacing: 1.6px; 458 text-transform: uppercase; 459 } 460 461 .divider::before, 462 .divider::after { 463 content: ""; 464 flex: 1; 465 height: 1px; 466 background: linear-gradient(90deg, transparent, #e2e8f0, transparent); 467 } 468 469 .divider span { padding: 0 10px; } 470 471 /* PhD Login Link */ 472 .phd-link { 473 display: flex; 474 align-items: center; 475 justify-content: center; 476 gap: 8px; 477 width: 100%; 478 padding: 11px; 479 border-radius: 11px; 480 background: linear-gradient(135deg, rgba(75, 0, 130, 0.05), rgba(37, 99, 235, 0.05)); 481 border: 1.5px solid rgba(75, 0, 130, 0.15); 482 color: var(--indigo); 483 font-size: 11.5px; 484 font-weight: 700; 485 letter-spacing: 0.8px; 486 text-decoration: none; 487 text-transform: uppercase; 488 transition: all .3s ease; 489 } 490 491 .phd-link svg { width: 15px; height: 15px; transition: transform .3s ease; } 492 493 .phd-link:hover { 494 background: linear-gradient(135deg, var(--indigo), var(--blue)); 495 border-color: transparent; 496 color: #fff; 497 transform: translateY(-2px); 498 box-shadow: 0 10px 22px rgba(75, 0, 130, 0.28); 499 } 500 501 .phd-link:hover svg { transform: translateX(3px); } 502 503 .help-text { 504 text-align: center; 505 font-size: 11px; 506 color: var(--muted); 507 margin-top: 14px; 508 line-height: 1.5; 509 } 510 511 .help-text a { color: var(--gold); font-weight: 700; text-decoration: none; } 512 .help-text a:hover { text-decoration: underline; } 513 514 /* ===================== RESPONSIVE ===================== */ 515 @media (max-width: 900px) { 516 .login-shell { 517 grid-template-columns: 1fr; 518 max-width: 440px; 519 min-height: auto; 520 } 521 522 .brand-panel { 523 padding: 28px 26px 24px; 524 } 525 526 .brand-heading { font-size: 30px; margin-bottom: 10px; } 527 .brand-sub { font-size: 12.5px; max-width: 100%; } 528 .brand-features { display: none; } 529 .brand-footer { display: none; } 530 531 .form-panel { padding: 28px 26px; } 532 .form-heading { font-size: 22px; } 533 } 534 535 @media (max-width: 420px) { 536 body { padding: 10px; } 537 .login-shell { border-radius: 18px; } 538 .brand-panel { padding: 22px 20px 18px; } 539 .form-panel { padding: 22px 20px; } 540 .brand-logo { width: 46px; height: 46px; } 541 .brand-heading { font-size: 26px; } 542 } 543 </style> 544</head> 545 546<body> 547 548 <div class="login-shell"> 549 550 <!-- ==================== LEFT PANEL â BRANDING ==================== --> 551 <aside class="brand-panel"> 552 553 <div class="brand-top"> 554 <img src="/images/DduguLogo.jpg" class="brand-logo" alt="DDUGU Logo" /> 555 <div class="brand-name"> 556 Deen Dayal Upadhyaya 557 <span>Gorakhpur University</span> 558 </div> 559 </div> 560 561 <div class="brand-center"> 562 <h1 class="brand-heading"> 563 Student<br /> 564 <span>Portal.</span> 565 </h1> 566 <p class="brand-sub"> 567 Sign in to access your academic dashboard â view and pay fees, manage exam forms, and stay updated with your academic activities. 568 </p> 569 570 <ul class="brand-features"> 571 <li>Secure & verified access</li> 572 <li>Manage your academic details</li> 573 <li>Check & pay fees online</li> 574 <li>Submit and manage exam forms</li> 575 </ul> 576 </div> 577 578 <div class="brand-footer"> 579 © 2026 DDUGU â ERP 580 </div> 581 582 </aside> 583 584 <!-- ==================== RIGHT PANEL â FORM ==================== --> 585 <main class="form-panel"> 586 587 <div class="form-panel-inner"> 588 589 <div class="form-eyebrow">Secure Sign In</div> 590 <h2 class="form-heading">Welcome back</h2> 591 <p class="form-desc">Enter your credentials below to continue</p> 592 593 <!-- Lockout banner --> 594 <div id="lockoutBanner" class="lockout-banner"> 595 <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> 596 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 597 d="M12 9v2m0 4h.01M5.07 19h13.86a2 2 0 001.74-3L13.74 4a2 2 0 00-3.48 0L3.34 16a2 2 0 001.73 3z" /> 598 </svg> 599 <div> 600 <div class="title">Account Temporarily Locked</div> 601 <div class="sub" id="lockoutMsg">Too many failed attempts. Please try again later.</div> 602 </div> 603 </div> 604 605 <form id="loginForm" novalidate> 606 607 <div class="form-group"> 608 <label>Roll Number</label> 609 <input id="txtRoll" type="text" class="input" 610 placeholder="Enter your roll number" 611 autocomplete="off" required /> 612 </div> 613 614 <div class="form-group"> 615 <label>Date of Birth</label> 616 <input id="txtDob" type="date" class="input" required /> 617 </div> 618 619 <div class="form-group"> 620 <label>Security Check</label> 621 <div class="captcha-row"> 622 <img id="captchaImg" src="/api/LoginApi/GetCaptcha" 623 alt="Click to refresh captcha" title="Click to refresh" /> 624 <button type="button" id="refreshCaptcha" class="btn-refresh" 625 title="Refresh captcha"> 626 <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> 627 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.2" 628 d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" /> 629 </svg> 630 </button> 631 </div> 632 <input id="txtCaptcha" type="text" class="input" 633 placeholder="ENTER CAPTCHA" 634 autocomplete="off" maxlength="6" spellcheck="false" /> 635 </div> 636 637 <button type="button" id="btnProceed" class="login-btn"> 638 Access Portal 639 </button> 640 </form> 641 642 <div class="divider"><span>or</span></div> 643 644 <a href="https://erp.ddugu.ac.in/pform2024/login.aspx" class="phd-link"> 645 <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> 646 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 647 d="M12 14l9-5-9-5-9 5 9 5z" /> 648 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 649 d="M12 14l6.16-3.422a12.083 12.083 0 01.665 6.479A11.952 11.952 0 0012 20.055a11.952 11.952 0 00-6.824-2.998 12.078 12.078 0 01.665-6.479L12 14z" /> 650 </svg> 651 PhD Candidate Login 652 <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> 653 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" 654 d="M14 5l7 7m0 0l-7 7m7-7H3" /> 655 </svg> 656 </a> 657 658 <p class="help-text"> 659 Facing issues? Contact the <a href="/cdn-cgi/l/email-protection#aec6cbc2decacbddc5eecacadbc9db80cfcd80c7c0">Help Desk</a> 660 </p> 661 662 </div> 663 </main> 664 665 </div>
vendor: 114 bytes, lines 665-667
665 666 667 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
667<script src="https://cdnjs.cloudflare.com/ajax/libs/toastify-js/1.12.0/toastify.min.js"></script>
667 668
668<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
668 669 670
670<script> 671 // ============================================================ 672 // UI HELPERS 673 // ============================================================ 674 function showLoader() { 675 Swal.fire({ 676 html: `<div style="font-size:22px;color:#64748b;font-weight:500">Verifying Credentials...</div>`, 677 allowOutsideClick: false, 678 allowEscapeKey: false, 679 showConfirmButton: false, 680 background: "#ffffff", 681 width: "420px", 682 heightAuto: false, 683 scrollbarPadding: false, 684 didOpen: () => Swal.showLoading() 685 }); 686 } 687 688 function hideLoader() { Swal.close(); } 689 690 function showToast(message, type = 'error') { 691 Toastify({ 692 text: message, 693 duration: 5000, 694 close: true, 695 gravity: "top", 696 position: "center", 697 backgroundColor: type === 'error' 698 ? "linear-gradient(135deg, #dc2626, #b91c1c)" 699 : "linear-gradient(135deg, #16a34a, #15803d)", 700 style: { borderRadius: "10px", fontWeight: "600" } 701 }).showToast(); 702 } 703 704 // ============================================================ 705 // CAPTCHA 706 // ============================================================ 707 function refreshCaptcha() { 708 const img = document.getElementById('captchaImg'); 709 img.src = '/api/LoginApi/GetCaptcha?t=' + Date.now(); 710 document.getElementById('txtCaptcha').value = ''; 711 document.getElementById('txtCaptcha').focus(); 712 } 713 714 document.getElementById('captchaImg') 715 .addEventListener('click', refreshCaptcha); 716 document.getElementById('refreshCaptcha') 717 .addEventListener('click', refreshCaptcha); 718 719 // ============================================================ 720 // LOCKOUT BANNER 721 // ============================================================ 722 function showLockoutBanner(message) { 723 document.getElementById('lockoutMsg').textContent = message; 724 document.getElementById('lockoutBanner').classList.add('show'); 725 document.getElementById('btnProceed').disabled = true; 726 } 727 728 function hideLockoutBanner() { 729 document.getElementById('lockoutBanner').classList.remove('show'); 730 document.getElementById('btnProceed').disabled = false; 731 } 732 733 // ============================================================ 734 // LOGIN SUBMIT 735 // ============================================================ 736 const proceedBtn = document.getElementById('btnProceed'); 737 738 proceedBtn.addEventListener('click', async () => { 739 const roll = document.getElementById('txtRoll').value.trim(); 740 const dob = document.getElementById('txtDob').value; 741 const captcha = document.getElementById('txtCaptcha').value.trim(); 742 743 if (!roll) return showToast("Please enter your Roll Number"); 744 if (!dob) return showToast("Please select your Date of Birth"); 745 if (!captcha) return showToast("Please enter the captcha"); 746 if (captcha.length < 4) return showToast("Captcha must be at least 4 characters"); 747 748 proceedBtn.disabled = true; 749 proceedBtn.innerText = "Processing..."; 750 showLoader(); 751 752 let requestCompleted = false; 753 754 try { 755 const res = await fetch('/api/LoginApi/StudentAuth', { 756 method: 'POST', 757 headers: { 'Content-Type': 'application/json' }, 758 body: JSON.stringify({ 759 RollNo: roll, 760 Dob: dob, 761 Captcha: captcha, 762 CaptchaId: 'session' 763 }) 764 }); 765 766 requestCompleted = true; 767 const data = await res.json(); 768 769 if (data.success) { 770 showToast("Login successful. Redirecting...", "success"); 771 setTimeout(() => { location.href = data.redirectUrl; }, 600); 772 return; 773 } 774 775 hideLoader(); 776 if (data.locked) { 777 showLockoutBanner(data.message); 778 showToast(data.message, "error"); 779 refreshCaptcha(); 780 return; 781 } 782 783 showToast(data.message || "Login failed. Please check your credentials."); 784 if (data.refreshCaptcha !== false) refreshCaptcha(); 785 786 proceedBtn.disabled = false;
787 proceedBtn.innerText = "Access Portal"; 788 789 } catch (err) { 790 console.error(err); 791 hideLoader(); 792 showToast("Network error. Please check your internet connection."); 793 refreshCaptcha(); 794 proceedBtn.disabled = false; 795 proceedBtn.innerText = "Access Portal"; 796 } finally { 797 if (!requestCompleted && !proceedBtn.disabled) { 798 hideLoader(); 799 } 800 } 801 }); 802 803 ['txtRoll', 'txtDob', 'txtCaptcha'].forEach(id => { 804 document.getElementById(id).addEventListener('keydown', e => { 805 if (e.key === 'Enter') { 806 e.preventDefault(); 807 proceedBtn.click(); 808 } 809 }); 810 }); 811 812 (function () { 813 const lockedUntil = sessionStorage.getItem('lockoutUntil'); 814 if (lockedUntil && new Date(lockedUntil) > new Date()) { 815 const mins = Math.ceil((new Date(lockedUntil) - new Date()) / 60000); 816 showLockoutBanner(`Too many failed attempts. Please try again in ${mins} minute(s).`); 817 } else { 818 sessionStorage.removeItem('lockoutUntil'); 819 } 820 })(); 821 </script>
vendor: 1 bytes, line 821
821
822<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"22a8b9b1de4046028000d91cfd069108","r":1,"spa":2}' crossorigin="anonymous"></script>
822 823</body> 824</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.