PageSourceSearch

https://keys.app/js/site.js

js keys.app collected 2026-09-24 13:54:49 UTC 17,316 bytes, 541 lines download raw bytes

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.