1// Session guard (pairs with SessionExpiredFilter / BaseController): when the server signals 2// that the login session is gone on an AJAX call (401 + X-Session-Expired), send the whole 3// page to login instead of leaving half-rendered panels or pasting login HTML into them. 4$(document).ajaxError(function (_event, xhr) { 5 try { 6 if (xhr && xhr.status === 401 && xhr.getResponseHeader('X-Session-Expired')) { 7 window.location.href = xhr.getResponseHeader('X-Login-Url') || '/LogIn'; 8 } 9 } catch (e) { /* never let the guard itself throw */ } 10}); 11 12function ShowErrors(validationError) { 13 for (var i = 0; i < validationError.length; i++) { 14 $('#txt' + validationError[i].errorField + "_Error").text(validationError[i].errorMessage); 15 $('#txt' + validationError[i].errorField + "_Error").css('display', 'block'); 16 } 17} 18 19function movetoNext(current, nextFieldID) { 20 if (current.value.length >= current.maxLength) { 21 document.getElementById(nextFieldID).focus(); 22 } 23} 24function movetoNextOTP(current, nextFieldID) { 25 if (current.value.length >= current.maxLength) { 26 document.getElementById(nextFieldID).focus(); 27 } 28} 29 30function check() { 31 if (document.getElementById('txtNewPassword').value === 32 document.getElementById('txtConfirmPassword').value) { 33 document.getElementById('message').innerHTML = " "; 34 } else { 35 document.getElementById('message').innerHTML = "Confirm password does not match"; 36 } 37} 38 39function formatDate(dateValue) { 40 var dateTimeArra = dateValue.split('T'); 41 var dateArray = dateTimeArra[0].split('-'); 42 var timeArray = dateTimeArra[1].split(':'); 43 var formatedDateTime = dateArray[2] + '-' + dateArray[1] + '-' + dateArray[0] + ' ' + timeArray[0] + ':' + timeArray[1]; 44 return formatedDateTime; 45} 46 47function ConvertLocalTime(utcDateTime) { 48 if (utcDateTime != '') { 49 var utcTime = new Date(utcDateTime); 50 var localStartTime = new Date(Date.UTC( 51 utcTime.getFullYear(), 52 utcTime.getMonth(), 53 utcTime.getDate(), 54 utcTime.getHours(), 55 utcTime.getMinutes() 56 )); 57 var hours = ''; 58 var minutes = ''; 59 if (localStartTime.getHours() < 10) { 60 hours = "0" + localStartTime.getHours(); 61 } else { 62 hours = localStartTime.getHours(); 63 } 64 if (localStartTime.getMinutes() < 10) { 65 minutes = "0" + localStartTime.getMinutes(); 66 } else { 67 minutes = localStartTime.getMinutes(); 68 } 69 var displayStartTime = hours + ':' + minutes; 70 return displayStartTime; 71 } 72 else { 73 return ''; 74 } 75} 76 77 78function myFunction() { 79 var x = document.getElementById("txtPassword"); 80 if (x.type === "password") { 81 x.type = "text"; 82 $('.pwd').removeClass('fa-eye-slash'); 83 $('.pwd').addClass('fa-eye') 84 } else { 85 x.type = "password"; 86 $('.pwd').addClass('fa-eye-slash'); 87 $('.pwd').removeClass('fa-eye') 88 } 89} 90 91function togglePassword() { 92 const input = document.getElementById("txtPassword"); 93 const icon = document.getElementById("togglePassword"); 94 95 if (input.type === "password") { 96 input.type = "text"; 97 icon.classList.remove("fa-eye"); 98 icon.classList.add("fa-eye-slash"); 99 } else { 100 input.type = "password"; 101 icon.classList.remove("fa-eye-slash"); 102 icon.classList.add("fa-eye"); 103 } 104} 105 106function HideErrors() { 107 $('.Error').css('display', 'none'); 108} 109 110function readURL(input, previewImage) { 111 112 if (input.files && input.files[0]) { 113 var reader = new FileReader(); 114 115 reader.onload = function (e) { 116 $('#' + previewImage).attr('src', e.target.result); 117 } 118 reader.readAsDataURL(input.files[0]); // convert to base64 string 119 } 120} 121 122function GetFloat(value) { 123 if (!isNaN(value) && value != 'undefined' && value != 'NaN' && value != '') { 124 return parseFloat(value); 125 } 126 else { 127 return 0; 128 } 129} 130 131function GetInt(value) { 132 if (!isNaN(value) && value != 'undefined' && value != 'NaN' && value != '') { 133 return parseInt(value); 134 } 135 else { 136 return 0; 137 } 138} 139 140function formatPhoneNumber(phoneNumber) { 141 142 //phoneNumber = phoneNumber.replace(/\D/g, ''); 143 144 // if (phoneNumber.length <= 3) { 145 // phoneNumber = phoneNumber; 146 // } else if (phoneNumber.length <= 6) { 147 // var formattedNumber = +phoneNumber.substr(0, 3) + '-' + phoneNumber.substr(3, 3); 148 // phoneNumber = formattedNumber; 149 // } else { 150 // var formattedNumber = phoneNumber.substr(0, 3) + '-' + phoneNumber.substr(3, 3) + '-' + phoneNumber.substr(6, 4); 151 // phoneNumber = formattedNumber; 152 // } 153 154 //if (phoneNumber.length > 10) { 155 // phoneNumber = phoneNumber.slice(-10); 156 //} 157 //if (phoneNumber.length === 10) { 158 // return phoneNumber.replace(/(\d{3})(\d{3})(\d{4})/, "$1-$2-$3"); 159 //} 160 //return phoneNumber.replace(/(\d{3})(\d{3})(\d{4})/, "$1-$2-$3") 161 return phoneNumber; 162} 163 164function ShowLoader() { 165 $('#loadingIndicator').css('display', 'block'); 166} 167
168function HideLoader() { 169 $('#loadingIndicator').css('display', 'none'); 170} 171 172function ShowSuccessMessage(message, yes) { 173 $.confirm({ 174 title: 'Keys', 175 content: message, 176 type: 'blue', 177 typeAnimated: true, 178 maxWidth: 150, 179 buttons: { 180 ok: { 181 text: 'Ok', 182 btnClass: 'btn-blue', 183 action: yes 184 } 185 } 186 }); 187} 188 189function ShowErrorMessage(message) { 190 $.confirm({ 191 title: 'Keys', 192 content: message, 193 type: 'red', 194 typeAnimated: true, 195 buttons: { 196 tryAgain: { 197 text: 'Try again', 198 btnClass: 'btn-red', 199 action: function () { 200 } 201 } 202 } 203 }); 204} 205 206// Global rate-limit / lockout notifier. Whenever ANY AJAX request is throttled or the 207// account is temporarily locked (HTTP 429), show the user a clear message instead of 208// failing silently. The abuse guard returns a JSON body with statusMessage; the plain 209// rate limiter returns an empty body (we fall back to a generic message). This runs in 210// addition to each request's own handlers, none of which surface the 429 today. 211$(document).ajaxError(function (event, xhr) { 212 if (!xhr || xhr.status !== 429) { return; } 213 var msg = "Too many attempts. Please wait a minute and try again."; 214 try { 215 var r = JSON.parse(xhr.responseText); 216 if (r && r.statusMessage) { msg = r.statusMessage; } 217 } catch (e) { } 218 if (typeof HideLoader === 'function') { try { HideLoader(); } catch (e) { } } 219 ShowErrorMessage(msg); 220}); 221 222 223function RefundErrorMessage(message, yes, no) { 224 $.confirm({ 225 title: 'Keys', 226 content: message, 227 type: 'red', 228 typeAnimated: true, 229 buttons: { 230 231 no: { 232 text: 'Cancel', 233 btnClass: 'btn-red', 234 action: no 235 }, 236 yes: { 237 text: 'Partial Refund', 238 btnClass: 'btn-blue', 239 action: yes 240 } 241 } 242 }); 243} 244function ConfirmMessage(message, yes, no) { 245 $.confirm({ 246 title: 'Keys', 247 content: message, 248 type: 'blue', 249 typeAnimated: true, 250 buttons: { 251 yes: { 252 text: 'Yes', 253 btnClass: 'btn-blue', 254 action: yes 255 }, 256 no: { 257 text: 'No', 258 btnClass: 'btn-red', 259 action: no 260 } 261 } 262 }); 263} 264 265function ShowConfirmMessage(message, yes, no) { 266 $.confirm({ 267 title: 'Keys', 268 content: message, 269 type: 'blue', 270 typeAnimated: true, 271 buttons: { 272 yes: { 273 text: 'Setup Now', 274 btnClass: 'btn-green', 275 action: yes 276 }, 277 no: { 278 text: 'Setup Later', 279 btnClass: 'btn-blue', 280 action: no 281 } 282 } 283 }); 284} 285 286function ShowWarningMessage(message) { 287 $.confirm({ 288 title: 'Keys', 289 content: message, 290 type: 'red', 291 typeAnimated: true, 292 buttons: { 293 tryAgain: { 294 text: 'Close', 295 btnClass: 'btn-red', 296 action: function () { 297 } 298 } 299 } 300 }); 301} 302 303 304var prevKey = -1, prevControl = ''; 305function NumericOnly(event) { 306 307 if (!(event.keyCode == 8 // backspace 308 || event.keyCode == 9 // tab 309 || event.keyCode == 17 // ctrl 310 || event.keyCode == 46 || event.keyCode == 187 // delete 311 || (event.keyCode >= 35 && event.keyCode <= 40) // arrow keys/home/end 312 || (event.keyCode >= 48 && event.keyCode <= 57) // numbers on keyboard 313 || (event.keyCode >= 96 && event.keyCode <= 105) // number on keypad 314 || (event.keyCode == 65 && prevKey == 17 && prevControl == event.currentTarget.id)) // ctrl + a, on same control 315 ) { 316 event.preventDefault(); // Prevent character input 317 } 318 else { 319 prevKey = event.keyCode; 320 prevControl = event.currentTarget.id; 321 } 322} 323
324// Like NumericOnly but also allows a single decimal point â for money / percent 325// fields (Shipping Cost, Estimated Tax) that legitimately take point values. 326function DecimalOnly(event) { 327 var isDot = (event.keyCode == 190 || event.keyCode == 110); 328 if (isDot) { 329 // Allow only one decimal point in the field. 330 var val = (event.currentTarget && event.currentTarget.value) || ''; 331 if (val.indexOf('.') !== -1) { event.preventDefault(); } 332 return; 333 } 334 NumericOnly(event); 335} 336 337function RestrictInputLength(input, event, length) { 338 if ($(input).val().length >= length && event.keyCode != 8) { 339 event.preventDefault(); // Prevent character input 340 } 341 else if (!(event.keyCode == 8 // backspace 342 || event.keyCode == 9 // tab 343 || event.keyCode == 17 // ctrl 344 || event.keyCode == 46 || event.keyCode == 187 // delete 345 || (event.keyCode >= 35 && event.keyCode <= 40) // arrow keys/home/end 346 || (event.keyCode >= 48 && event.keyCode <= 57) // numbers on keyboard 347 || (event.keyCode >= 96 && event.keyCode <= 105) // number on keypad 348 || (event.keyCode == 65 && prevKey == 17 && prevControl == event.currentTarget.id)) // ctrl + a, on same control 349 ) { 350 event.preventDefault(); // Prevent character input 351 } 352 else { 353 prevKey = event.keyCode; 354 prevControl = event.currentTarget.id; 355 } 356} 357 358function InputDecimal(input, event, length) { 359 if ($(input).val().includes('.') && (event.keyCode == 110 || event.keyCode == 190)) { 360 event.preventDefault(); 361 } else { 362 if ($(input).val().length >= length && event.keyCode != 8) { 363 event.preventDefault(); // Prevent character input 364 } 365 else if (!(event.keyCode == 8 || event.keyCode == 110 || event.keyCode == 190 // backspace, . 366 || event.keyCode == 9 // tab 367 || event.keyCode == 17 // ctrl 368 || event.keyCode == 46 || event.keyCode == 187 // delete 369 || (event.keyCode >= 35 && event.keyCode <= 40) // arrow keys/home/end 370 || (event.keyCode >= 48 && event.keyCode <= 57) // numbers on keyboard 371 || (event.keyCode >= 96 && event.keyCode <= 105) // number on keypad 372 || (event.keyCode == 65 && prevKey == 17 && prevControl == event.currentTarget.id)) // ctrl + a, on same control 373 ) { 374 event.preventDefault(); // Prevent character input 375 } 376 else { 377 prevKey = event.keyCode; 378 prevControl = event.currentTarget.id; 379 } 380 } 381} 382$('#btnInvite').click(function () { 383 384 $('#myModalPop').modal("show") 385}) 386 387 388$('#btnSubmit').click(function () { 389 try { 390 391 ShowLoader(); 392 HideErrors(); 393 var file = $("#excelFile").prop("files")[0]; 394 if ($("#inviteMdlTxtMobileNumber").val().split() != "" && $('#txtEmailId').val().split() != "") { 395 396 var frmData = new FormData(); 397 var mobilenumber = ""; 398 const getIso2 = getItil(); 399 const rawMobile = $("#inviteMdlTxtMobileNumber").val().replace(/\D/g, ''); 400 // mobilenumber = $(".iti__selected-flag").attr("title").split(":")[1].trim() + $("#inviteMdlTxtMobileNumber").val(); 401 402 frmData.append("EmailId", $('#txtEmailId').val()) 403 404 if (rawMobile.length > 0) { 405 mobilenumber = `+${getIso2.dialCode}${rawMobile}`; 406 frmData.append("MobileNumber", mobilenumber) 407 } else { 408 frmData.append("MobileNumber", "") 409 } 410 411 412 $.ajax({ 413 url: $('#inviteUserAction').attr('invite-UserUrl'), 414 type: "POST", 415 headers: { "__RequestVerificationToken": $('[name=__RequestVerificationToken]').val() }, 416 data: frmData, 417 processData: false, 418 contentType: false, 419 success: function (e) { 420 if (e.statusCode === 3) { 421 HideLoader(); 422 ShowErrors(e.validationError); 423 } 424 else if (e.statusCode == 200) { 425 HideLoader(); 426 HideErrors();
427 $('#myModalPop').modal("hide"); 428 ShowSuccessMessage(e.statusMessage, function yes() { 429 window.location.reload(true) 430 }); 431 } 432 else { 433 HideLoader(); 434 ShowErrorMessage(e.statusMessage); 435 } 436 }, 437 error: function (xhr, status, error) { 438 // Show the error 439 HideLoader(); 440 console.log(xhr.responseText); 441 } 442 443 }) 444 } 445 else if (file != undefined) { 446 447 var formData = new FormData(); 448 formData.append("file", file); 449 $.ajax({ 450 url: "/Vendor/InviteUsersFromExportExcelFile", 451 method: "POST", 452 data: formData, 453 processData: false, // Prevent jQuery from automatically processing the data 454 contentType: false, // Prevent jQuery from setting the content type 455 success: function (result) { 456 457 HideLoader(); 458 $('#myModalPop').modal("hide"); 459 ShowSuccessMessage(result.statusMessage, function yes() { 460 window.location.reload(true) 461 }); 462 }, 463 error: function (xhr, status, error) { 464 HideLoader(); 465 console.log(xhr.responseText); 466 } 467 }); 468 } 469 else { 470 HideLoader(); 471 $("#file_UserError").show(); 472 $("#txtEmailId_UserError").show(); 473 $("#txtMobileNumber_UserError").show(); 474 } 475 476 } 477 catch (err) { 478 HideLoader(); 479 } 480}) 481 482$('.clsModel').click(function () { 483 484 $("#file_UserError").hide(); 485 $("#txtEmailId_UserError").hide(); 486 $("#txtMobileNumber_UserError").hide(); 487 488 $(".modal-body input").val(""); 489 490}) 491 492$('.txtvalidate').keypress(function (e) { 493 494 var keyentered = e.keyCode || e.which; 495 keyentered = String.fromCharCode(keyentered); 496 497 var numberRegex = /[0-9]|\./; 498 499 if (numberRegex.test(keyentered)) { 500 return true; 501 } 502 else { 503 return false; 504 } 505}) 506 507//Upgrade to keys; 508$('#btnUpgrade').on('click', function () { 509 try { 510 ShowLoader(); 511 HideErrors(); 512 513 $.ajax({ 514 url: "/DashBoard/UpgradeToKeys", 515 type: "POST", 516 data: JSON.stringify({}), // required for JSON POST 517 contentType: "application/json; charset=utf-8", 518 success: function (e) { 519 HideLoader(); 520 if (e.statusCode === 3) { 521 ShowWarningMessage(e.statusMessage); 522 } 523 else if (e.statusCode == 200) { 524 HideErrors(); 525 window.location.href = e.statusMessage; 526 } 527 else { 528 ShowErrorMessage(e.statusMessage); 529 } 530 }, 531 error: function (xhr, status, error) { 532 HideLoader(); 533 console.log("Error:", xhr.responseText); 534 } 535 }); 536 } catch (err) { 537 HideLoader(); 538 console.log("JS error:", err.message); 539 } 540}); 541
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.