PageSourceSearch

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

js keys.app collected 2026-10-02 00:26:33 UTC 17,815 bytes, 549 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    // 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.