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 // Almost every caller passes a server statusMessage straight through. When 191 // that message is empty the dialog fell back to the plugin's own default 192 // text -- "Are you sure to continue?" -- which reads like a question and 193 // tells the person nothing about what failed. 194 var text = (typeof message === 'string' && message.trim().length) 195 ? message 196 : 'That did not save. Nothing was changed. Please try again, and tell us what you were doing if it keeps happening.'; 197 198 $.confirm({ 199 title: 'Keys', 200 content: text, 201 type: 'red', 202 typeAnimated: true, 203 buttons: { 204 tryAgain: { 205 text: 'Try again', 206 btnClass: 'btn-red', 207 action: function () { 208 } 209 } 210 } 211 }); 212} 213 214// Global rate-limit / lockout notifier. Whenever ANY AJAX request is throttled or the 215// account is temporarily locked (HTTP 429), show the user a clear message instead of 216// failing silently. The abuse guard returns a JSON body with statusMessage; the plain 217// rate limiter returns an empty body (we fall back to a generic message). This runs in 218// addition to each request's own handlers, none of which surface the 429 today. 219$(document).ajaxError(function (event, xhr) { 220 if (!xhr || xhr.status !== 429) { return; } 221 var msg = "Too many attempts. Please wait a minute and try again."; 222 try { 223 var r = JSON.parse(xhr.responseText); 224 if (r && r.statusMessage) { msg = r.statusMessage; } 225 } catch (e) { } 226 if (typeof HideLoader === 'function') { try { HideLoader(); } catch (e) { } } 227 ShowErrorMessage(msg); 228}); 229 230 231function RefundErrorMessage(message, yes, no) { 232 $.confirm({ 233 title: 'Keys', 234 content: message, 235 type: 'red', 236 typeAnimated: true, 237 buttons: { 238 239 no: { 240 text: 'Cancel', 241 btnClass: 'btn-red', 242 action: no 243 }, 244 yes: { 245 text: 'Partial Refund', 246 btnClass: 'btn-blue', 247 action: yes 248 } 249 } 250 }); 251} 252function ConfirmMessage(message, yes, no) { 253 $.confirm({ 254 title: 'Keys', 255 content: message, 256 type: 'blue', 257 typeAnimated: true, 258 buttons: { 259 yes: { 260 text: 'Yes', 261 btnClass: 'btn-blue', 262 action: yes 263 }, 264 no: { 265 text: 'No', 266 btnClass: 'btn-red', 267 action: no 268 } 269 } 270 }); 271} 272 273function ShowConfirmMessage(message, yes, no) { 274 $.confirm({ 275 title: 'Keys', 276 content: message, 277 type: 'blue', 278 typeAnimated: true, 279 buttons: { 280 yes: { 281 text: 'Setup Now', 282 btnClass: 'btn-green', 283 action: yes 284 }, 285 no: { 286 text: 'Setup Later', 287 btnClass: 'btn-blue', 288 action: no 289 } 290 } 291 }); 292} 293 294function ShowWarningMessage(message) { 295 $.confirm({ 296 title: 'Keys', 297 content: message, 298 type: 'red', 299 typeAnimated: true, 300 buttons: { 301 tryAgain: { 302 text: 'Close', 303 btnClass: 'btn-red', 304 action: function () { 305 } 306 } 307 } 308 }); 309} 310 311 312var prevKey = -1, prevControl = ''; 313function NumericOnly(event) { 314 315 if (!(event.keyCode == 8 // backspace 316 || event.keyCode == 9 // tab 317 || event.keyCode == 17 // ctrl 318 || event.keyCode == 46 || event.keyCode == 187 // delete 319 || (event.keyCode >= 35 && event.keyCode <= 40) // arrow keys/home/end 320 || (event.keyCode >= 48 && event.keyCode <= 57) // numbers on keyboard 321 || (event.keyCode >= 96 && event.keyCode <= 105) // number on keypad 322 || (event.keyCode == 65 && prevKey == 17 && prevControl == event.currentTarget.id)) // ctrl + a, on same control 323 ) { 324 event.preventDefault(); // Prevent character input 325 } 326 else { 327 prevKey = event.keyCode; 328 prevControl = event.currentTarget.id; 329 } 330} 331
332// Like NumericOnly but also allows a single decimal point â for money / percent 333// fields (Shipping Cost, Estimated Tax) that legitimately take point values. 334function DecimalOnly(event) { 335 var isDot = (event.keyCode == 190 || event.keyCode == 110); 336 if (isDot) { 337 // Allow only one decimal point in the field. 338 var val = (event.currentTarget && event.currentTarget.value) || ''; 339 if (val.indexOf('.') !== -1) { event.preventDefault(); } 340 return; 341 } 342 NumericOnly(event); 343} 344 345function RestrictInputLength(input, event, length) { 346 if ($(input).val().length >= length && event.keyCode != 8) { 347 event.preventDefault(); // Prevent character input 348 } 349 else if (!(event.keyCode == 8 // backspace 350 || event.keyCode == 9 // tab 351 || event.keyCode == 17 // ctrl 352 || event.keyCode == 46 || event.keyCode == 187 // delete 353 || (event.keyCode >= 35 && event.keyCode <= 40) // arrow keys/home/end 354 || (event.keyCode >= 48 && event.keyCode <= 57) // numbers on keyboard 355 || (event.keyCode >= 96 && event.keyCode <= 105) // number on keypad 356 || (event.keyCode == 65 && prevKey == 17 && prevControl == event.currentTarget.id)) // ctrl + a, on same control 357 ) { 358 event.preventDefault(); // Prevent character input 359 } 360 else { 361 prevKey = event.keyCode; 362 prevControl = event.currentTarget.id; 363 } 364} 365 366function InputDecimal(input, event, length) { 367 if ($(input).val().includes('.') && (event.keyCode == 110 || event.keyCode == 190)) { 368 event.preventDefault(); 369 } else { 370 if ($(input).val().length >= length && event.keyCode != 8) { 371 event.preventDefault(); // Prevent character input 372 } 373 else if (!(event.keyCode == 8 || event.keyCode == 110 || event.keyCode == 190 // backspace, . 374 || event.keyCode == 9 // tab 375 || event.keyCode == 17 // ctrl 376 || event.keyCode == 46 || event.keyCode == 187 // delete 377 || (event.keyCode >= 35 && event.keyCode <= 40) // arrow keys/home/end 378 || (event.keyCode >= 48 && event.keyCode <= 57) // numbers on keyboard 379 || (event.keyCode >= 96 && event.keyCode <= 105) // number on keypad 380 || (event.keyCode == 65 && prevKey == 17 && prevControl == event.currentTarget.id)) // ctrl + a, on same control 381 ) { 382 event.preventDefault(); // Prevent character input 383 } 384 else { 385 prevKey = event.keyCode; 386 prevControl = event.currentTarget.id; 387 } 388 } 389} 390$('#btnInvite').click(function () { 391 392 $('#myModalPop').modal("show") 393}) 394 395 396$('#btnSubmit').click(function () { 397 try { 398 399 ShowLoader(); 400 HideErrors(); 401 var file = $("#excelFile").prop("files")[0]; 402 if ($("#inviteMdlTxtMobileNumber").val().split() != "" && $('#txtEmailId').val().split() != "") { 403 404 var frmData = new FormData(); 405 var mobilenumber = ""; 406 const getIso2 = getItil(); 407 const rawMobile = $("#inviteMdlTxtMobileNumber").val().replace(/\D/g, ''); 408 // mobilenumber = $(".iti__selected-flag").attr("title").split(":")[1].trim() + $("#inviteMdlTxtMobileNumber").val(); 409 410 frmData.append("EmailId", $('#txtEmailId').val()) 411 412 if (rawMobile.length > 0) { 413 mobilenumber = `+${getIso2.dialCode}${rawMobile}`; 414 frmData.append("MobileNumber", mobilenumber) 415 } else { 416 frmData.append("MobileNumber", "") 417 } 418 419 420 $.ajax({ 421 url: $('#inviteUserAction').attr('invite-UserUrl'), 422 type: "POST", 423 headers: { "__RequestVerificationToken": $('[name=__RequestVerificationToken]').val() }, 424 data: frmData, 425 processData: false, 426 contentType: false, 427 success: function (e) { 428 if (e.statusCode === 3) { 429 HideLoader(); 430 ShowErrors(e.validationError); 431 } 432 else if (e.statusCode == 200) { 433 HideLoader(); 434 HideErrors();
435 $('#myModalPop').modal("hide"); 436 ShowSuccessMessage(e.statusMessage, function yes() { 437 window.location.reload(true) 438 }); 439 } 440 else { 441 HideLoader(); 442 ShowErrorMessage(e.statusMessage); 443 } 444 }, 445 error: function (xhr, status, error) { 446 // Show the error 447 HideLoader(); 448 console.log(xhr.responseText); 449 } 450 451 }) 452 } 453 else if (file != undefined) { 454 455 var formData = new FormData(); 456 formData.append("file", file); 457 $.ajax({ 458 url: "/Vendor/InviteUsersFromExportExcelFile", 459 method: "POST", 460 data: formData, 461 processData: false, // Prevent jQuery from automatically processing the data 462 contentType: false, // Prevent jQuery from setting the content type 463 success: function (result) { 464 465 HideLoader(); 466 $('#myModalPop').modal("hide"); 467 ShowSuccessMessage(result.statusMessage, function yes() { 468 window.location.reload(true) 469 }); 470 }, 471 error: function (xhr, status, error) { 472 HideLoader(); 473 console.log(xhr.responseText); 474 } 475 }); 476 } 477 else { 478 HideLoader(); 479 $("#file_UserError").show(); 480 $("#txtEmailId_UserError").show(); 481 $("#txtMobileNumber_UserError").show(); 482 } 483 484 } 485 catch (err) { 486 HideLoader(); 487 } 488}) 489 490$('.clsModel').click(function () { 491 492 $("#file_UserError").hide(); 493 $("#txtEmailId_UserError").hide(); 494 $("#txtMobileNumber_UserError").hide(); 495 496 $(".modal-body input").val(""); 497 498}) 499 500$('.txtvalidate').keypress(function (e) { 501 502 var keyentered = e.keyCode || e.which; 503 keyentered = String.fromCharCode(keyentered); 504 505 var numberRegex = /[0-9]|\./; 506 507 if (numberRegex.test(keyentered)) { 508 return true; 509 } 510 else { 511 return false; 512 } 513}) 514 515//Upgrade to keys; 516$('#btnUpgrade').on('click', function () { 517 try { 518 ShowLoader(); 519 HideErrors(); 520 521 $.ajax({ 522 url: "/DashBoard/UpgradeToKeys", 523 type: "POST", 524 data: JSON.stringify({}), // required for JSON POST 525 contentType: "application/json; charset=utf-8", 526 success: function (e) { 527 HideLoader(); 528 if (e.statusCode === 3) { 529 ShowWarningMessage(e.statusMessage); 530 } 531 else if (e.statusCode == 200) { 532 HideErrors(); 533 window.location.href = e.statusMessage; 534 } 535 else { 536 ShowErrorMessage(e.statusMessage); 537 } 538 }, 539 error: function (xhr, status, error) { 540 HideLoader(); 541 console.log("Error:", xhr.responseText); 542 } 543 }); 544 } catch (err) { 545 HideLoader(); 546 console.log("JS error:", err.message); 547 } 548}); 549
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.