PageSourceSearch

https://billing.faveohelpdesk.com/login

html faveohelpdesk.com collected 2026-09-24 17:34:35 UTC 168,997 bytes, 3,697 lines download raw bytes

1<!DOCTYPE html>
2<html dir="ltr">
3<head>
4    <style>
5        .swal2-popup {
6            margin:0 !important;
7        }
8        .swal2-title{
9            padding-left:0 !important;
10            padding-bottom:0 !important;
11        }
12
13
14        .swal2-html-container{
15            padding-left:0 !important;
16            padding-right:0 !important;
17        }
18
19
20        .custom-confirm,
21        .custom-cancel {
22            min-width: 100px;
23        }
24
25        .list-styled.columns-lg-2.px-2 li a {
26            color: #777 !important; /* Set the anchor text color to black */
27        }
28        .product-thumbnail-remove, .btn-remove{
29            cursor: pointer;
30        }
31    .page-transition-active {
32    opacity: 1 !important; /* Setting the opacity to 1 for full visibility */
33}
34        .tooltip {
35            pointer-events: none;
36        }
37
38        .popover {
39            pointer-events: auto; /* allow interaction in popovers */
40        }
41.custom-input {
42    border: 1px solid transparent;
43    border-radius: 4px;
44    padding: 11.2px 16px;
45    color: #777;
46    width: 86%;
47
48}
49        .custom-input.newsletterEmail.is-invalid {
50            border-color: #dc3545 !important;
51        }
52
53.custom-input:focus {
54    border-color: #777;
55    outline: none;
56}
57
58        .markdown-output p {
59            color: #000; /* Change color to black */
60        }
61
62
63/*This is added because of the eye icon is automatically added in edge browser*/
64        input[type="password"]::-ms-reveal {
65            display: none !important;
66        }
67
68        .form-control.is-invalid {
69            background-image: none !important;
70        }
71
72        .form-control.is-valid {
73            background-image: none !important;
74        }
75        .custom-pills{
76            margin-left: -5px;
77            margin-top: -5px;
78            background-color: #ed5348;
79        }
80
81
82</style>
83
84            <!-- Basic -->
85    <meta charset="utf-8">
86    <meta name="viewport" content="width=device-width, initial-scale=1">
87
88    <title>    Login | Register
89 | Faveo Store</title>
90
91    <meta name="keywords" content="Faveo" />
92    <meta name="description" content="Faveo">
93    <meta name="author" content="Sakthivel Munusami">
94
95    <!-- Favicon -->
96            <link rel="shortcut icon"  href='https://billing.faveohelpdesk.com/preview-file?path=common/images/favicon.ico' type="image/x-icon" />
97        <!-- Mobile Metas -->
98    <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, shrink-to-fit=no">
99    <meta name="csrf-token" content="BcBmvP8gMD3xKbgQehf17Mr6qGz5D4eLdegBk0rV" />
100
101    <!-- Web Fonts  -->
102    <link id="googleFonts" href="https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700,800%7CShadows+Into+Light&display=swap" rel="stylesheet" type="text/css">
103    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
104    
104<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
104
105
106    <!-- Vendor CSS -->
107
108    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/animate.compat.css">
109    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/simple-line-icons.min.css">
110    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/owl.carousel.min.css">
111    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/owl.theme.default.min.css">
112    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/magnific-popup.min.css">
113    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/admin/css-1/flag-icons.min.css">
114
115    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/all.min.css">
116    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/admin/css-1/sweet-alert-ltr.css">
117    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/bootstrap.min.css">
118    <link id="default-styles" rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/theme.css">
119    <link id="default-styles-2" rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/theme-elements.css">
120    <link id="default-styles-3" rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/theme-blog.css">
121    <link id="default-styles-4" rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/theme-shop.css">
122
123
124
125    <!-- Demo CSS -->
126    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/demo-transportation-logistic.css">
127
128    <!-- Skin CSS -->
129    <link id="skinCSS" rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/skin-transportation-logistic.css">
130
131    <!-- Theme Custom CSS -->
132    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/client/porto/css-2/custom.css">
133
134    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/common/intl-tel-input/css/intlTelInput.css">
135
136    <!-- Head Libs -->
137    
137<script src="https://billing.faveohelpdesk.com/client/porto/js-2/modernizr.min.js"></script>
137
138    
138<script src="https://billing.faveohelpdesk.com/client/js/modernizr.min.js"></script>
138
139
140    <!--
140<script src="https://billing.faveohelpdesk.com/common/js/jquery-2.1.4.js" type="text/javascript"></script>
140-->
141
142
143    <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/1.10.12/css/jquery.dataTables.min.css" />
144    
144<script src="//cdn.datatables.net/1.13.7/js/jquery.dataTables.min.js"></script>
144
145    
145<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
145
146
147    
147<script>
148    /**
149 * Enhanced reCAPTCHA Manager - Singleton for handling v2, v2-invisible and v3 per form
150 *
151 * Usage Examples:
152 *
153 * 1. Initialize on specific elements with different modes:
154 * const captcha1 = await RecaptchaManager.init(document.getElementById('captcha-container-1'), {
155 *   mode: 'v2',
156 *   v2SiteKey: 'YOUR_V2_SITE_KEY'
157 * });
158 * const captcha2 = await RecaptchaManager.init(document.getElementById('captcha-container-2'), {
159 *   mode: 'v2-invisible',
160 *   v2SiteKey: 'YOUR_V2_SITE_KEY'
161 * });
162 * const captcha3 = await RecaptchaManager.init(document.getElementById('captcha-container-3'), {
163 *   mode: 'v3',
164 *   v3SiteKey: 'YOUR_V3_SITE_KEY'
165 * });
166 *
167 * 2. Disable reCAPTCHA entirely:
168 * const disabledCaptcha = await RecaptchaManager.init(document.getElementById('captcha-container'), {
169 *   disabled: true
170 * });
171 *
172 * 3. Get tokens when needed:
173 * const token1 = await captcha1.getToken(); // v2 token
174 * const token2 = await captcha2.getToken(); // v2 invisible token (auto-executes)
175 * const token3 = await captcha3.getToken('login_form'); // v3 token
176 * const disabledToken = await disabledCaptcha.getToken(); // returns null immediately
177 *
178 * 4. Handle failed verification (reset v2 widget):
179 * captcha1.reset();
180 * captcha2.reset();
181 *
182 * 5. Global configuration with disabled option:
183 * RecaptchaManager.setGlobalConfig({
184 *   v2SiteKey: 'YOUR_V2_SITE_KEY',
185 *   v3SiteKey: 'YOUR_V3_SITE_KEY',
186 *   defaultMode: 'v2-invisible',
187 *   disabled: true, // Globally disable all reCAPTCHA
188 *   theme: 'dark',
189 *   size: 'invisible',
190 *   badge: 'bottomright',
191 *   tabindex: 0,
192 *   isolated: false,
193 *   debug: true
194 * });
195 */
196
197var RecaptchaManager = (function() {
198    var instance = null;
199
200    function getInstance() {
201        if (!instance) {
202            instance = new RecaptchaManagerClass();
203        }
204        return instance;
205    }
206
207    // Constructor
208    function RecaptchaManagerClass() {
209        if (instance) {
210            throw new Error('RecaptchaManager is a singleton. Use RecaptchaManager.getInstance() instead.');
211        }
212
213        this.defaultConfig = {
214            theme: 'light',
215            size: 'normal',
216            badge: 'bottomright', // for invisible: bottomright, bottomleft, inline
217            tabindex: 0,
218            isolated: false,
219            debug: false,
220            fallback: false,
221            disabled: false, // NEW: disable reCAPTCHA entirely
222            lang: 'en', // NEW: language configuration
223            validationErrorMessage: 'reCAPTCHA validation failed. Please try again.',
224        };
225
226        this.globalSiteKeys = {
227            v2: null,
228            v3: null
229        };
230
231        this.defaultMode = null;
232        this.globalDisabled = false; // NEW: global disable flag
233
234        this.scripts = {
235            v2: { loaded: false, loading: null },
236            v3: { loaded: false, loading: null }
237        };
238
239        this.instances = new Map(); // Track all instances
240        this.instanceCounter = 0;
241    }
242
243    /**
244     * Set global configuration including default mode and site keys
245     */
246    function setGlobalConfig(config) {
247        var manager = getInstance();
248
249        if (config.v2SiteKey !== undefined) { manager.globalSiteKeys.v2 = config.v2SiteKey; }
250        if (config.v3SiteKey !== undefined) { manager.globalSiteKeys.v3 = config.v3SiteKey; }
251        if (config.defaultMode !== undefined) { manager.defaultMode = config.defaultMode; }
252        if (config.disabled !== undefined) { manager.globalDisabled = config.disabled; } // NEW
253        if (config.theme !== undefined) { manager.defaultConfig.theme = config.theme; }
254        if (config.size !== undefined) { manager.defaultConfig.size = config.size; }
255        if (config.badge !== undefined) { manager.defaultConfig.badge = config.badge; }
256        if (config.tabindex !== undefined) { manager.defaultConfig.tabindex = config.tabindex; }
257        if (config.isolated !== undefined) { manager.defaultConfig.isolated = config.isolated; }
258        if (config.debug !== undefined) { manager.defaultConfig.debug = config.debug; }
259        if (config.fallback !== undefined) { manager.defaultConfig.fallback = config.fallback; }
260        if (config.lang !== undefined) { manager.defaultConfig.lang = config.lang; } // NEW
261        if (config.validationErrorMessage !== undefined) { manager.defaultConfig.validationErrorMessage = config.validationErrorMessage; }
262
263        manager.log('Global configuration updated', config);
264    }
265
266    /**
267     * Legacy method for backward compatibility
268     */
269    function setGlobalSiteKeys(v2SiteKey, v3SiteKey) {
270        var manager = getInstance();
271        manager.globalSiteKeys.v2 = v2SiteKey || null;
272        manager.globalSiteKeys.v3 = v3SiteKey || null;
273        manager.log('Global site keys updated');
274    }
275
276    /**
277     * Initialize reCAPTCHA on a container element
278     */
279    function init(containerElement, config) {
280        var manager = getInstance();
281
282        if (!containerElement || !(containerElement instanceof HTMLElement)) {
283            return Promise.reject(new Error('A valid containerElement must be provided.'));
284        }
285
286        config = config || {};
287        var instanceConfig = {};
288        for (var key in manager.defaultConfig) {
289            if (manager.defaultConfig.hasOwnProperty(key)) {
290                instanceConfig[key] = manager.defaultConfig[key];
291            }
292        }
293        for (var key2 in config) {
294            if (config.hasOwnProperty(key2)) {
295                instanceConfig[key2] = config[key2];
296            }
297        }
298
299        var instanceId = ++manager.instanceCounter;
300
301        // NEW: Check if reCAPTCHA is disabled globally or for this instance
302        var isDisabled = manager.globalDisabled || instanceConfig.disabled;
303
304        if (isDisabled) {
305            manager.log('Instance ' + instanceId + ' created in disabled mode - no scripts will be loaded');
306
307            var disabledInstance = {
308                id: instanceId,
309                container: containerElement,
310                config: instanceConfig,
311                mode: 'disabled',
312                v2WidgetId: null,
313                v2Token: null,
314                resolveV2: null,
315                rejectV2: null,
316                disabled: true
317            };
318
319            // Clear container and optionally show disabled message
320            containerElement.innerHTML = instanceConfig.showDisabledMessage ?
321                '<div class="recaptcha-disabled-message">reCAPTCHA is disabled</div>' : '';
322
323            var recaptchaInstance = new RecaptchaInstance(disabledInstance, manager);
324            manager.instances.set(instanceId, recaptchaInstance);
325
326            return Promise.resolve(recaptchaInstance);
327        }
328
329        // Use global default mode if not specified in config
330        var mode = config.mode || manager.defaultMode;
331
332        if (!mode || !['v2', 'v2-invisible', 'v3'].includes(mode)) {
333            return Promise.reject(new Error('Mode must be specified either in config or as global default ("v2", "v2-invisible", or "v3")'));
334        }
335
336        instanceConfig.mode = mode;
337
338        var instance = {
339            id: instanceId,
340            container: containerElement,
341            config: instanceConfig,
342            mode: instanceConfig.mode,
343            v2WidgetId: null,
344            v2Token: null,
345            resolveV2: null,
346            rejectV2: null,
347            disabled: false
348        };
349
350        return manager.loadRequiredScript(instanceConfig.mode, instanceConfig, config.forceReload)
351            .then(function() {
352                return manager.initializeInstance(instance);
353            })
354            .then(function() {
355                var recaptchaInstance = new RecaptchaInstance(instance, manager);
356                manager.instances.set(instanceId, recaptchaInstance);
357
358                manager.log('Instance ' + instanceId + ' initialized successfully in ' + instance.mode + ' mode');
359                return recaptchaInstance;
360            })
361            .catch(function(error) {
362                manager.logError('Failed to initialize instance ' + instanceId + ':', error);
363                throw error;
364            });
365    }
366
367    /**
368     * Load required script based on mode
369     */
370    RecaptchaManagerClass.prototype.loadRequiredScript = function(mode, config) {
371        if (mode === 'v2' || mode === 'v2-invisible') {
372            var v2SiteKey = config.v2SiteKey || this.globalSiteKeys.v2;
373            if (!v2SiteKey) {
374                return Promise.reject(new Error('v2SiteKey is required either in config or as global setting'));
375            }
376            return this.loadV2Script(config.lang); // Pass language parameter
377        } else if (mode === 'v3') {
378            var v3SiteKey = config.v3SiteKey || this.globalSiteKeys.v3;
379            var batch = config.badge === 'inline' ? 'inline' : (config.badge === 'bottomleft' ? 'bottomleft' : 'bottomright');
380            if (!v3SiteKey) {
381                return Promise.reject(new Error('v3SiteKey is required either in config or as global setting'));
382            }
383            return this.loadV3Script(v3SiteKey, batch, config.forceReload, config.lang); // Pass language parameter
384        }
385    };
386
387    /**
388     * Load v2 script
389     */
390    RecaptchaManagerClass.prototype.loadV2Script = function(lang) {
391        lang = lang || 'en';
392
393        if (this.scripts.v2.loaded) {
394            return Promise.resolve();
395        }
396        if (this.scripts.v2.loading) {
397            return this.scripts.v2.loading;
398        }
399
400        var self = this;
401        this.log('Loading reCAPTCHA v2 script...');
402
403        this.scripts.v2.loading = new Promise(function(resolve, reject) {
404            // Set up global callback before loading script
405            window.initRecaptchaV2Callback = function() {
406                self.log('reCAPTCHA v2 ready');
407                self.scripts.v2.loaded = true;
408                resolve();
409            };
410
411            var script = document.createElement('script');
412            script.src = 'https://www.google.com/recaptcha/api.js?onload=initRecaptchaV2Callback&render=explicit&hl=' + lang;
413            script.async = true;
414            script.defer = true;
415
416            script.onload = function() {
417                // Fallback if callback wasn't called
418                setTimeout(function() {
419                    if (!self.scripts.v2.loaded && window.grecaptcha && window.grecaptcha.render) {
420                        self.scripts.v2.loaded = true;
421                        resolve();
422                    }
423                }, 1000);
424            };
425
426            script.onerror = function() {
427                reject(new Error('Failed to load reCAPTCHA v2 script'));
428            };
429
430            document.head.appendChild(script);
431        });
432
433        return this.scripts.v2.loading;
434    };
435
436    /**
437     * Load v3 script
438     */
439    RecaptchaManagerClass.prototype.loadV3Script = function(siteKey, batch, forceReload, lang) {
440        lang = lang || 'en';
441
442        if (this.scripts.v3.loaded && !forceReload) {
443            return Promise.resolve();
444        }
445        if (this.scripts.v3.loading && !forceReload) {
446            return this.scripts.v3.loading;
447        }
448
449        var self = this;
450        this.log('Loading reCAPTCHA v3 script...');
451
452        if (forceReload) {
453            var existingScript = document.querySelector('script[src^="https://www.google.com/recaptcha/api.js?render="]');
454            if (existingScript) {
455                existingScript.remove();
456                this.scripts.v3.loaded = false;
457                this.scripts.v3.loading = null;
458            }
459        }
460
461        this.scripts.v3.loading = new Promise(function(resolve, reject) {
462            var script = document.createElement('script');
463            script.src = 'https://www.google.com/recaptcha/api.js?render=' + siteKey + '&badge=' + batch + '&hl=' + lang;
464            script.async = true;
465            script.defer = true;
466
467            script.onload = function() {
468                var checkReady = function() {
469                    if (window.grecaptcha && window.grecaptcha.ready) {
470                        window.grecaptcha.ready(function() {
471                            self.log('reCAPTCHA v3 ready');
472                            self.scripts.v3.loaded = true;
473                            resolve();
474                        });
475                    } else {
476                        setTimeout(checkReady, 100);
477                    }
478                };
479                checkReady();
480            };
481
482            script.onerror = function() {
483                reject(new Error('Failed to load reCAPTCHA v3 script'));
484            };
485
486            document.head.appendChild(script);
487        });
488
489        return this.scripts.v3.loading;
490    };
491
492    /**
493     * Initialize a specific instance
494     */
495    RecaptchaManagerClass.prototype.initializeInstance = function(instance) {
496        if (instance.mode === 'v2') {
497            return this.renderV2Widget(instance);
498        } else if (instance.mode === 'v2-invisible') {
499            return this.renderV2InvisibleWidget(instance);
500        } else if (instance.mode === 'v3') {
501            return this.renderV3Widget(instance);
502        }
503    };
504
505    /**
506     * Render v2 widget
507     */
508    RecaptchaManagerClass.prototype.renderV2Widget = function(instance) {
509        var self = this;
510        var config = instance.config;
511        var container = instance.container;
512
513        return this.waitForV2Ready().then(function() {
514            var widgetId = 'recaptcha-widget-' + instance.id;
515            container.innerHTML = '<div id="' + widgetId + '"></div>';
516
517            var widgetContainer = container.querySelector('#' + widgetId);
518            var siteKey = config.v2SiteKey || self.globalSiteKeys.v2;
519
520            try {
521                var renderParams = {
522                    sitekey: siteKey,
523                    theme: config.theme,
524                    size: config.size,
525                    tabindex: config.tabindex,
526                    isolated: config.isolated,
527                    callback: function(token) {
528                        instance.v2Token = token;
529                        if (instance.resolveV2) {
530                            instance.resolveV2(token);
531                            instance.resolveV2 = null;
532                        }
533                    },
534                    'expired-callback': function() {
535                        instance.v2Token = null;
536                        if (instance.rejectV2) {
537                            instance.rejectV2(new Error('reCAPTCHA expired'));
538                            instance.rejectV2 = null;
539                        }
540                    },
541                    'error-callback': function() {
542                        instance.v2Token = null;
543                        if (instance.rejectV2) {
544                            instance.rejectV2(new Error('reCAPTCHA error'));
545                            instance.rejectV2 = null;
546                        }
547                    }
548                };
549
550                instance.v2WidgetId = window.grecaptcha.render(widgetContainer, renderParams);
551
552                self.log('v2 widget rendered for instance ' + instance.id);
553            } catch (error) {
554                self.logError('Error rendering v2 widget:', error);
555                throw error;
556            }
557        });
558    };
559
560    /**
561     * Render v2 invisible widget
562     */
563    RecaptchaManagerClass.prototype.renderV2InvisibleWidget = function(instance) {
564        var self = this;
565        var config = instance.config;
566        var container = instance.container;
567
568        return this.waitForV2Ready().then(function() {
569
570            var globalBadge = document.querySelector('.grecaptcha-badge[data-hidden-by]');
571            if (globalBadge) {
572                globalBadge.style.display = '';
573                globalBadge.removeAttribute('data-hidden-by');
574            }
575
576            var siteKey = config.v2SiteKey || self.globalSiteKeys.v2;
577            var renderTarget;
578
579            if (config.badge === 'bottomright' || config.badge === 'bottomleft') {
580                var dummyContainerId = 'recaptcha-dummy-container-' + instance.id;
581                var dummyEl = document.getElementById(dummyContainerId);
582                if (!dummyEl) {
583                    dummyEl = document.createElement('div');
584                    dummyEl.id = dummyContainerId;
585                    document.body.appendChild(dummyEl);
586                }
587                renderTarget = dummyEl;
588                container.innerHTML = '';
589            } else {
590                var widgetId = 'recaptcha-invisible-widget-' + instance.id;
591                container.innerHTML = '<div id="' + widgetId + '"></div>';
592                renderTarget = container.querySelector('#' + widgetId);
593            }
594
595            try {
596                // --- Start of fix ---
597                var cleanupCallbacks = function() {
598                    instance.resolveV2 = null;
599                    instance.rejectV2 = null;
600                };
601
602                var renderParams = {
603                    sitekey: siteKey,
604                    size: 'invisible',
605                    theme: config.theme,
606                    badge: config.badge, // bottomright, bottomleft, inline
607                    tabindex: config.tabindex,
608                    isolated: config.isolated,
609                    callback: function(token) {
610                        instance.v2Token = token;
611                        if (instance.resolveV2) {
612                            instance.resolveV2(token);
613                        }
614                        cleanupCallbacks();
615                    },
616                    'expired-callback': function() {
617                        instance.v2Token = null;
618                        if (instance.rejectV2) {
619                            instance.rejectV2(new Error('reCAPTCHA challenge expired. Please try again.'));
620                        }
621                        cleanupCallbacks();
622                    },
623                    'error-callback': function() {
624                        instance.v2Token = null;
625                        if (instance.rejectV2) {
626                            // This handles the "Uncaught (in promise) null" case by ensuring a proper Error is always sent.
627                            instance.rejectV2(new Error('reCAPTCHA challenge failed or was closed by the user.'));
628                        }
629                        cleanupCallbacks();
630                    }
631                };
632
633                instance.v2WidgetId = window.grecaptcha.render(renderTarget, renderParams);
634                self.log('v2 invisible widget rendered for instance ' + instance.id);
635            } catch (error) {
636                self.logError('Error rendering v2 invisible widget:', error);
637                throw error;
638            }
639        });
640    };
641
642    /**
643     * Render v3 widget
644     */
645    RecaptchaManagerClass.prototype.renderV3Widget = function(instance) {
646        var self = this;
647        var container = instance.container;
648        var config = instance.config;
649
650        return this.waitForV3Ready().then(function() {
651            if (config.badge === 'inline') {
652                // Hide the global badge (only while inline mode is active)
653                var globalBadge = document.querySelector('.grecaptcha-badge');
654                if (globalBadge) {
655                    globalBadge.style.display = 'none';
656                    globalBadge.setAttribute('data-hidden-by', instance.id); // track who hid it
657                }
658
659                // Delay clone
660                setTimeout(function() {
661                    var originalBadge = document.querySelector('.grecaptcha-badge');
662                    if (originalBadge) {
663                        var badgeClone = originalBadge.cloneNode(true);
664                        badgeClone.style.position = 'static';
665                        badgeClone.style.marginTop = '10px';
666                        badgeClone.style.display = 'inline-block';
667                        badgeClone.style.transform = 'none';
668                        badgeClone.style.visibility = 'visible';
669                        badgeClone.classList.add('custom-recaptcha-badge');
670                        container.appendChild(badgeClone);
671
672                        self.log('v3 inline badge rendered for instance ' + instance.id);
673                    }
674                }, 500);
675            }
676
677            self.log('v3 widget rendered for instance ' + instance.id);
678        });
679    };
680
681    /**
682     * Wait for v2 to be ready
683     */
684    RecaptchaManagerClass.prototype.waitForV2Ready = function() {
685        var self = this;
686        return new Promise(function(resolve) {
687            var check = function() {
688                if (window.grecaptcha && window.grecaptcha.render) {
689                    resolve();
690                } else {
691                    setTimeout(check, 100);
692                }
693            };
694            check();
695        });
696    };
697
698    /**
699     * Wait for v3 to be ready
700     */
701    RecaptchaManagerClass.prototype.waitForV3Ready = function() {
702        var self = this;
703        return new Promise(function(resolve) {
704            var check = function() {
705                if (window.grecaptcha && window.grecaptcha.ready) {
706                    window.grecaptcha.ready(resolve);
707                } else {
708                    setTimeout(check, 100);
709                }
710            };
711            check();
712        });
713    };
714
715    /**
716     * Logging utilities
717     */
718    RecaptchaManagerClass.prototype.log = function() {
719        if (this.defaultConfig.debug) {
720            var args = Array.prototype.slice.call(arguments);
721            console.log.apply(console, ['[RecaptchaManager]'].concat(args));
722        }
723    };
724
725    RecaptchaManagerClass.prototype.logError = function() {
726        var args = Array.prototype.slice.call(arguments);
727        console.error.apply(console, ['[RecaptchaManager]'].concat(args));
728    };
729
730    // Public API
731    return {
732        getInstance: getInstance,
733        setGlobalConfig: setGlobalConfig,
734        setGlobalSiteKeys: setGlobalSiteKeys,
735        init: init
736    };
737})();
738
739/**
740 * Represents a single reCAPTCHA instance
741 */
742function RecaptchaInstance(internalState, manager) {
743    this.state = internalState;
744    this.manager = manager;
745    this.state.forceFallback = false;
746}
747
748/**
749 * Toggle fallback (switch to v2)
750 */
751RecaptchaInstance.prototype.useFallback = function(force = true) {
752    if (this.state.disabled) {
753        this.manager.log(`Instance ${this.state.id} is disabled - fallback skipped`);
754        return Promise.resolve();
755    }
756
757    if (!this.state.config.fallback) return Promise.resolve();
758
759    const v2SiteKey = this.state.config.v2SiteKey || this.manager.globalSiteKeys.v2;
760    if (!v2SiteKey) return Promise.resolve();
761
762    this.state.forceFallback = force;
763
764    const self = this;
765
766    if (force && this.state.mode === 'v3') {
767        return this.manager.loadV2Script(this.state.config.lang)
768            .then(() => self.manager.renderV2Widget(self.state))
769            .then(() => self.manager.log(`Instance ${self.state.id} switched to fallback (v2) mode`));
770    } else if (!force) {
771        return this.manager.renderV3Widget(this.state)
772            .then(() => self.manager.log(`Instance ${self.state.id} switched back to v3 mode`));
773    }
774
775    return Promise.resolve();
776};
777
778/**
779 * Uniform token retrieval
780 */
781RecaptchaInstance.prototype.getToken = function(action = 'default') {
782    if (this.state.disabled) {
783        this.manager.log(`Instance ${this.state.id} is disabled - returning null token`);
784        return Promise.resolve(null);
785    }
786
787    if (this.state.forceFallback || this.state.mode === 'v2') {
788        return this._getV2TokenSafe();
789    }
790
791    if (this.state.mode === 'v2-invisible') {
792        return this._getV2InvisibleTokenSafe();
793    }
794
795    if (this.state.mode === 'v3') {
796        return this._getV3TokenSafe(action);
797    }
798
799    this.manager.logError(`Invalid reCAPTCHA mode for instance ${this.state.id}`);
800    return Promise.resolve(null);
801};
802
803// --- Internal safe wrappers ---
804
805RecaptchaInstance.prototype._getV2TokenSafe = function() {
806    if (this.state.v2Token) return Promise.resolve(this.state.v2Token);
807    this.manager.log(`No v2 token available for instance ${this.state.id}`);
808    return Promise.resolve(null);
809};
810
811RecaptchaInstance.prototype._getV2InvisibleTokenSafe = function() {
812    const self = this;
813    return new Promise(resolve => {
814        self.getV2InvisibleToken()
815            .then(token => resolve(token))
816            .catch(error => {
817                self.manager.logError(`v2-invisible token failed for instance ${self.state.id}`, error);
818                resolve(null);
819            });
820    });
821};
822
823RecaptchaInstance.prototype._getV3TokenSafe = function(action) {
824    const self = this;
825    return new Promise(resolve => {
826        self.getV3Token(action)
827            .then(token => resolve(token))
828            .catch(error => {
829                self.manager.logError(`v3 token generation failed for instance ${self.state.id}`, error);
830                resolve(null);
831            });
832    });
833};
834
835/**
836 * Get v2 token (requires user interaction)
837 */
838RecaptchaInstance.prototype.getV2Token = function() {
839    return this.state.v2Token ? Promise.resolve(this.state.v2Token) : Promise.reject(new Error('No v2 token available'));
840};
841
842/**
843 * Get v2 invisible token (programmatically execute)
844 */
845RecaptchaInstance.prototype.getV2InvisibleToken = function() {
846    const self = this;
847    return new Promise((resolve, reject) => {
848        self.state.resolveV2 = resolve;
849        self.state.rejectV2 = reject;
850
851        try {
852            window.grecaptcha.execute(self.state.v2WidgetId)
853                .then(() => self.state.resolveV2())
854                .catch(error => {
855                    self.state.resolveV2 = null;
856                    self.state.rejectV2 = null;
857                    reject(error);
858                });
859            self.manager.log(`v2 invisible execution triggered for instance ${self.state.id}`);
860        } catch (error) {
861            self.state.resolveV2 = null;
862            self.state.rejectV2 = null;
863            reject(error);
864        }
865    });
866};
867
868/**
869 * Get v3 token (automatic execution)
870 */
871RecaptchaInstance.prototype.getV3Token = function(action) {
872    const siteKey = this.state.config.v3SiteKey || this.manager.globalSiteKeys.v3;
873    const self = this;
874
875    return window.grecaptcha.execute(siteKey, { action })
876        .then(token => {
877            self.manager.log(`v3 token generated for action: ${action}`);
878            return token;
879        })
880        .catch(error => {
881            self.manager.logError('v3 execution failed:', error);
882            throw error;
883        });
884};
885
886/**
887 * Validate token
888 */
889RecaptchaInstance.prototype.tokenValidation = function(action = 'default') {
890    const container = this.state.container || document.getElementById('recaptcha-container');
891
892    if (container && container.querySelector('.invalid-feedback')) {
893        container.querySelector('.invalid-feedback').remove();
894    }
895
896    if (this.state.disabled) return Promise.resolve(true);
897
898    const errorMessage = this.state.config.validationErrorMessage || 'reCAPTCHA validation failed. Please try again.';
899
900    return this.getToken(action)
901        .then(token => {
902            if (!token) throw new Error('No token received');
903            return token;
904        })
905        .catch(error => {
906            if (container) {
907                const errorEl = document.createElement('div');
908                errorEl.className = 'invalid-feedback d-block';
909                errorEl.textContent = errorMessage;
910                container.appendChild(errorEl);
911            }
912            return false;
913        });
914};
915
916/**
917 * Reset widget
918 */
919RecaptchaInstance.prototype.reset = function() {
920    if (this.state.disabled) {
921        this.manager.log(`Instance ${this.state.id} is disabled - reset skipped`);
922        return;
923    }
924
925    const isV2Mode = this.state.mode === 'v2' || this.state.mode === 'v2-invisible';
926    const isFallbackV2 = this.state.forceFallback && this.state.v2WidgetId !== null;
927
928    if ((isV2Mode || isFallbackV2) && this.state.v2WidgetId !== null) {
929        try {
930            window.grecaptcha.reset(this.state.v2WidgetId);
931            this.state.v2Token = null;
932            this.manager.log(`${isFallbackV2 ? 'fallback v2' : this.state.mode} widget ${this.state.id} reset`);
933        } catch (error) {
934            this.manager.logError(`Error resetting widget for instance ${this.state.id}:`, error);
935        }
936    }
937
938    this.state.resolveV2 = null;
939    this.state.rejectV2 = null;
940};
941
942/**
943 * Execute v2-invisible manually
944 */
945RecaptchaInstance.prototype.execute = function() {
946    if (this.state.disabled) {
947        this.manager.log(`Instance ${this.state.id} is disabled - execute returning null`);
948        return Promise.resolve(null);
949    }
950
951    if (this.state.mode !== 'v2-invisible') {
952        return Promise.reject(new Error('Execute method is only available for v2-invisible mode'));
953    }
954
955    return this._getV2InvisibleTokenSafe();
956};
957
958/**
959 * Get current mode
960 */
961RecaptchaInstance.prototype.getCurrentMode = function() {
962    return this.state.disabled ? 'disabled' : this.state.mode;
963};
964
965/**
966 * Check token availability
967 */
968RecaptchaInstance.prototype.hasToken = function() {
969    return this.state.disabled || this.state.v2Token !== null;
970};
971
972/**
973 * Check if disabled
974 */
975RecaptchaInstance.prototype.isDisabled = function() {
976    return !!this.state.disabled;
977};
978
979/**
980 * Get state info
981 */
982RecaptchaInstance.prototype.getState = function() {
983    return {
984        id: this.state.id,
985        mode: this.state.mode,
986        disabled: !!this.state.disabled,
987        hasV2Widget: this.state.v2WidgetId !== null,
988        v2Token: this.state.v2Token,
989        hasToken: this.hasToken(),
990        config: { ...this.state.config }
991    };
992};
993
994/**
995 * Destroy instance
996 */
997RecaptchaInstance.prototype.destroy = function() {
998    if (this.state.disabled) {
999        this.state.container.innerHTML = '';
1000        this.manager.instances.delete(this.state.id);
1001        this.manager.log(`Disabled instance ${this.state.id} destroyed`);
1002        return;
1003    }
1004
1005    if ((this.state.mode === 'v2' || this.state.mode === 'v2-invisible') && this.state.v2WidgetId !== null) {
1006        try { this.reset(); } catch (error) { this.manager.logError('Error during cleanup:', error); }
1007    }
1008
1009    this.state.container.innerHTML = '';
1010
1011    const inlineStyles = document.querySelector(`#recaptcha-inline-styles-${this.state.id}`);
1012    if (inlineStyles) inlineStyles.remove();
1013
1014    this.manager.instances.delete(this.state.id);
1015    this.manager.log(`Instance ${this.state.id} destroyed`);
1016};
1017
1018// Export for use
1019if (typeof module !== 'undefined' && module.exports) {
1020    module.exports = RecaptchaManager;
1021} else if (typeof window !== 'undefined') {
1022    window.RecaptchaManager = RecaptchaManager;
1023}
1024
1025    RecaptchaManager.setGlobalConfig({
1026        v2SiteKey: "6LdXGk0rAAAAAHiC8xapCGLn43aXGQcn_JpdkHn3",
1027        v3SiteKey: "6LeOQbIqAAAAAPHdccyIvZ3Lf_tw4d9TRlTUwxTZ",
1028        disabled: false,
1029        defaultMode: "v3",
1030        theme: "light",
1031        size: "normal",
1032        badge: "bottomright",
1033        isolated: false,
1034        fallback: true,
1035        debug: false,
1036        lang: "en",
1037        validationErrorMessage: "reCAPTCHA verification failed. Please try again."    });
1038</script>
1038
1039
1040    <style>
1041
1042        .sticky-header-active .d-sticky-header-negative-none {
1043            display: block !important;
1044        }
1045        #footer h1, #footer h2, #footer h3, #footer h4, #footer h5, #footer h6
1046        {
1047            color: black !important;
1048        }
1049        html .border-color-hover-dark:hover {
1050            border-color: lightgrey !important;
1051        }
1052    </style>
1053
1054</head>
1055<div class="modal fade" id="demo-req" tabindex="-1" role="dialog" aria-labelledby="demoModalLabel" aria-hidden="true">
1056
1057        <div class="modal-dialog">
1058                
1059            <form  id="demoForm">
1060            <div class="modal-content">
1061
1062                <div class="modal-header">
1063
1064                    <h4 class="modal-title" id="demoModalLabel">Book a Demo</h4>
1065
1066                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-hidden="true"></button>
1067                </div>
1068
1069
1070                <div class="modal-body">
1071                    <div id="alert-container-demo"></div>
1072                    <div class="row">
1073
1074                        <div class="col">
1075   
1076                                <div class="contact-form-success alert alert-success d-none mt-4">
1077
1078                                    <strong>Success!</strong> Your message has been sent to us.
1079                                </div>
1080
1081                                <div class="contact-form-error alert alert-danger d-none mt-4">
1082
1083                                    <strong>Error!</strong> There was an error sending your message.
1084
1085                                    <span class="mail-error-message text-1 d-block"></span>
1086                                </div>
1087
1088                                <div class="row">
1089
1090                                    <div class="form-group col-lg-6">
1091
1092                                        <label class="form-label mb-1 text-2">Name <span class="text-danger"> *</span> </label>
1093
1094                                        <input type="text" value="" data-msg-required="Please enter your name." maxlength="100" class="form-control text-3 h-auto py-2" name="demoname" id="demoname" required>
1095                                    </div>
1096
1097                                    <div class="form-group col-lg-6">
1098
1099                                        <label class="form-label mb-1 text-2">E-mail Address <span class="text-danger"> *</span></label>
1100
1101                                        <input type="email" value="" data-msg-required="Please enter your email address." data-msg-email="Please enter your email address." maxlength="100" class="form-control text-3 h-auto py-2" name="demoemail" id="demoemail" required>
1102                                    </div>
1103                                </div>
1104
1105                                <div class="row">
1106
1107                                    <div class="form-group col">
1108
1109                                        <label class="form-label mb-1 text-2">Mobile <span class="text-danger"> *</span></label>
1110
1111                                        <input type="hidden" name="country_code" id="mobile_code_hiddenDemo">
1112
1113                                        <input class="form-control input-lg" type="tel" name="Mobile" id="mobilenumdemo" required>
1114
1115                                        <input class="form-control input-lg" type="hidden" name="mobile_code" id="mobile_codeDemo" disabled="disabled">
1116                                        <span id="valid-msgdemo" class="hide"></span>
1117                                        <span id="error-msgdemo" class="hide"></span>
1118                                        <span id="mobile_codecheckdemo"></span>
1119                                    </div>
1120                                </div>
1121
1122                                <div class="row">
1123
1124                                    <div class="form-group col">
1125
1126                                        <label class="form-label mb-1 text-2">Message <span class="text-danger"> *</span></label>
1127
1128                                   <textarea maxlength="5000" data-msg-required="Please enter your message." rows="3" class="form-control" name="demomessage" id="demomessage" required></textarea>
1129                                    </div>
1130                                </div>
1131                                
1132                                  <!-- Honeypot fields (hidden) -->
1133                                <div style="display:none">
1134            <label for="ppXN5DPEjM5UFmGg1">Do not fill this field</label>
1135            <input type="text" name="demo[ppXN5DPEjM5UFmGg1]" id="ppXN5DPEjM5UFmGg1" autocomplete="off">
1136            <input type="hidden" name="demo[tpQJfNdUVbQ8RFd7N]" value="eyJpdiI6Ing4YjFaZ2ZrVFVRamNGb0RrWm55T1E9PSIsInZhbHVlIjoiNkRoTTlDV1YzWlM2VTNqc0F5VHR2UT09IiwibWFjIjoiN2FlMTI1OGQyOWZiMGUwY2RiODYxOWVmNGFkNjJkNTU4YjFmMzQ5ZDVhZGVjNGQ0OGNiOWJlMTFiNjg3MDk1YSIsInRhZyI6IiJ9">
1137        </div>
1138
1139                            <div id="row">
1140                                <div id="demo_recaptcha"></div>
1141                            </div>
1142                            <br>
1143                            
1144                        </div>
1145                    </div>
1146                </div>
1147
1148                <div class="modal-footer">
1149
1150                    <button type="button" class="btn btn-light" data-bs-dismiss="modal"><i class="fa fa-times">&nbsp;&nbsp;</i>Close</button>&nbsp;&nbsp;&nbsp;
1151
1152                    <button type="submit" class="btn btn-primary" name="demoregister" id="demoregister"><i class="fa fa-book">&nbsp;&nbsp;</i>
1152Book a Demo</button>
1153                </div>
1154            </div>
1155            </form>
1156        </div>
1157    </div>
1158
1159<script>
1160    let demoRecaptcha;
1161
1162    (async () => {
1163        const demoRecaptchaContainer = document.getElementById('demo_recaptcha');
1164
1165        demoRecaptcha = await RecaptchaManager.init(demoRecaptchaContainer, {
1166            action: 'demo',
1167        });
1168
1169        // Make them globally available
1170        window.demoRecaptcha = demoRecaptcha;
1171
1172    })();
1173</script>
1173
1174
1175
1176<script>
1177
1178    $(document).ready(function() {
1179        function placeErrorMessage(error, element, errorMapping = null) {
1180            if (errorMapping !== null && errorMapping[element.attr("name")]) {
1181                $(errorMapping[element.attr("name")]).html(error);
1182            } else {
1183                error.insertAfter(element);
1184            }
1185        }
1186        let alertTimeout;
1187
1188        function showAlert(type, messageOrResponse) {
1189
1190            // Generate appropriate HTML
1191            var html = generateAlertHtml(type, messageOrResponse);
1192
1193            // Clear any existing alerts and remove the timeout
1194            $('#alert-container-demo').html(html);
1195            clearTimeout(alertTimeout); // Clear the previous timeout if it exists
1196
1197            // Display alert
1198            window.scrollTo(0, 0);
1199
1200            // Auto-dismiss after 5 seconds
1201            alertTimeout = setTimeout(function() {
1202                $('#alert-container-demo .alert').slideUp(3000, function() {
1203                    // Then fade out after slideUp finishes
1204                    $(this).fadeOut('slow');
1205                });
1206            }, 5000);
1207        }
1208
1209
1210        function generateAlertHtml(type, response) {
1211            // Determine alert styling based on type
1212            const isSuccess = type === 'success';
1213            const iconClass = isSuccess ? 'fa-check-circle' : 'fa-ban';
1214            const alertClass = isSuccess ? 'alert-success' : 'alert-danger';
1215
1216            // Extract message and errors
1217            const message = response.message || response || 'An error occurred. Please try again.';
1218            const errors = response.errors || null;
1219
1220            // Build base HTML
1221            let html = `<div class="alert ${alertClass} alert-dismissible">` +
1222                `<i class="fa ${iconClass}"></i> ` +
1223                `${message}` +
1224                '<button type="button" class="btn-close" data-dismiss="alert" aria-hidden="true" ></button>';
1225
1226            html += '</div>';
1227
1228            return html;
1229        }
1230        $.validator.addMethod("validPhone", function(value, element) {
1231            return validatePhoneNumber(element);
1232        }, "Please enter a valid phone number");
1233
1234        $.validator.addMethod("regex", function(value, element, regexp) {
1235            var re = new RegExp(regexp);
1236            return this.optional(element) || re.test(value);
1237        }, "Invalid format.");
1238
1239        $('#demoForm').validate({
1240            rules: {
1241                demoname: {
1242                    required: true
1243                },
1244                demoemail: {
1245                    required: true,
1246                    regex: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
1247                },
1248                Mobile: {
1249                    required: true,
1250                    validPhone: true
1251                },
1252                demomessage: {
1253                    required: true
1254                }
1255            },
1256            messages: {
1257                demoname: {
1258                    required: "Please enter your name."
1259                },
1260                demoemail: {
1261                    required: "Please enter your email.",
1262                    regex: "Please enter a valid email address."
1263                },
1264                Mobile: {
1265                    required: "Please enter your mobile number. ",
1266                    validPhone: "Please enter a valid mobile number."
1267                },
1268                demomessage: {
1269                    required: "Please enter your message."
1270                }
1271            },
1272            unhighlight: function(element) {
1273                $(element).removeClass("is-valid");
1274            },
1275            errorPlacement: function(error, element) {
1276                var errorMapping = {
1277                    "Mobile": "#mobile_codecheckdemo",
1278                };
1279
1280                placeErrorMessage(error, element, errorMapping);
1281            }
1282        });
1283
1284        $('#demoForm').on('submit', async function(event) {
1285            event.preventDefault();
1286
1287            const $form = $(this);
1288
1289            const $submitButton = $('#demoregister');
1290
1291            if (!$form.valid()) {
1292                return;
1293            }
1294
1295            try {
1296                // Validate reCAPTCHA
1297                let recaptchaToken = await window.demoRecaptcha.tokenValidation("demo");
1298                if (!recaptchaToken) return;
1299
1300                $('#mobile_code_hiddenDemo').val('+' + $('#mobilenumdemo').attr('data-dial-code'));
1301                $('#mobilenumdemo').val($('#mobilenumdemo').val().replace(/\D/g, ''));
1302
1303                // Collect form data (filter out auto-injected g-recaptcha-response from v2 widget)
1304                let formData = $form.serializeArray().filter(field => field.name !== 'g-recaptcha-response');
1305
1306                if (!window.demoRecaptcha.isDisabled() && recaptchaToken) {
1307                    formData.push({ name: "g-recaptcha-response", value: recaptchaToken });
1308                    formData.push({ name: "page_id", value: window.pageId });
1309                }
1310
1311                // Submit form
1312                $.ajax({
1313                    url: "https://billing.faveohelpdesk.com/demo-request",
1314                    method: "POST",
1315                    data: $.param(formData),
1316                    beforeSend: function () {
1317                        $submitButton.prop("disabled", true).html($submitButton.data("loading-text"));
1318                    },
1319                    success: function (response) {
1320                        $form[0].reset();
1321                        showAlert('success', response.message);
1322                    },
1323                    error: async function (xhr) {
1324                        let response = xhr.responseJSON || JSON.parse(xhr.responseText || "{}");
1325
1326                        // Handle reCAPTCHA fallback
1327                        if (response.data?.show_v2_recaptcha) {
1328                            await window.demoRecaptcha.useFallback(true);
1329                            showAlert("error", response.message || "An unexpected error occurred.");
1330                            return;
1331                        }
1332
1333                        if (response.errors) {
1334                            $.each(response.errors, function (field, messages) {
1335                                if (["demo"].includes(field)) {
1336                                    showAlert("error", messages[0]);
1337                                    return;
1338                                }
1339                                validator.showErrors({ [field]: messages[0] });
1340                            });
1341                        } else {
1342                            showAlert("error", response.message || "An unexpected error occurred.");
1343                        }
1344                    },
1345                    complete: function () {
1346                        $submitButton.prop("disabled", false).html($submitButton.data("original-text"));
1347                        window.demoRecaptcha.reset();
1348                    }
1349                });
1350            } catch (err) {
1351                console.error("Form submit error:", err);
1352                showAlert("error", "Something went wrong. Please try again.");
1353            }
1354        });
1355    });
1356</script>
1356
1357
1358     
1359
1360
1361
1362 
1363<body>
1364
1365
1366<div class="body p-relative bottom-1" dir="ltr" >
1367
1368    <header id="header" class="header-effect-reveal" data-plugin-options="{'stickyEnabled': true, 'stickyEffect': 'reveal', 'stickyEnableOnBoxed': true, 'stickyEnableOnMobile': false, 'stickyChangeLogo': false, 'stickyStartAt': 200, 'stickySetTop': '-44px'}">
1369
1370        <div class="header-body border-0 border-bottom-light">
1371
1372            <div class="header-container container-fluid p-0">
1373
1374                <div class="header-row">
1375
1376                    <div class="header-column header-column-border-right flex-grow-0 d-sticky-header-active-none">
1377
1378                        <div class="header-row">
1379
1380                            <div id="main-logo" class="header-logo p-relative top-sm-40 top-30 m-0" style="width: 250px;height: 150px;text-align: center;">
1381
1382                                <a href="https://billing.faveohelpdesk.com/login">
1383
1384                                    <img alt="Logo" width="130" height="75" src="https://billing.faveohelpdesk.com/preview-file?path=images/faveo-logo-1_20240108.png">
1385                                </a>
1386                            </div>
1387                        </div>
1388                    </div>
1389
1390                    <div class="header-column">
1391
1392                        <div class="border-bottom-light w-100">
1393
1394                            <div class="hstack gap-4 px-4 py-2 font-weight-semi-bold d-none d-lg-flex">
1395                                                                    <div class="d-none d-lg-inline-block ps-1">
1396
1397                                        <a class="text-color-default text-color-hover-primary text-2" href="tel: +91 8047292860">
1398
1399                                            <i class="fas fa-phone text-4 p-relative top-2"></i> &nbsp;+91 8047292860
1400                                        </a>
1401                                    </div>
1402                                                                <div class="vr d-lg-inline-block opacity-2 d-none d-xl-inline-block"></div>
1403                                                                    <div class="d-none d-xl-inline-block">
1404
1405                                        <a class="text-color-default text-color-hover-primary text-2" href="mailto:[email protected]">
1406
1407                                            <i class="fas fa-envelope text-4 p-relative top-2"></i> &nbsp;[email protected]
1408                                        </a>
1409                                    </div>
1410                                                                <div class="ms-auto d-none d-lg-inline-block">
1411
1412                                </div>
1413                                
1414                                <div class="vr opacity-2 d-none d-lg-inline-block"></div>
1415
1416                                <div class="d-none d-lg-inline-block">
1417
1418                                    <ul class="nav nav-pills me-1">
1419                                                                                    <li class="nav-item pe-2 mx-1">
1420                                                <a href="https://www.facebook.com/faveohelpdesk" target="_blank" data-bs-toggle="tooltip" title="Facebook" class="text-color-default text-color-hover-primary text-4">
1421                                                    <i class="fab fa-facebook"></i>
1422                                                </a>
1423                                            </li>
1424                                                                                    <li class="nav-item pe-2 mx-1">
1425                                                <a href="https://www.linkedin.com/company/faveo" target="_blank" data-bs-toggle="tooltip" title="Linkedin" class="text-color-default text-color-hover-primary text-4">
1426                                                    <i class="fab fa-linkedin"></i>
1427                                                </a>
1428                                            </li>
1429                                                                                    <li class="nav-item pe-2 mx-1">
1430                                                <a href="https://x.com/faveohelpdesk" target="_blank" data-bs-toggle="tooltip" title="Twitter" class="text-color-default text-color-hover-primary text-4">
1431                                                    <i class="fab fa-twitter"></i>
1432                                                </a>
1433                                            </li>
1434                                                                                    <li class="nav-item pe-2 mx-1">
1435                                                <a href="https://www.instagram.com/faveohelpdesk" target="_blank" data-bs-toggle="tooltip" title="Instagram" class="text-color-default text-color-hover-primary text-4">
1436                                                    <i class="fab fa-instagram"></i>
1437                                                </a>
1438                                            </li>
1439                                                                                    <li class="nav-item pe-2 mx-1">
1440                                                <a href="https://www.youtube.com/@faveohelpdesk" target="_blank" data-bs-toggle="tooltip" title="Youtube" class="text-color-default text-color-hover-primary text-4">
1441                                                    <i class="fab fa-youtube"></i>
1442                                                </a>
1443                                            </li>
1444                                        
1445                                    </ul>
1446                                </div>
1447                            </div>
1448                        </div>
1449                        
1450                        <div class="header-row h-100">
1451
1452                            <div class="hstack h-100 w-100">
1453
1454                                <div class="h-100 w-100 w-xl-auto">
1455
1456                                    <div class="header-nav header-nav-links h-100 justify-content-end justify-content-lg-start me-4 me-lg-0 ms-lg-3">
1457
1458                                        <div class="header-nav-main header-nav-main-square header-nav-main-dropdown-no-borders header-nav-main-text-capitalize header-nav-main-text-size-4 header-nav-main-arrows header-nav-main-full-width-mega-menu header-nav-main-mega-menu-bg-hover header-nav-main-effect-5">
1459
1460                                            <nav class="collapse">
1461
1462                                                <ul class="nav nav-pills" id="mainNav">
1463
1464                                                    <li class="d-sticky-header-negative-none" style="display:none">
1465
1466                                                        <a class="nav-link" href="https://billing.faveohelpdesk.com/login">
1467
1468                                                            <img alt="Logo" width="75" height="50" src="https://billing.faveohelpdesk.com/preview-file?path=images/faveo-logo-1_20240108.png">
1469                                                        </a>
1470                                                    </li>
1471
1472
1473                                                    <li class="dropdown">
1474
1475                                                        <a class="nav-link dropdown-toggle " href="javascript:;">
1476                                                            &nbsp;Store&nbsp;
1477                                                        </a>
1478
1479                                                        <ul class="dropdown-menu border-light mt-n1">
1480                                                                                                                            <li>
1481                                                                    <a class="dropdown-item" href="https://billing.faveohelpdesk.com/group/1/2">Helpdesk Perpetual</a>
1482                                                                </li>
1483                                                                                                                            <li>
1484                                                                    <a class="dropdown-item" href="https://billing.faveohelpdesk.com/group/1/3">Helpdesk Recurring</a>
1485                                                                </li>
1486                                                                                                                            <li>
1487                                                                    <a class="dropdown-item" href="https://billing.faveohelpdesk.com/group/1/4">Servicedesk Perpetual </a>
1488                                                                </li>
1489                                                                                                                            <li>
1490                                                                    <a class="dropdown-item" href="https://billing.faveohelpdesk.com/group/1/5">Servicedesk Recurring</a>
1491                                                                </li>
1492                                                                                                                            <li>
1493                                                                    <a class="dropdown-item" href="https://billing.faveohelpdesk.com/group/1/7">Services</a>
1494                                                                </li>
1495                                                                                                                            <li>
1496                                                                    <a class="dropdown-item" href="https://billing.faveohelpdesk.com/group/1/12">Network Discovery</a>
1497                                                                </li>
1498                                                                                                                            <li>
1499                                                                    <a class="dropdown-item" href="https://billing.faveohelpdesk.com/group/1/14">Standard Add-Ons</a>
1500                                                                </li>
1501                                                                                                                            <li>
1502                                                                    <a class="dropdown-item" href="https://billing.faveohelpdesk.com/group/1/15">Pro Add-Ons</a>
1503                                                                </li>
1504                                                                                                                            <li>
1505                                                                    <a class="dropdown-item" href="https://billing.faveohelpdesk.com/group/1/16">Faveo Cloud - Helpdesk</a>
1506                                                                </li>
1507                                                                                                                            <li>
1508                                                                    <a class="dropdown-item" href="https://billing.faveohelpdesk.com/group/1/17">Faveo Cloud - Servicedesk</a>
1509                                                                </li>
1510                                                                                                                    </ul>
1511                                                    </li>
1512                                                    
1513                                                                                                            
1514                                                            <li class="dropdown">
1515                                                                                                                                                                                                        <a class="dropdown-item nav-link" href="https://billing.faveohelpdesk.com/contact-us">
1516                                                                                                                                                        Contact Us
1517                                                                            </a>
1518
1519                                                                                                                                        </li>
1520                                                                                                            
1521                                                    
1522                                                        <li>
1523                                                            <a class="nav-link active" href="https://billing.faveohelpdesk.com/login">Sign Up</a>
1524                                                        </li>
1525                                                                                                                                                                                                                    <li class="demo-icons">
1526                                                            <a class="nav-link btn open-createTenantDialog startFreeTrialBtn">START FREE TRIAL</a>
1527                                                        </li>
1528                                                                                                                </li>
1529                                                                                                                    <li class="demo-icons">
1530                                                                <a class="nav-link" id="demo-req">REQUEST FOR DEMO</a>
1531                                                            </li>
1532                                                                                                        </ul>
1533                                            </nav>
1534                                        </div>
1535                                        <div class="header-nav-features header-nav-features-no-border header-nav-features-lg-show-border order-1 order-lg-2 me-2 me-lg-0">
1536                                            <div class="header-nav-feature header-nav-features-cart d-inline-flex ms-2 mx-3">
1537                                                <a href="https://billing.faveohelpdesk.com/show/cart" class="header-nav-features-toggle text-decoration-none">
1538                                                    <span class="text-dark opacity-8 font-weight-bold text-color-hover-primary"> Cart</span>
1539                                                    <img src="https://billing.faveohelpdesk.com/client/porto/fonts/icon-cart.svg" width="14" alt="" class="header-nav-top-icon-img">
1540                                                    <span class="position-absolute top-0 start-100 translate-end badge rounded-pill custom-pills">0</span>
1541                                            </span>
1542                                                </a>
1543                                                <div class="header-nav-features-dropdown right-15" id="headerTopCartDropdown">
1544                                                    <ol class="mini-products-list">
1545                                                        
1546
1547                                                            
1548                                                           <div class="product-details d-flex justify-content-between align-items-center" style="margin-bottom: 20px;font-weight: 500;font-size: 13px;font-family: Poppins,sans-serif;letter-spacing: -0.12px;">
1549                                                            <span class="text-muted">0 ITEMS</span>
1550                                                                                                                         <a class="text-v-dark text-uppercase" href="https://billing.faveohelpdesk.com/login">View Cart</a>
1551                                                                                                                    </div>
1552
1553                                                        <hr style="border-top: 0.5px solid #ccc;">
1554
1555                                                        <span  style="display: block; text-align: center;">No products in the cart.</span>
1556
1557
1558                                                                                                                                                                    </ol>
1559
1560                                                </div>
1561                                            </div>
1562                                        </div>
1563                                        <div class="header-nav-features header-nav-features-no-border header-nav-features-lg-show-border order-1 order-lg-2 me-2 me-lg-0">
1564                                            <div class="header-nav-feature header-nav-features-cart d-inline-flex ms-2 mx-3">
1565                                                <a href="#" class="header-nav-features-toggle text-decoration-none">
1566                                                                                                        <i id="flagIcon" class="flag-icon flag-icon-us"></i>
1567                                                </a>
1568                                                <div class="header-nav-features-dropdown right-15" id="language-dropdown">
1569
1570                                                </div>
1571                                            </div>
1572                                        </div>
1573
1574                                        <button class="btn header-btn-collapse-nav" data-bs-toggle="collapse" data-bs-target=".header-nav-main nav">
1575
1576                                            <i class="fas fa-bars"></i>
1577                                        </button>
1578                                    </div>
1579                                </div>
1580
1581
1582                                <div class="vr opacity-2 ms-auto d-none d-lg-inline-block"></div>
1583
1584                                <div class="px-4 d-none d-lg-inline-block ws-nowrap">
1585                                                                            <a class="btn border-0 px-4 py-2 line-height-9 btn-tertiary me-2 open-createTenantDialog startFreeTrialBtn" style="color: white;">START FREE TRIAL</a>
1586                                                                                                                <a id="demo-req" class="btn border-0 px-4 py-2 line-height-9 btn-primary" style="color: white;">REQUEST FOR DEMO</a>
1587                                                                    </div>
1588                            </div>
1589                        </div>
1590                    </div>
1591                </div>
1592            </div>
1593        </div>
1594    </header>
1595    <div role="main" class=    main
1596>
1597
1598        <div class="custom-page-header border-bottom-light">
1599            <section class="page-header page-header-modern bg-color-light-scale-1 border-0 my-0">
1600                <div class="container my-3">
1601                    <div class="row">
1602                        <div class="col-md-12 align-self-center p-static order-2 text-center">
1603                            <h1 class="font-weight-bold text-10 text-dark">    Sign in or Register
1604</h1>
1605                        </div>
1606                        <div class="col-md-12 align-self-center order-1">
1607                            <ul class="breadcrumb breadcrumb-light d-block text-center">
1608                                             <li><a class="text-primary" href="https://billing.faveohelpdesk.com/login">Home</a></li>
1609         <li class="active text-dark">Sign In &nbsp;&nbsp;Or&nbsp;&nbsp; Register</li>
1610                            </ul>
1611                        </div>
1612                    </div>
1613                </div>
1614            </section>
1615        </div>
1616        <br>
1617
1618        <div class="container">
1619            
1620            
1621                                                    
1622            <!--fail message -->
1623                        
1624
1625            <div class="modal fade" id="domain">
1626    <div class="modal-dialog">
1627        <div class="modal-content">
1628            <div class="modal-header">
1629                <h4 class="modal-title">Enter Domain</h4>
1630               <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
1631                
1632            </div>
1633            <div class="modal-body">
1634                <!-- Form  -->
1635                <form method="GET" action="https://billing.faveohelpdesk.com/checkout" id="domain1">
1636
1637                   
1638              
1639            </div>
1640            <div class="modal-footer">
1641                <button type="button" id="close" class="btn btn-default pull-left" data-dismiss="modal">Close</button>
1642                <input type="submit" class="btn btn-primary" value="Save">
1643            </div>
1644             </form>
1645
1646
1647            <!-- /Form -->
1648        </div><!-- /.modal-content -->
1649    </div><!-- /.modal-dialog -->
1650</div><!-- /.modal -->
1651                    <style>
1652  .bootstrap-select.btn-group .btn .filter-option 
1653  {
1654      font-weight: normal;
1655  }
1656        .required:after{
1657            content:'*';
1658            color:red;
1659            padding-left:0px;
1660        }
1661
1662
1663        
1664
1665        .wizard-inner
1666        {
1667            display:none;
1668        }
1669
1670        
1671
1672        .nav-tabs{
1673            border-bottom: none;
1674            margin: -5px;
1675        }
1676        .tab-content {
1677            border-radius: 0px;
1678            box-shadow: inherit;
1679
1680            border: none ;
1681            border-top: 0;
1682            /*padding: 15px;*/
1683        }
1684
1685        .open>.dropdown-menu {
1686            display: block;
1687            color:black;
1688        }
1689        .inner>.dropdown-menu{
1690            margin-top: 0px;
1691        }
1692        .bootstrap-select .dropdown-toggle .caret {
1693           display: none;
1694        }
1695
1696        .form-control:not(.form-control-sm):not(.form-control-lg) {
1697        /*font-size: 13.6px;
1698        font-size: 0.85rem;*/
1699        line-height: normal;
1700    }
1701        [dir="rtl"] #forgot_password_rtl{
1702            text-align:left !important;
1703            display:block !important;
1704        }
1705
1706
1707
1708    </style>
1709    
1710    <link rel="stylesheet" href="https://billing.faveohelpdesk.com/client/css/selectpicker.css" />
1711    <div id="alert-container"></div>
1712    <div class="row">
1713        <div class="col-md-12">
1714
1715            <section>
1716                <div class="col-md-12 tab-pane active">
1717                            <div class="featured-boxes">
1718                                <div id="error">
1719                                </div>
1720                                <div id="success">
1721                                </div>
1722                                <div id="fails">
1723                                </div>
1724                                <div id="alertMessage1"></div>
1725                                <div id="alertMessage2"></div>
1726                                <!-- <div id="error2">
1727                                </div>
1728                                <div id="alertMessage2" class="-text" ></div> -->
1729              
1730                                <div class="row justify-content-center">
1731                                          <div class="col-md-6 col-lg-6 mb-5 mb-lg-0 pe-5">
1732
1733                    <h2 class="font-weight-bold text-5 mb-0">Login</h2>
1734
1735                    <form method="POST" action="https://billing.faveohelpdesk.com/login" id="formoid"><input type="hidden" name="_token" value="BcBmvP8gMD3xKbgQehf17Mr6qGz5D4eLdegBk0rV">
1736
1737                        <div class="row">
1738
1739                            <div class="form-group col ">
1740
1741                                <label class="form-label text-color-dark text-3">Username or E-mail Address <span class="text-color-danger">*</span></label>
1742
1743                                <input class="form-control form-control-lg text-4" type="text" name="email_username" id="username" autocomplete="off" oninput="this.value = this.value.toLowerCase()" style="height: calc(1.5em + 0.75rem + 2px);">
1744                                <div id="error-login-email"></div>
1745                            </div>
1746                        </div>
1747
1748                        <div class="row">
1749
1750                            <div class="form-group col ">
1751
1752                                <label class="form-label text-color-dark text-3">Password <span class="text-color-danger">*</span></label>
1753
1754                                <div class="input-group">
1755                                    <input class="form-control form-control-lg text-4" type="password" name="password1" id="pass" style="height: calc(1.5em + 0.75rem + 2px);">
1756
1757                                        <span class="input-group-text" role="button" onclick="togglePasswordVisibility(this)">
1758                                            <i class="fa fa-eye-slash"></i>
1759                                        </span>
1760                                </div>
1761                                <div id="error-login-password"></div>
1762                            </div>
1763                        </div>
1764                                              <div style="display:none">
1765            <label for="p3MG2q3suqdPGpM4P">Do not fill this field</label>
1766            <input type="text" name="login[p3MG2q3suqdPGpM4P]" id="p3MG2q3suqdPGpM4P" autocomplete="off">
1767            <input type="hidden" name="login[tgeSKgWH8omrP6ADY]" value="eyJpdiI6Ikw2THk5VW5NalY4azNzWk9kMEYwVEE9PSIsInZhbHVlIjoiTXdTa1lId21PTDZkWVhVUWx1UlJmdz09IiwibWFjIjoiYzkxYTBhNjFlY2Y2ZTJhMTg0NDdhMWRjMWUwZDY2MDEyODc3M2YwMWMxMmQ3NzYyNmRmMjUyNjY0YmVkMzI4YyIsInRhZyI6IiJ9">
1768        </div>
1769
1770                                              <div class="row mb-3 align-items-center">
1771                                                  <div class="col-6">
1772                                                      <div class="custom-control custom-checkbox">
1773                                                          <input class="custom-control-input" type="checkbox" name="remember" id="rememberme" value="1">
1774                                                          <label class="custom-control-label text-2 cur-pointer" for="rememberme">
1775                                                              Remember Me
1776                                                          </label>
1777                                                      </div>
1778                                                  </div>
1779                                                  <div class="col-6">
1780                                                      <div class="" id="forgot_password_rtl" style="text-align: right; display: block;">
1781                                                          <a class="text-decoration-none text-color-primary font-weight-semibold text-2 text-break" id="forgot_password_link"
1782                                                             href="https://billing.faveohelpdesk.com/password/reset">
1783                                                              Forgot Password?
1784                                                          </a>
1785                                                      </div>
1786                                                  </div>
1787                                              </div>
1788                                              <div class="row mb-3 align-items-center">
1789                                                  <div id="login_recaptcha"></div>
1790                                              </div>
1791                        <div class="row">
1792
1793                            <div class="form-group col">
1794
1795                                <button type="submit" id="login-btn" class="btn btn-dark btn-modern w-100 text-uppercase font-weight-bold text-3 py-3" data-loading-text="Loading..." data-original-text="Login">Login</button>
1796                                                                                                                                                                                             </div>
1797                        </div>
1798                        </form>
1799                                          </div>
1800
1801                <div class="col-md-6 col-lg-6 ps-5">
1802
1803
1804                    <h2 class="font-weight-bold text-5 mb-0">Register</h2>
1805
1806                    <form name="registerForm" id="regiser-form">
1807
1808                        <div class="row">
1809
1810                            <div class="form-group col ">
1811
1812                                <label class="form-label text-color-dark text-3">First Name <span class="text-color-danger">*</span></label>
1813
1814                                <input class="form-control form-control-lg text-4" type="text" name="first_name" id="first_name" value>
1815                                <span id="first_namecheck"></span>
1816                            </div>
1817
1818                            <div class="form-group col ">
1819
1820                                <label class="form-label text-color-dark text-3">Last Name <span class="text-color-danger">*</span></label>
1821
1822                                <input class="form-control form-control-lg text-4" type="text" name="last_name" id="last_name">
1823                                <span id="last_namecheck"></span>
1824                            </div>
1825                        </div>
1826
1827                        <div class="row">
1828
1829                            <div class="form-group col ">
1830
1831                                <label class="form-label text-color-dark text-3">E-mail Address <span class="text-color-danger">*</span></label>
1832
1833                                <input class="form-control form-control-lg text-4" type="email" name="email" id="email" value>
1834                                <span id="emailcheck"></span>
1835                            </div>
1836                        </div>
1837
1838                        <div class="row">
1839
1840                            <div class="form-group col ">
1841
1842                                <label class="form-label text-color-dark text-3">Company Name <span class="text-color-danger">*</span></label>
1843
1844                                <input class="form-control form-control-lg text-4" type="text" name="company" id="company">
1845                                <span id="companycheck"></span>
1846                            </div>
1847                        </div>
1848
1849                        <div class="row">
1850
1851                            <div class="form-group col ">
1852
1853                                <label class="form-label text-color-dark text-3">Address <span class="text-color-danger">*</span></label>
1854
1855                                <textarea class="form-control form-control-lg text-4" name="address" id="address" rows="5"></textarea>
1856                                <span id="addresscheck"></span>
1857                            </div>
1858                        </div>
1859
1860                        <div class="row">
1861
1862                            <div class="form-group col ">
1863
1864                                <label class="form-label text-color-dark text-3">Country <span class="text-color-danger">*</span></label>
1865
1866                                                                <select class="form-select form-control h-auto py-2 selectpicker con" name="country" id="country" data-live-search-style="startsWith" data-live-search="true" data-live-search-placeholder="Search" data-dropup-auto="false" data-size="10" onchange="updateToMobile(this.value)"><option value="AF">Afghanistan</option><option value="AX">Aland Islands</option><option value="AL">Albania</option><option value="DZ">Algeria</option><option value="AS">American Samoa</option><option value="AD">Andorra</option><option value="AO">Angola</option><option value="AI">Anguilla</option><option value="AG">Antigua and Barbuda</option><option value="AR">Argentina</option><option value="AM">Armenia</option><option value="AW">Aruba</option><option value="AU">Australia</option><option value="AT">Austria</option><option value="AZ">Azerbaijan</option><option value="BS">The Bahamas</option><option value="BH">Bahrain</option><option value="BD">Bangladesh</option><option value="BB">Barbados</option><option value="BY">Belarus</option><option value="BE">Belgium</option><option value="BZ">Belize</option><option value="BJ">Benin</option><option value="BM">Bermuda</option><option value="BT">Bhutan</option><option value="BO">Bolivia</option><option value="BA">Bosnia and Herzegovina</option><option value="BW">Botswana</option><option value="BR">Brazil</option><option value="IO">British Indian Ocean Territory</option><option value="BN">Brunei</option><option value="BG">Bulgaria</option><option value="BF">Burkina Faso</option><option value="BI">Burundi</option><option value="KH">Cambodia</option><option value="CM">Cameroon</option><option value="CA">Canada</option><option value="CV">Cape Verde</option><option value="KY">Cayman Islands</option><option value="CF">Central African Republic</option><option value="TD">Chad</option><option value="CL">Chile</option><option value="CN">China</option><option value="CX">Christmas Island</option><option value="CC">Cocos (Keeling) Islands</option><option value="CO">Colombia</option><option value="KM">Comoros</option><option value="CG">Congo</option><option value="CD">Democratic Republic of the Congo</option><option value="CK">Cook Islands</option><option value="CR">Costa Rica</option><option value="CI">Cote D&#039;
1866Ivoire (Ivory Coast)</option><option value="HR">Croatia</option><option value="CU">Cuba</option><option value="CY">Cyprus</option><option value="CZ">Czech Republic</option><option value="DK">Denmark</option><option value="DJ">Djibouti</option><option value="DM">Dominica</option><option value="DO">Dominican Republic</option><option value="TL">Timor-Leste</option><option value="EC">Ecuador</option><option value="EG">Egypt</option><option value="SV">El Salvador</option><option value="GQ">Equatorial Guinea</option><option value="ER">Eritrea</option><option value="EE">Estonia</option><option value="ET">Ethiopia</option><option value="FK">Falkland Islands</option><option value="FO">Faroe Islands</option><option value="FJ">Fiji Islands</option><option value="FI">Finland</option><option value="FR">France</option><option value="GF">French Guiana</option><option value="PF">French Polynesia</option><option value="TF">French Southern Territories</option><option value="GA">Gabon</option><option value="GM">The Gambia </option><option value="GE">Georgia</option><option value="DE">Germany</option><option value="GH">Ghana</option><option value="GI">Gibraltar</option><option value="GR">Greece</option><option value="GL">Greenland</option><option value="GD">Grenada</option><option value="GP">Guadeloupe</option><option value="GU">Guam</option><option value="GT">Guatemala</option><option value="GG">Guernsey</option><option value="GN">Guinea</option><option value="GW">Guinea-Bissau</option><option value="GY">Guyana</option><option value="HT">Haiti</option><option value="HN">Honduras</option><option value="HK">Hong Kong S.A.R.</option><option value="HU">Hungary</option><option value="IS">Iceland</option><option value="IN">India</option><option value="ID">Indonesia</option><option value="IR">Iran</option><option value="IQ">Iraq</option><option value="IE">Ireland</option><option value="IL">Israel</option><option value="IT">Italy</option><option value="JM">Jamaica</option><option value="JP">Japan</option><option value="JE">Jersey</option><option value="JO">Jordan</option><option value="KZ">Kazakhstan</option><option value="KE">Kenya</option><option value="KI">Kiribati</option><option value="KP">North Korea</option><option value="KR">South Korea</option><option value="KW">Kuwait</option><option value="KG">Kyrgyzstan</option><option value="LA">Laos</option><option value="LV">Latvia</option><option value="LB">Lebanon</option><option value="LS">Lesotho</option><option value="LR">Liberia</option><option value="LY">Libya</option><option value="LI">Liechtenstein</option><option value="LT">Lithuania</option><option value="LU">Luxembourg</option><option value="MO">Macau S.A.R.</option><option value="MK">North Macedonia</option><option value="MG">Madagascar</option><option value="MW">Malawi</option><option value="MY">Malaysia</option><option value="MV">Maldives</option><option value="ML">Mali</option><option value="MT">Malta</option><option value="IM">Man (Isle of)</option><option value="MH">Marshall Islands</option><option value="MQ">Martinique</option><option value="MR">Mauritania</option><option value="MU">Mauritius</option><option value="YT">Mayotte</option><option value="MX">Mexico</option><option value="FM">Micronesia</option><option value="MD">Moldova</option><option value="MC">Monaco</option><option value="MN">Mongolia</option><option value="ME">Montenegro</option><option value="MS">Montserrat</option><option value="MA">Morocco</option><option value="MZ">Mozambique</option><option value="MM">Myanmar</option><option value="NA">Namibia</option><option value="NR">Nauru</option><option value="NP">Nepal</option><option value="BQ">Bonaire, Sint Eustatius and Saba</option><option value="NL">Netherlands</option><option value="NC">New Caledonia</option><option value="NZ">New Zealand</option><option value="NI">Nicaragua</option><option value="NE">Niger</option><option value="NG">Nigeria</option><option value="NU">Niue</option><option value="NF">Norfolk Island</option><option value="MP">Northern Mariana Islands</option><option value="NO">Norway</option><option value="OM">Oman</option><option value="PK">Pakistan</option><option value="PW">Palau</option><option value="PS">Palestinian Territory Occupied</option><option value="PA">Panama</option><option value="PG">Papua New Guinea</option><option value="PY">Paraguay</option><option value="PE">
1866Peru</option><option value="PH">Philippines</option><option value="PL">Poland</option><option value="PT">Portugal</option><option value="PR">Puerto Rico</option><option value="QA">Qatar</option><option value="RE">Reunion</option><option value="RO">Romania</option><option value="RU">Russia</option><option value="RW">Rwanda</option><option value="SH">Saint Helena</option><option value="KN">Saint Kitts and Nevis</option><option value="LC">Saint Lucia</option><option value="PM">Saint Pierre and Miquelon</option><option value="VC">Saint Vincent and the Grenadines</option><option value="BL">Saint-Barthelemy</option><option value="MF">Saint-Martin (French part)</option><option value="WS">Samoa</option><option value="SM">San Marino</option><option value="ST">Sao Tome and Principe</option><option value="SA">Saudi Arabia</option><option value="SN">Senegal</option><option value="RS">Serbia</option><option value="SC">Seychelles</option><option value="SL">Sierra Leone</option><option value="SG">Singapore</option><option value="SK">Slovakia</option><option value="SI">Slovenia</option><option value="SB">Solomon Islands</option><option value="SO">Somalia</option><option value="ZA">South Africa</option><option value="SS">South Sudan</option><option value="ES">Spain</option><option value="LK">Sri Lanka</option><option value="SD">Sudan</option><option value="SR">Suriname</option><option value="SJ">Svalbard and Jan Mayen Islands</option><option value="SZ">Eswatini</option><option value="SE">Sweden</option><option value="CH">Switzerland</option><option value="SY">Syria</option><option value="TW">Taiwan</option><option value="TJ">Tajikistan</option><option value="TZ">Tanzania</option><option value="TH">Thailand</option><option value="TG">Togo</option><option value="TK">Tokelau</option><option value="TO">Tonga</option><option value="TT">Trinidad and Tobago</option><option value="TN">Tunisia</option><option value="TR">Turkey</option><option value="TM">Turkmenistan</option><option value="TC">Turks and Caicos Islands</option><option value="TV">Tuvalu</option><option value="UG">Uganda</option><option value="UA">Ukraine</option><option value="AE">United Arab Emirates</option><option value="GB">United Kingdom</option><option value="US" selected="selected">United States</option><option value="UY">Uruguay</option><option value="UZ">Uzbekistan</option><option value="VU">Vanuatu</option><option value="VA">Vatican City State (Holy See)</option><option value="VE">Venezuela</option><option value="VN">Vietnam</option><option value="VG">Virgin Islands (British)</option><option value="VI">Virgin Islands (US)</option><option value="WF">Wallis and Futuna Islands</option><option value="EH">Western Sahara</option><option value="YE">Yemen</option><option value="ZM">Zambia</option><option value="ZW">Zimbabwe</option><option value="XK">Kosovo</option><option value="CW">Cura&ccedil;ao</option><option value="SX">Sint Maarten (Dutch part)</option></select>
1867                                <span id="countrycheck"></span>
1868                            </div>
1869                        </div>
1870
1871                        <div class="row">
1872
1873                            <div class="form-group col ">
1874
1875                                <label class="form-label text-color-dark text-3">Mobile <span class="text-color-danger">*</span></label>
1876
1877
1878                                <input class="form-control form-control-lg text-4" id="mobilenum" name="mobile" type="tel">
1879                                <input class="form-control form-control-lg text-4" type="hidden" name="mobile_code" id="mobile_code">
1880
1881                                <input type="hidden" name="mobile_country_iso" id="mobile_country_iso">
1882                                <span id="valid-msg" class="hide"></span>
1883                                <span id="error-msg" class="hide"></span>
1884                                <span id="mobile_codecheck"></span>
1885                                </div>
1886                        </div>
1887
1888                      <div class="form-row hidden">
1889                        <div class="form-group col">
1890                            <label for="state">State/County</label>
1891                            
1892                            <select class="form-control input-lg" name="state" id="state-list"><option value="UM-84">Howland Island</option><option value="DE">Delaware</option><option value="AK">Alaska</option><option value="MD">Maryland</option><option value="UM-81">Baker Island</option><option value="UM-89">Kingman Reef</option><option value="NH">New Hampshire</option><option value="UM-79">Wake Island</option><option value="KS">Kansas</option><option value="TX">Texas</option><option value="NE">Nebraska</option><option value="VT">Vermont</option><option value="UM-86">Jarvis Island</option><option value="HI">Hawaii</option><option value="GU">Guam</option><option value="VI">United States Virgin Islands</option><option value="UT">Utah</option><option value="OR">Oregon</option><option value="CA">California</option><option value="NJ">New Jersey</option><option value="ND">North Dakota</option><option value="KY">Kentucky</option><option value="MN">Minnesota</option><option value="OK">Oklahoma</option><option value="PA">Pennsylvania</option><option value="NM">New Mexico</option><option value="AS">American Samoa</option><option value="IL" selected="selected">Illinois</option><option value="MI">Michigan</option><option value="VA">Virginia</option><option value="UM-67">Johnston Atoll</option><option value="WV">West Virginia</option><option value="MS">Mississippi</option><option value="MP">Northern Mariana Islands</option><option value="UM">United States Minor Outlying Islands</option><option value="MA">Massachusetts</option><option value="AZ">Arizona</option><option value="CT">Connecticut</option><option value="FL">Florida</option><option value="DC">District of Columbia</option><option value="UM-71">Midway Atoll</option><option value="UM-76">Navassa Island</option><option value="IN">Indiana</option><option value="WI">Wisconsin</option><option value="WY">Wyoming</option><option value="SC">South Carolina</option><option value="AR">Arkansas</option><option value="SD">South Dakota</option><option value="MT">Montana</option><option value="NC">North Carolina</option><option value="UM-95">Palmyra Atoll</option><option value="PR">Puerto Rico</option><option value="CO">Colorado</option><option value="MO">Missouri</option><option value="NY">New York</option><option value="ME">Maine</option><option value="TN">Tennessee</option><option value="GA">Georgia</option><option value="AL">Alabama</option><option value="LA">Louisiana</option><option value="NV">Nevada</option><option value="IA">Iowa</option><option value="ID">Idaho</option><option value="RI">Rhode Island</option><option value="WA">Washington</option><option value="OH">Ohio</option></select>
1893
1894                            <span id="statecheck"></span>
1895                        </div>
1896
1897                    </div>
1898
1899                        <div class="row">
1900
1901                            <div class="form-group col ">
1902
1903                                <label class="form-label text-color-dark text-3">Password <span class="text-color-danger">*</span></label>
1904                                <div class="input-group">
1905                                    <input class="form-control form-control-lg text-4" type="password" name="password" id="password">
1906                                        <span class="input-group-text pointer" role="button" onclick="togglePasswordVisibility(this)">
1907                                            <i class="fa fa-eye-slash"></i>
1908                                        </span>
1909                                </div>
1910                                <span id="password1check"></span>
1911                            </div>
1912
1913                            <div class="form-group col ">
1914
1915                                <label class="form-label text-color-dark text-3">Re-enter Password <span class="text-color-danger">*</span></label>
1916                                <div class="input-group">
1917                                    <input class="form-control form-control-lg text-4" type="password" name="password_confirmation" id="confirm_pass">
1918                                        <span class="input-group-text pointer" role="button" onclick="togglePasswordVisibility(this)">
1919                                            <i class="fa fa-eye-slash"></i>
1920                                        </span>
1921                                </div>
1922                                <span id="conpasscheck"></span>
1923                            </div>
1924                        </div>
1925
1926                        <small class="text-sm text-muted" id="pswd_info" style="display: none;">
1927                            <span class="font-weight-bold">Your password must have:</span>
1928                            <ul class="pl-4">
1929                                                                    <li id="length" class="text-danger">Between 8-16 characters</li>
1930                                                                    <li id="letter" class="text-danger">Lowercase characters (a-z)</li>
1931                                                                    <li id="capital" class="text-danger">Uppercase characters (A-Z)</li>
1932                                                                    <li id="number" class="text-danger">Numbers (0-9)</li>
1933                                                                    <li id="space" class="text-danger">Special characters (~*!@$#%_+.?:,{ })</li>
1934                                                            </ul>
1935                        </small>
1936
1937                        <div style="display:none">
1938            <label for="pfJH8VGFchlVsIekk">Do not fill this field</label>
1939            <input type="text" name="registerForm[pfJH8VGFchlVsIekk]" id="pfJH8VGFchlVsIekk" autocomplete="off">
1940            <input type="hidden" name="registerForm[tllJ3sI0109E5zgV8]" value="eyJpdiI6IjdJTjZDWENsM1RSSks2dnhnSWpmM2c9PSIsInZhbHVlIjoiT1FaSU1oSmNJUEF0RjZGSUVOKzhjdz09IiwibWFjIjoiNGFiNmU2YmYwOGI0ODljMGU4MjQwMTA5YzE1YzY0YWQ5MTlhY2Q5ZjEwMTJmMTlkYzg2ZmRlOWQ2ZjVkODQ3YyIsInRhZyI6IiJ9">
1941        </div>
1942
1943                        <div class="row">
1944                                                                <div class="form-group col-md-auto">
1945                                    <div class="custom-control custom-checkbox" style="padding-right: 100px;">
1946                                        <input type="checkbox" value="false" name="terms" id="term" class="custom-control-input">
1947                                        <label class="custom-control-label text-2 cur-pointer" for="term">
1948                                            <a href="https://www.faveohelpdesk.com/terms-and-service/" target="_blank" id="agree_term_link" class="text-decoration-none">Agree to terms and conditions</a>
1949                                        </label>
1950                                        <br><span id="termscheck"></span>
1951                                    </div>
1952                                </div>
1953                                                    </div>
1954
1955                        <div class="row mb-3 align-items-center">
1956                            <div id="register_recaptcha"></div>
1957                        </div>
1958
1959                        <div class="row">
1960
1961                            <div class="form-group col">
1962                                <button type="submit" name="register" id="register" class="btn btn-dark btn-modern w-100 text-uppercase font-weight-bold text-3 py-3" data-loading-text="Loading..." data-original-text="Register">Register</button>
1963
1964                            </div>
1965                        </div>
1966                    </form>
1967                </div>
1968                                </div>
1969                            </div>
1970                        </div>
1971            </section>
1972        </div>
1973    </div>
1974
1975        </div>
1976
1977    </div>
1978
1979
1980
1981    
1982    <div class="modal fade" id="tenancy" data-backdrop="static" data-keyboard="false">
1983        <div class="modal-dialog">
1984            <div class="modal-content">
1985                <form method="POST"><input type="hidden" name="_token" value="BcBmvP8gMD3xKbgQehf17Mr6qGz5D4eLdegBk0rV">
1986                <div class="modal-header">
1987                    <h4 class="modal-title">Let&#039;s set up your own Faveo cloud instance together!</h4>
1988                </div>
1989
1990                <div class="modal-body">
1991                    <div id="success">
1992                    </div>
1993                    <div id="error">
1994                    </div>
1995                    <!-- Form  -->
1996
1997                    <div class="container">
1998                        <form action="" method="post" style="width:500px; margin: auto auto;" class="card card-body">
1999                            <input type="hidden" id="orderNo" name="order" value="117">
2000                            <div class="form-group">
2001                                <label><b>Please provide your domain name</b></label>
2002                                <div class="input-group mb-2">
2003                                    <input type="hidden"  name="order" id="orderId"/>
2004                                    <input type="text" name="domain" autocomplete="off" id="userdomainPurchase" class="form-control col 
2004col-7 rounded-0" placeholder="Domain" required>
2005                                    <input type="text" class="form-control col col-5 rounded-0" value=".faveocloud.com" disabled="true" style="background-color: #4081B5; color:white; border-color: #0088CC">
2006
2007                                </div>
2008                                <p id="validationMessagePurchase"></p>
2009                            </div>
2010                                <div class="row data-center">
2011                                    <div class="col col-12">
2012                                                                                    <div class="text-center">
2013                                                <p>Your data center location is <b data-nearest-center="">United States </b><!--<a role="button" href="javascript:void(0)" data-center-link="" aria-labelledby="data-center-text-label-dataCenter119678097062480"><b>Change</b></a>--></p>
2014                                            </div>
2015                                                                            </div>
2016                                </div>
2017                        </form>
2018                    </div>
2019                </div>
2020                
2020<script>
2021                    $(document).ready(function() {
2022                        $('#tenancy').on('show.bs.modal', function (event) {
2023                            var button = $(event.relatedTarget); // Button that triggered the modal
2024                            var myData = button.data('mydata'); // Extract info from data-* attributes
2025
2026                            // Update the modal content with the data
2027                            $('#orderId').val(myData);
2028                        });
2029                    });
2030                </script>
2030
2031                
2031<script>
2032                    $(document).ready(function() {
2033                        $.ajax({
2034                            url: 'https://billing.faveohelpdesk.com/api/domain',
2035                            method: 'GET',
2036                            dataType: 'json',
2037                            success: function(data) {
2038                                if(data.data.length !== 0){
2039                                    $('.createtenancy').attr('disabled', false);
2040                                }
2041                                $('#userdomainPurchase').val(data.data);
2042                            },
2043                            error: function(error) {
2044                            }
2045                        });
2046                    });
2047                </script>
2047
2048                <div class="modal-footer">
2049                    <button type="button" class="btn btn-default pull-left closebutton" id="closebutton" data-dismiss="modal"><i class="fa fa-times">&nbsp;&nbsp;</i>Close</button>
2050                    <button type="submit"  class="btn btn-primary createtenancy" id="createtenancy" onclick="createtenancy()"><i class="fa fa-check">&nbsp;&nbsp;</i>Submit</button>
2051                    </form>
2052                </div>
2053                <!-- /Form -->
2054            </div><!-- /.modal-content -->
2055        </div><!-- /.modal-dialog -->
2056    </div><!-- /.modal -->
2057
2058
2059
2060
2061    <footer id="footer" class="position-relative bg-color-light-scale-1 border-top-0">
2062
2063        <div class="container">
2064            <div class="row" id="footer1">
2065
2066            </div>
2067        </div>
2068
2069
2070        <div class="footer-copyright bg-transparent">
2071
2072            <div class="container">
2073
2074                <hr class="bg-color-dark opacity-1">
2075
2076                <div class="row">
2077                    <div class="col mt-4 mb-4 pb-5">
2078
2079                        <p class="text-center text-3 mb-0 text-color-grey">Copyright © 2026 .
2080
2081                            <a href="https://www.faveohelpdesk.com" class="text-color-grey text-color-hover-primary font-weight-bold" target="_blank">Ladybird Web Solution Pvt Ltd. </a>
2082
2083                            All rights reserved. Powered by
2084
2085                            <a href="https://www.faveohelpdesk.com" class="text-color-grey text-color-hover-primary font-weight-bold" target="_blank">Faveo</a>
2086                        </p>
2087                    </div>
2088                </div>
2089            </div>
2090        </div>
2091    </footer>
2092</div>
2093
2094<!-- Vendor -->
2095<script src="https://billing.faveohelpdesk.com/client/porto/js-2/plugins.min.js"></script>
2095
2096
2097
2098<!--
2098<script src="https://billing.faveohelpdesk.com/client/js/jquery.min.js"></script>
2098-->
2099<script src="https://billing.faveohelpdesk.com/client/js/jquery.appear.min.js"></script>
vendor: 1 bytes, line 2099
2099
2100<script src="https://billing.faveohelpdesk.com/client/js/jquery.easing.min.js"></script>
vendor: 1 bytes, line 2100
2100
2101<script src="https://billing.faveohelpdesk.com/client/js/jquery-cookie.min.js"></script>
2101
2102<!-- 
2102<script src="https://billing.faveohelpdesk.com/client/js/popper.js"></script>
2102 -->
2103<!-- 
2103<script src="https://billing.faveohelpdesk.com/client/js/popper.min.js"></script>
2103 -->
2104<!--
2104<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
2104-->
2105
2106<!-- Popper JS -->
2107<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
2107
2108
2109<!-- Latest compiled JavaScript -->
2110<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
2110
2111
2112<!--
2112<script src="https://billing.faveohelpdesk.com/client/js/bootstrap.min.js"></script>
2112-->
2113<script src="https://billing.faveohelpdesk.com/client/js/common.min.js"></script>
vendor: 1 bytes, line 2113
2113
2114<script src="https://billing.faveohelpdesk.com/client/js/jquery.easy-pie-chart.min.js"></script>
vendor: 1 bytes, line 2114
2114
2115<script src="https://billing.faveohelpdesk.com/client/js/jquery.gmap.min.js"></script>
vendor: 1 bytes, line 2115
2115
2116<script src="https://billing.faveohelpdesk.com/client/js/jquery.lazyload.min.js"></script>
vendor: 1 bytes, line 2116
2116
2117<script src="https://billing.faveohelpdesk.com/client/js/jquery.isotope.min.js"></script>
vendor: 1 bytes, line 2117
2117
2118<script src="https://billing.faveohelpdesk.com/client/js/owl.carousel.min.js"></script>
vendor: 1 bytes, line 2118
2118
2119<script src="https://billing.faveohelpdesk.com/client/js/jquery.magnific-popup.min.js"></script>
vendor: 1 bytes, line 2119
2119
2120<script src="https://billing.faveohelpdesk.com/client/js/vide.min.js"></script>
2120
2121
2122<!-- Theme Base, Components and Settings -->
2123<script src="https://billing.faveohelpdesk.com/client/porto/js-2/theme.js"></script>
2123
2124
2125<!-- any custom js/effects can be defined in this -->
2126<script src="https://billing.faveohelpdesk.com/client/porto/js/custom.js"></script>
2126
2127
2128<!-- Theme Initialization Files -->
2129<script src="https://billing.faveohelpdesk.com/client/porto/js-2/theme.init.js"></script>
vendor: 1 bytes, line 2129
2129
2130<script src="https://billing.faveohelpdesk.com/common/intl-tel-input/js/intlTelInputWithUtils.js"></script>
2130
2131<!-- Current Page Vendor and Views -->
2132<script src="https://billing.faveohelpdesk.com/client/porto/js-2/view.contact.js"></script>
vendor: 1 bytes, line 2132
2132
2133<script src="https://billing.faveohelpdesk.com/common/js/helper.js"></script>
2133
2134
2135
2136<script type="text/javascript">
2137
2138window.pageId = crypto.randomUUID();
2139
2140var csrfToken = $('meta[name="csrf-token"]').attr('content');
2141
2142setInterval(refreshToken, 3600000);
2143
2144function refreshToken(){
2145    $.get("https://billing.faveohelpdesk.com/refresh-csrf").done(function(data){
2146        csrfToken = data.token;
2147        $.ajaxSetup({
2148            headers: {
2149                'X-CSRF-TOKEN': csrfToken
2150            }
2151        });
2152    });
2153}
2154
2155$(document).ready(function() {
2156    $.ajaxSetup({
2157        headers: {
2158            'X-CSRF-TOKEN': csrfToken
2159        }
2160    });
2161
2162    // Always allow email type only in lowercase
2163    document.addEventListener("input", function (event) {
2164        if (event.target.matches('input[type="email"]')) {
2165            event.target.value = event.target.value.toLowerCase();
2166        }
2167    });
2168});
2169
2170setTimeout(function() {
2171    $('.alert-success, .alert-danger').alert('close');
2172}, 10000);
2173
2174</script>
2174
2175
2176<script>
2177    $(document).ready(function() {
2178        // Enhanced mailchimp render function
2179        function mailchimp_render() {
2180            let mailChimpRecaptcha;
2181
2182            (async () => {
2183                const mailChimpRecaptchaContainer = document.getElementById('mailchimp_recaptcha');
2184
2185                if (mailChimpRecaptchaContainer) {
2186                    mailChimpRecaptcha = await RecaptchaManager.init(mailChimpRecaptchaContainer, {
2187                        action: 'mailChimp',
2188                    });
2189
2190                    // Make globally available
2191                    window.mailChimpRecaptcha = mailChimpRecaptcha;
2192                }
2193
2194                // Initialize jQuery validation after reCAPTCHA is ready
2195                initializeNewsletterValidation(mailChimpRecaptcha);
2196            })();
2197        }
2198
2199        // Initialize jQuery Validation Plugin
2200        function initializeNewsletterValidation(mailChimpRecaptcha) {
2201            // Wait for form to be available in DOM
2202            const checkForm = setInterval(() => {
2203                const $form = $('#newsletterForm');
2204                if ($form.length) {
2205                    clearInterval(checkForm);
2206                    setupJQueryValidation($form, mailChimpRecaptcha);
2207                }
2208            }, 100);
2209        }
2210
2211        function setupJQueryValidation($form, mailChimpRecaptcha) {
2212            // Initialize jQuery validation (without submitHandler)
2213            $form.validate({
2214                rules: {
2215                    newsletterEmail: {
2216                        required: true,
2217                        email: true
2218                    }
2219                },
2220                messages: {
2221                    newsletterEmail: {
2222                        required: "Email is required",
2223                        email: "Please enter a valid email address."
2224                    }
2225                },
2226                errorElement: "div",
2227                errorClass: "invalid-feedback",
2228                errorPlacement: function(error, element) {
2229                    element.siblings('.invalid-feedback').remove();
2230                    element.after(error);
2231                },
2232                highlight: function(element) {
2233                    $(element).addClass('is-invalid');
2234                },
2235                unhighlight: function(element) {
2236                    $(element).removeClass('is-invalid');
2237                }
2238            });
2239
2240            // Attach submit event manually
2241            $form.on("submit", async function(e) {
2242                e.preventDefault(); // prevent normal submit
2243                if (!$form.valid()) return; // run validation
2244
2245                const $mailchimpMessage = $("#mailchimp-message");
2246                const $submitBtn = $("#mailchimp-subscription");
2247
2248                $submitBtn.prop("disabled", true).html('Wait...');
2249
2250                try {
2251                    // Get reCAPTCHA token
2252                    let recaptchaToken = await window.mailChimpRecaptcha.tokenValidation(
2253                        "mailChimp"
2254                    );
2255
2256                    if (!recaptchaToken) {
2257                        $submitBtn.prop("disabled", false).html('GO');
2258                        return false;
2259                    }
2260
2261                    // Prepare form data
2262                    let formData = $form.serializeArray();
2263                    if (recaptchaToken && !window.mailChimpRecaptcha.isDisabled()) {
2264                        formData.push({ name: "g-recaptcha-response", value: recaptchaToken });
2265                        formData.push({ name: "page_id", value: window.pageId });
2266                    }
2267
2268                    // Submit via AJAX
2269                    $.ajax({
2270                        type: "POST",
2271                        url: "https://billing.faveohelpdesk.com/mail-chimp/subcribe",
2272                        data: $.param(formData),
2273                        success: function(data) {
2274                            e.target.reset();
2275                            $form.validate().resetForm();
2276                            showAlert($mailchimpMessage, "success", data.message);
2277                        },
2278                        error: async function(jqXHR) {
2279                            let response = jqXHR.responseJSON || {};
2280                            try {
2281                                if (!response && jqXHR.responseText) {
2282                                    response = JSON.parse(jqXHR.responseText);
2283                                }
2284                            } catch (err) {
2285                                response = {};
2286                            }
2287
2288                            // Handle reCAPTCHA fallback
2289                            if (response.data?.show_v2_recaptcha && window.mailChimpRecaptcha) {
2290                                await window.mailChimpRecaptcha.useFallback(true);
2291                                showAlert($mailchimpMessage, "error", response.message || "Unexpected error.");
2292                                return;
2293                            }
2294
2295                            const errorMsg = response.message || "An error occurred. Please try again.";
2296                            showAlert($mailchimpMessage, "error", errorMsg);
2297                        },
2298                        complete: function() {
2299                            $submitBtn.prop("disabled", false).html('GO');
2300                            window.mailChimpRecaptcha.reset();
2301                        }
2302                    });
2303                } catch (error) {
2304                    console.error("Newsletter submission error:", error);
2305                    showAlert($mailchimpMessage, "error", "An error occurred. Please try again.");
2306                    $submitBtn.prop("disabled", false).html('GO');
2307                }
2308            });
2309        }
2310
2311        function showAlert($container, type, message) {
2312            const alertType = type === "error" ? "danger" : type;
2313            const iconClass = alertType === "success" ? "fa-check-circle" : "fa-exclamation-triangle";
2314
2315            const $alertDiv = $(`
2316            <div class="alert alert-${alertType} alert-dismissible fade show" role="alert">
2317                <i class="fa ${iconClass} me-2"></i>${message}
2318                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
2319            </div>
2320        `);
2321
2322            $container.html($alertDiv);
2323
2324            // Auto-dismiss after 5 seconds
2325            setTimeout(() => {
2326                $alertDiv.fadeOut(300, function() {
2327                    $(this).remove();
2328                });
2329            }, 5000);
2330        }
2331
2332        // Load footer then render mailchimp
2333        $.ajax({
2334            type: "GET",
2335            url: "https://billing.faveohelpdesk.com/footer1",
2336            success: function(data) {
2337                const data1 = data['data']['footer1'];
2338                const data2 = data['data']['footer2'];
2339                const data3 = data['data']['footer3'];
2340                const target = document.getElementById('footer1');
2341
2342                [data1, data2, data3].forEach(html => {
2343                    if (html !== undefined) {
2344                        target.insertAdjacentHTML('beforeend', html);
2345                    }
2346                });
2347
2348                setTimeout(mailchimp_render, 100);
2349            },
2350            error: function(xhr, status, error) {
2351                console.error('Footer loading error:', error);
2352                setTimeout(mailchimp_render, 100);
2353            }
2354        });
2355    });
2356</script>
vendor: 1 bytes, line 2356
2356
2357<script>
2358    function removeItem(id) {
2359        $.ajax({
2360            type: "POST",
2361            url: "https://billing.faveohelpdesk.com/cart/remove",
2362            data: {
2363                id: id,
2364                _token: "BcBmvP8gMD3xKbgQehf17Mr6qGz5D4eLdegBk0rV"
2365            },
2366            success: function (data) {
2367                window.location.href = "https://billing.faveohelpdesk.com/show/cart";
2368            }
2369        });
2370    }
2371
2372
2373    $(document).ready(function(){
2374        $('.createTenant').attr('disabled',true);
2375        $('#userdomain').keyup(function(){
2376            if($(this).val().length ==0 || $(this).val().length>28)
2377                $('.createTenant').attr('disabled', true);
2378            else
2379                $('.createTenant').attr('disabled',false);
2380        })
2381    });
2382
2383    window.translations = {
2384        instance_successfully_created: "Your cloud instance has been created successfully. Please visit your website at :installationUrl. You will receive password on your registered email.",
2385        instance_not_created: "Your cloud instance has been successfully created but license installation failed.\u003Cb\u003E:reason.\u003C\/b\u003E Please visit your website at :installationUrl",
2386        domain_already_taken: "Domain already taken. Please select a different domain",
2387    };
2388
2389    function translate(key, values = {}) {
2390        let str = window.translations[key] || key;
2391        for (const [k, v] of Object.entries(values)) {
2392            str = str.replace(`:${k}`, v);
2393        }
2394        return str;
2395    }
2396
2397    function firstlogin(id)
2398    {
2399        const userRequiredFields = {
2400        name:"Please select a cloud product.",
2401
2402    };
2403
2404        const userFields = {
2405            name:$('#serviceType'),
2406        };
2407
2408
2409        // Clear previous errors
2410        Object.values(userFields).forEach(field => {
2411            field.removeClass('is-invalid');
2412            field.next().next('.error').remove();
2413
2414        });
2415
2416        let isValid = true;
2417
2418        const showError = (field, message) => {
2419            field.addClass('is-invalid');
2420            field.next().after(`<span class='error invalid-feedback'>${message}</span>`);
2421        };
2422
2423        // Validate required fields
2424        Object.keys(userFields).forEach(field => {
2425            if (!userFields[field].val()) {
2426                showError(userFields[field], userRequiredFields[field]);
2427                isValid = false;
2428            }
2429        });
2430
2431
2432        // If validation fails, prevent form submission
2433        if (!isValid) {
2434            e.preventDefault();
2435        }
2436
2437
2438
2439        $('#createTenant').attr('disabled',true)
2440        $("#createTenant").html("<i class='fas fa-circle-notch fa-spin'></i>  Please Wait...");
2441        var domain = $('#userdomain').val();
2442        var password = $('#password').val();
2443        var product = $('#serviceType').val();
2444        const alphanumeric = /^[a-zA-Z0-9]+$/;
2445        if ( !alphanumeric.test(domain)) {
2446
2447            var html = '<div class="alert alert-danger alert-dismissible"><button type="button" class="btn-close" data-dismiss="alert" aria-hidden="true"></button><strong>Whoops! </strong>Something went wrong<ul>';
2448            html += '<li>The Domain must only contain letters and numbers.</li>'
2449            document.getElementById('clouderror').innerHTML = html;
2450            $("#createTenant").html(" Submit");
2451            $('#createTenant').attr('disabled',false)
2452
2453        }else {
2454            $.ajax({
2455                type: 'POST',
2456                data: {'id': id, 'password': password, 'domain': domain, 'product': product},
2457                url: "https://billing.faveohelpdesk.com/first-login",
2458                success: function (data) {
2459                    $('#createTenant').attr('disabled', false)
2460                    $("#createTenant").html("<i class='fa fa-check'>&nbsp;&nbsp;</i>Submit");
2461                    if (data.status == 'validationFailure') {
2462
2463                        var html = '<div class="alert alert-danger alert-dismissible"><button type="button" class="btn-close" data-dismiss="alert" aria-hidden="true"></button><strong>Whoops! </strong>Something went wrong<ul>';
2464                        for (var key in data.message) {
2465                            html += '<li>' + data.message[key][0] + '</li>'
2466                        }
2467                        html += '</ul></div>';
2468                        $('#clouderror').show();
2469                        $('#cloudsuccess').hide();
2470                        document.getElementById('error').innerHTML = html;
2471                    } else if (data.status == 'false') {
2472                        $('#clouderror').show();
2473                        $('#cloudsuccess').hide();
2474                        var result = '<div class="alert alert-danger alert-dismissible"><button type="button" class="btn-close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true"></span></button><strong>Whoops! </strong>Something went wrong!!<br><ul><li>' + data.message + '</li></ul></div>';
2475                        $('#clouderror').html(result);
2476                    } else if (data.status == 'success_with_warning') {
2477                        $('#clouderror').show();
2478                        $('#cloudsuccess').hide();
2479                        var result = '<div class="alert alert-warning alert-dismissible"><button type="button" class="btn-close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true"></span></button><strong>Whoops! </strong><br><ul><li>' + translate('instance_not_created', {
2480                            'installationUrl': data.installationUrl,
2481                            'reason': data.reason
2482                        }) + '</li></ul></div>';
2483                        $('#clouderror').html(result);
2484                    } else {
2485                        $('#clouderror').hide();
2486                        $('#cloudsuccess').show();
2487                        var result = '<div class="alert alert-success alert-dismissible"><button type="button" class="btn-close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true"></span></button><strong>Success! </strong>' + translate('instance_successfully_created', {'installationUrl': data.installationUrl}) + '!</div>';
2488                        $('#cloudsuccess').html(result);
2489                    }
2490                }, error: function (response) {
2491                    $('#createTenant').attr('disabled', false)
2492                    $("#createTenant").html("<i class='fa fa-check'>&nbsp;&nbsp;</i>Submit");
2493                    $("#generate").html("<i class='fa fa-check'>&nbsp;&nbsp;</i>Submit");
2494
2495                    var html = '<div class="alert alert-danger alert-dismissible">' +
2496                        '<button type="button" class="btn-close" data-dismiss="alert" aria-hidden="true"></button>' +
2497                        '<strong>Whoops! </strong>Something went wrong<ul>';
2498
2499                    if (response.status == 422) {
2500                        for (var key in response.responseJSON.errors) {
2501                            html += '<li>' + response.responseJSON.errors[key][0] + '</li>';
2502                        }
2503
2504                    } else {
2505                        html += '<li>' + response.responseJSON.message + '</li>';
2506                    }
2507
2508                    html += '</ul></div>';
2509
2510                    $('#clouderror').show();
2511                    $('#cloudsuccess').hide();
2512                    document.getElementById('clouderror').innerHTML = html;
2513
2514                    // Hide the error message after 5 seconds (5000 milliseconds)
2515                    setTimeout(function () {
2516                        $('#clouderror').fadeOut('slow');
2517                    }, 5000);
2518                }
2519
2520
2521            });
2522        }
2523    }
2524
2525
2526    
2527    
2528    
2529    
2530    
2531    
2532    
2533
2534    
2535    
2536    
2537    
2538    
2539    
2540
2541    
2542    
2543    
2544    
2545    $('.closebutton').on('click',function(){
2546        location.reload();
2547    });
2548
2549    $(document).on("click", "#demo-req", function () {
2550        $('#demo-req').modal('show');
2551    });
2552    $('.closebutton').on('click',function(){
2553        location.reload();
2554    });
2555
2556        function togglePasswordVisibility(iconElement) {
2557        const inputGroup = iconElement.closest('.input-group');
2558        const passwordInput = inputGroup.querySelector('input[type="password"], input[type="text"]');
2559        const icon = iconElement.querySelector('i');
2560
2561        const isPassword = passwordInput.type === 'password';
2562        passwordInput.type = isPassword ? 'text' : 'password';
2563
2564        icon.classList.toggle('fa-eye-slash', !isPassword);
2565        icon.classList.toggle('fa-eye', isPassword);
2566    }
2567
2568    $(document).ready(function () {
2569
2570        // Check if the user is authenticated
2571                // If not authenticated, redirect to the login/register page only if localStorage indicates a click
2572        var freeTrialClicked = localStorage.getItem('freeTrialClicked');
2573        // Attach a click event handler to the "START FREE TRIAL" button
2574        $('.startFreeTrialBtn').on('click', function () {
2575            // If not authenticated, remember that the button was clicked
2576            localStorage.setItem('freeTrialClicked', 'true');
2577            var message = "Please log in to start your free trial. If you don't have an account, you can register here!";
2578            var baseUrl = "https://store.faveohelpdesk.com/";
2579
2580            // Redirect to the login/register page
2581            window.location.href =  `${baseUrl}/login?message=${encodeURIComponent(message)}`;
2582        });
2583        
2584        // Function to open the free trial dialog
2585        function openFreeTrialDialog() {
2586            // Check if the modal is already open (to prevent multiple opens)
2587            if (!$('#tenant').hasClass('show')) {
2588                $('#tenant').modal('show');
2589            }
2590        }
2591    });
2592</script>
2592
2593    
2593<script>
2594        let loginRecaptcha, registerRecaptcha;
2595
2596        (async () => {
2597            const loginRecaptchaContainer = document.getElementById('login_recaptcha');
2598            const registerRecaptchaContainer = document.getElementById('register_recaptcha');
2599
2600            loginRecaptcha = await RecaptchaManager.init(loginRecaptchaContainer, {
2601                action: 'login',
2602            });
2603
2604            registerRecaptcha = await RecaptchaManager.init(registerRecaptchaContainer, {
2605                action: 'register'
2606            });
2607
2608            // Make them globally available
2609            window.loginRecaptcha = loginRecaptcha;
2610            window.registerRecaptcha = registerRecaptcha;
2611
2612        })();
2613    </script>
2613
2614    <!--
vendor: 63 bytes, line 2614
2614<script async src="https://www.googletagmanager.com/gtag/js?id=
2614G-6G5FXVGRYN
vendor: 11 bytes, line 2614
2614"></script>
2614-->
2615
2616    <!--Start of Tawk.to Script-->
2617    <!-- Google tag (gtag.js) -->
vendor: 65 bytes, lines 2617-2618
2617
2618<script async src="https://www.googletagmanager.com/gtag/js?id=
2618G-F7C160D7C7
vendor: 13 bytes, line 2618
2618"></script>
2619<script>
2620  
vendor: 138 bytes, lines 2620-2624
2620window.dataLayer = window.dataLayer || [];
2621  function gtag(){dataLayer.push(arguments);}
2622  gtag('js', new Date());
2623
2624  gtag('config', '
2624G-6G5FXVGRYN
vendor: 5 bytes, line 2624
2624');
2625</script>
2625<script>function gtag_convert(url) {
2626  var callback = function () {
2627    if (typeof(url) != 'undefined') {
2628      window.location = url;
2629    }
2630  };
2631  gtag('event', 'conversion', {
2632      'send_to': 'AW-1027628032/bb00CKn6y_MBEIC4geoD',
2633      'event_callback': callback
2634  });
2635  return false;
2636}
2637</script>
2637
2638    <!--End of Tawk.to Script-->
2639
2640    
2640<script type="text/javascript">
2641
2642        
2643        
2644
2645        var input = document.querySelector("#mobilenum");
2646
2647        function updateToMobile(value) {
2648            updateCountryCodeAndFlag(input, value)
2649        }
2650
2651
2652        $(document).ready(function () {
2653            // Cache the selectors for better performance
2654            var $pswdInfo = $('#pswd_info');
2655            var $newPassword = $('#password');
2656            var $length = $('#length');
2657            var $letter = $('#letter');
2658            var $capital = $('#capital');
2659            var $number = $('#number');
2660            var $special = $('#space');
2661
2662            // Function to update validation classes
2663            function updateClass(condition, $element) {
2664                $element.toggleClass('text-success', condition).toggleClass('text-danger', !condition);
2665            }
2666
2667            // Initially hide the password requirements
2668            $pswdInfo.hide();
2669
2670            // Show/hide password requirements on focus/blur
2671            $newPassword.focus(function () {
2672                $pswdInfo.show();
2673            }).blur(function () {
2674                $pswdInfo.hide();
2675            });
2676
2677            // Perform real-time validation on keyup
2678            $newPassword.on('keyup', function () {
2679                var pswd = $(this).val();
2680
2681                // Validate the length (8 to 16 characters)
2682                updateClass(pswd.length >= 8 && pswd.length <= 16, $length);
2683
2684                // Validate lowercase letter
2685                updateClass(/[a-z]/.test(pswd), $letter);
2686
2687                // Validate uppercase letter
2688                updateClass(/[A-Z]/.test(pswd), $capital);
2689
2690                // Validate number
2691                updateClass(/\d/.test(pswd), $number);
2692
2693                // Validate special character
2694                updateClass(/[~*!@$#%_+.?:,{ }]/.test(pswd), $special);
2695            });
2696        });
2697
2698    </script>
2698
2699
2700
2701
2702    
2703    
2703<script>
2704        $(document).ready(function () {
2705            function gtag_report_conversion(tag) {
2706                window.dataLayer = window.dataLayer || [];
2707
2708                function gtag() {
2709                    dataLayer.push(arguments);
2710                }
2711
2712                gtag('js', new Date());
2713
2714                gtag('config', tag);
2715            }
2716
2717            function placeErrorMessage(error, element, errorMapping = null) {
2718                const errorText = error.text().trim();
2719
2720                if (errorMapping !== null && errorMapping[element.attr("name")]) {
2721                    const target = $(errorMapping[element.attr("name")]);
2722
2723                    if (errorText) {
2724                        target.html(error).show();
2725                    } else {
2726                        target.hide().empty();
2727                    }
2728                } else {
2729                    // Fallback: place error right after the element
2730                    if (errorText) {
2731                        error.insertAfter(element).show();
2732                    } else {
2733                        error.remove(); // or hide/remove any existing nearby error span
2734                    }
2735                }
2736            }
2737
2738            let alertTimeout;
2739
2740            function showAlert(type, messageOrResponse) {
2741
2742                // Generate appropriate HTML
2743                var html = generateAlertHtml(type, messageOrResponse);
2744
2745                // Clear any existing alerts and remove the timeout
2746                $('#alert-container').html(html);
2747                clearTimeout(alertTimeout); // Clear the previous timeout if it exists
2748
2749                // Display alert
2750                window.scrollTo(0, 0);
2751
2752                // Auto-dismiss after 5 seconds
2753                alertTimeout = setTimeout(function() {
2754                    $('#alert-container .alert').fadeOut('slow');
2755                }, 5000);
2756            }
2757
2758
2759            function generateAlertHtml(type, response) {
2760                // Determine alert styling based on type
2761                const isSuccess = type === 'success';
2762                const iconClass = isSuccess ? 'fa-check-circle' : 'fa-ban';
2763                const alertClass = isSuccess ? 'alert-success' : 'alert-danger';
2764
2765                // Extract message and errors
2766                const message = response.message || response || 'An error occurred. Please try again.';
2767                const errors = response.errors || null;
2768
2769                let html = `<div class="alert ${alertClass} alert-dismissible">` +
2770                    `<i class="fa ${iconClass}"></i> ` +
2771                    `${message}` +
2772                    '<button type="button" class="btn-close" data-dismiss="alert" aria-hidden="true"></button>';
2773
2774                html += '</div>';
2775
2776                return html;
2777            }
2778
2779            $.validator.addMethod("email_or_username", function(value, element) {
2780                // Email regex (improved version)
2781                var emailRegex = /^(?!.*\.\.)[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
2782                var isEmail = emailRegex.test(value);
2783
2784                // Username regex (alphanumeric with optional underscores or periods)
2785                var usernameRegex = /^[a-zA-Z0-9._]+$/;
2786                var isUsername = usernameRegex.test(value);
2787
2788
2789                return this.optional(element) || isEmail || isUsername;
2790            }, "Please enter your username or email address.");
2791
2792            $.validator.addMethod("regex", function(value, element, regexp) {
2793                var re = new RegExp(regexp);
2794                return this.optional(element) || re.test(value);
2795            }, "Invalid format.");
2796
2797            $.validator.addMethod("validPhone", function(value, element) {
2798                return validatePhoneNumber(element);
2799            }, "Please enter a valid phone number");
2800
2801            $(document).on('change', '#term', function () {
2802                $(this).val($(this).val() === "false" ? "true" : "false");
2803            });
2804
2805
2806            $('#formoid').validate({
2807                rules: {
2808                    email_username: {
2809                        required: true,
2810                        email:false,
2811                        email_or_username: true
2812                    },
2813                    password1: {
2814                        required: true,
2815                    },
2816                },
2817                messages: {
2818                    email_username: {
2819                        required: "Please enter your username or email address.",
2820                        email_or_username: "Please enter your username or email address."
2821                    },
2822                    password1: {
2823                        required: "Please enter your password.",
2824                    },
2825                },
2826                unhighlight: function(element) {
2827                    $(element).removeClass("is-valid");
2828                },
2829                errorPlacement: function (error, element) {
2830                    var errorMapping = {
2831                        "email_username": "#error-login-email",
2832                        "password1": "#error-login-password",
2833                    };
2834
2835                    placeErrorMessage(error, element, errorMapping);
2836                },
2837            });
2838
2839            $("#formoid").on("submit", async function (event) {
2840                event.preventDefault();
2841
2842                const $form = $(this);
2843                const $submitButton = $("#login-btn");
2844
2845                if (!$form.valid()) {
2846                    return;
2847                }
2848
2849                try {
2850                    // Validate reCAPTCHA
2851                    let recaptchaToken = await window.loginRecaptcha.tokenValidation("login");
2852                    if (!recaptchaToken) return;
2853
2854                    // Collect form data (filter out auto-injected g-recaptcha-response from v2 widget)
2855                    let formData = $form.serializeArray().filter(field => field.name !== 'g-recaptcha-response');
2856                    if (!window.loginRecaptcha.isDisabled() && recaptchaToken) {
2857                        formData.push({ name: "g-recaptcha-response", value: recaptchaToken });
2858                        formData.push({ name: "page_id", value: window.pageId });
2859                    }
2860
2861                    // Submit form
2862                    $.ajax({
2863                        url: "https://billing.faveohelpdesk.com/login",
2864                        method: "POST",
2865                        data: $.param(formData),
2866                        beforeSend: function () {
2867                            $submitButton.prop("disabled", true).html($submitButton.data("loading-text"));
2868                        },
2869                        success: function (response) {
2870
2871                            if (response.data?.redirect) {
2872                                window.location.href = response.data?.redirect;
2873                            } else {
2874                                showAlert("success", response.message);
2875                            }
2876                        },
2877                        error: async function (xhr) {
2878                            let response = xhr.responseJSON || JSON.parse(xhr.responseText || "{}");
2879
2880                            // Handle reCAPTCHA fallback
2881                            if (response.data?.show_v2_recaptcha) {
2882                                await window.loginRecaptcha.useFallback(true);
2883                                showAlert("error", response.message || "An unexpected error occurred.");
2884                                return;
2885                            }
2886
2887                            // Handle validation errors
2888                            if (response.errors) {
2889                                let validator = $form.validate();
2890                                $.each(response.errors, function (field, messages) {
2891                                    if (["login"].includes(field)) {
2892                                        showAlert("error", messages[0]);
2893                                        return;
2894                                    }
2895                                    validator.showErrors({ [field]: messages[0] });
2896                                });
2897                            } else {
2898                                showAlert("error", response.message || "An unexpected error occurred.");
2899                            }
2900                        },
2901                        complete: function () {
2902                            $submitButton.prop("disabled", false).html($submitButton.data("original-text"));
2903                            window.loginRecaptcha.reset();
2904                        }
2905                    });
2906                } catch (err) {
2907                    console.error("Form submit error:", err);
2908                    showAlert("error", "Something went wrong. Please try again.");
2909                }
2910            });
2911
2912            $("#regiser-form").validate({
2913                ignore: ":hidden:not(.g-recaptcha-response):not([name^='register'])",
2914                rules: {
2915                    first_name: {
2916                        required: true,
2917                        regex: /^[a-zA-Z][a-zA-Z' -]{0,98}$/
2918                    },
2919                    last_name: {
2920                        required: true,
2921                        regex: /^[a-zA-Z][a-zA-Z' -]{0,98}$/
2922                    },
2923                    email: {
2924                        required: true,
2925                        email: true,
2926                        regex: /^(?!.*\.\.)[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
2927                    },
2928                    company: {
2929                        required: true
2930                    },
2931                    address: {
2932                        required: true,
2933                    },
2934                    country: {
2935                        required: true
2936                    },
2937                    mobile: {
2938                        required: true,
2939                        validPhone: true
2940                    },
2941                    password: {
2942                        required: true,
2943                        regex: /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[~*!@$#%_+.?:,{ }])[A-Za-z\d~*!@$#%_+.?:,{ }]{8,16}$/,
2944                    },
2945                    password_confirmation: {
2946                        required: true,
2947                        equalTo: "#password"
2948                    },
2949                    terms: {
2950                        required: function() {
2951                            return true;
2952                        }
2953                    },
2954                },
2955                messages: {
2956                    first_name: {
2957                        required: "First name is required",
2958                        regex: "Please enter a valid first name"
2959                    },
2960                    last_name: {
2961                        required: "Last name is required",
2962                        regex: "Please enter a valid last name"
2963                    },
2964                    email: {
2965                        required: "Email is required",
2966                        email: "Please enter a valid email address.",
2967                        regex: "Enter a valid email address"
2968                    },
2969                    company: {
2970                        required: "Company name is required"
2971                    },
2972                    address: {
2973                        required: "Address is required",
2974                    },
2975                    country: {
2976                        required: "Please select a country"
2977                    },
2978                    mobile: {
2979                        required: "Mobile number is required",
2980                    },
2981                    password: {
2982                        required: "Password is required",
2983                        regex: "Password must contain at least 8 characters, one uppercase letter, one lowercase letter, one number, and one special character."
2984                    },
2985                    password_confirmation: {
2986                        required: "Confirm password is required",
2987                        equalTo: "Passwords do not match"
2988                    },
2989                    terms: {
2990                        required: "You must agree to the terms and conditions"
2991                    },
2992
2993                },
2994                unhighlight: function(element) {
2995                    $(element).removeClass("is-valid"); // Remove "is-invalid" but don't add "is-valid"
2996                },
2997                errorPlacement: function (error, element) {
2998                    var errorMapping = {
2999                        "first_name": "#first_namecheck",
3000                        "last_name": "#last_namecheck",
3001                        "email": "#emailcheck",
3002                        "company": "#companycheck",
3003                        "address": "#addresscheck",
3004                        "country": "#countrycheck",
3005                        "mobile": "#mobile_codecheck",
3006                        "password": "#password1check",
3007                        "password_confirmation": "#conpasscheck",
3008                        "terms": "#termscheck",
3009                    };
3010
3011                    placeErrorMessage(error, element, errorMapping);
3012                },
3013            });
3014
3015            $("#regiser-form").on("submit", async function (event) {
3016                event.preventDefault();
3017
3018                const $form = $(this);
3019                const $submitButton = $("#register");
3020
3021                if (!$form.valid()) {
3022                    return;
3023                }
3024
3025                try {
3026                    // Validate reCAPTCHA
3027                    let recaptchaToken = await window.registerRecaptcha.tokenValidation("register");
3028                    if (!recaptchaToken) return;
3029
3030                    // Set hidden fields for mobile details
3031                    $("#mobile_code").val(input.getAttribute("data-dial-code"));
3032                    $("#mobile_country_iso").val(input.getAttribute("data-country-iso").toUpperCase());
3033                    input.value = input.value.replace(/\D/g, "");
3034
3035                    // Collect form data (filter out auto-injected g-recaptcha-response from v2 widget)
3036                    let formData = $form.serializeArray().filter(field => field.name !== 'g-recaptcha-response');
3037
3038                    if (!window.registerRecaptcha.isDisabled() && recaptchaToken) {
3039                        formData.push({ name: "g-recaptcha-response", value: recaptchaToken });
3040                        formData.push({ name: "page_id", value: window.pageId });
3041                    }
3042
3043                    const tag = "G-6G5FXVGRYN";
3044                    if (tag) gtag_report_conversion(tag);
3045
3046                    // Submit form
3047                    $.ajax({
3048                        url: "https://billing.faveohelpdesk.com/auth/register",
3049                        method: "POST",
3050                        data: $.param(formData),
3051                        beforeSend: function () {
3052                            $submitButton.prop("disabled", true).html($submitButton.data("loading-text"));
3053                        },
3054                        success: function (response) {
3055                                                        document.getElementById("term").value = false;
3056                                                            $form[0].reset();
3057
3058                            if (response.data?.need_verify) {
3059                                window.location.href = "https://billing.faveohelpdesk.com/verify";
3060                            } else {
3061                                showAlert("success", response.message);
3062                            }
3063                        },
3064                        error: async function (xhr) {
3065                            let response = xhr.responseJSON || JSON.parse(xhr.responseText || "{}");
3066
3067                            // Handle reCAPTCHA fallback
3068                            if (response.data?.show_v2_recaptcha) {
3069                                await window.registerRecaptcha.useFallback(true);
3070                                showAlert("error", response.message || "An unexpected error occurred.");
3071                                return;
3072                            }
3073
3074                            // Handle validation errors
3075                            if (response.errors) {
3076                                let validator = $form.validate();
3077                                $.each(response.errors, function (field, messages) {
3078                                    if (["register"].includes(field)) {
3079                                        showAlert("error", messages[0]);
3080                                        return;
3081                                    }
3082                                    validator.showErrors({ [field]: messages[0] });
3083                                });
3084                            } else {
3085                                showAlert("error", response.message || "An unexpected error occurred.");
3086                            }
3087                        },
3088                        complete: function () {
3089                            $submitButton.prop("disabled", false).html($submitButton.data("original-text"));
3090                            window.registerRecaptcha.reset();
3091                        }
3092                    });
3093                } catch (err) {
3094                    console.error("Form submit error:", err);
3095                    showAlert("error", "Something went wrong. Please try again.");
3096                }
3097            });
3098        });
3099    </script>
3099
3100
3101    
3101<script>
3102
3103        var data = '{&quot;id&quot;:&quot;IL&quot;,&quot;name&quot;:&quot;Illinois&quot;}';
3104        var state = JSON.parse(data.replace(/&quot;/g, '"'));
3105        // console.log(state)
3106        $(document).ready(function () {
3107            var val = $("#country").val();
3108            getCountryAttr(val);
3109        });
3110
3111        function getCountryAttr(val) {
3112            if (val != "") {
3113                // getState(val);
3114                getCode(val);
3115            } else {
3116                $("#state-list").html('<option value="">Please Select Country</option>').val('');
3117            }
3118
3119//        getCurrency(val);
3120
3121        }
3122
3123        
3124        
3125        
3126        
3127        
3128        
3129
3130        
3131
3132
3133        
3134        
3135        
3136        
3137
3138
3139        function getCode(val) {
3140            $.ajax({
3141                type: "GET",
3142                url: "https://billing.faveohelpdesk.com/get-code",
3143                data: {'country_id': val},//'country_id=' + val,
3144                success: function (data) {
3145                    $("#mobile_code").val(data);
3146                    $("#mobile_code_hidden").val(data);
3147                }
3148            });
3149        }
3150
3151        function getCurrency(val) {
3152            $.ajax({
3153                type: "GET",
3154                url: "https://billing.faveohelpdesk.com/get-currency",
3155                data: {'country_id': val},//'country_id=' + val,
3156                success: function (data) {
3157                    $("#currency").val(data);
3158                }
3159            });
3160        }
3161    </script>
3161
3162    <!-- Google Code for Help Desk Pro | Campaign 001 Conversion Page
3163    In your html page, add the snippet and call
3164    goog_report_conversion when someone clicks on the
3165    chosen link or button. -->
3166    
3166<script type="text/javascript">
3167        //<![CDATA[
3168        goog_snippet_vars = function () {
3169            var w = window;
3170            w.google_conversion_id = 1027628032;
3171            w.google_conversion_label = "uBhoCLT3i3AQgLiB6gM";
3172            w.google_remarketing_only = false;
3173        }
3174        // DO NOT CHANGE THE CODE BELOW.
3175        goog_report_conversion = function (url) {
3176            goog_snippet_vars();
3177            window.google_conversion_format = "3";
3178            var opt = new Object();
3179            opt.onload_callback = function () {
3180                if (typeof (url) != 'undefined') {
3181                    window.location = url;
3182                }
3183            }
3184            var conv_handler = window['google_trackConversion'];
3185            if (typeof (conv_handler) == 'function') {
3186                conv_handler(opt);
3187            }
3188            fbq('track', 'CompleteRegistration');
3189        }
3190        //]]>
3191    </script>
3191
3192    <!-- Google Code for Help Desk Pro | Campaign 001 Conversion Page
3193    In your html page, add the snippet and call
3194    goog_report_conversion when someone clicks on the
3195    chosen link or button. -->
3196    
3196<script type="text/javascript">
3197        //<![CDATA[
3198        goog_snippet_vars = function () {
3199            var w = window;
3200            w.google_conversion_id = 1027628032;
3201            w.google_conversion_label = "uBhoCLT3i3AQgLiB6gM";
3202            w.google_remarketing_only = false;
3203        }
3204        // DO NOT CHANGE THE CODE BELOW.
3205        goog_report_conversion = function (url) {
3206            goog_snippet_vars();
3207            window.google_conversion_format = "3";
3208            var opt = new Object();
3209            opt.onload_callback = function () {
3210                if (typeof (url) != 'undefined') {
3211                    window.location = url;
3212                }
3213            }
3214            var conv_handler = window['google_trackConversion'];
3215            if (typeof (conv_handler) == 'function') {
3216                conv_handler(opt);
3217            }
3218            fbq('track', 'CompleteRegistration');
3219        }
3220        //]]>
3221    </script>
3221
3222    
3222<script type="text/javascript"
3223            src="//www.googleadservices.com/pagead/conversion_async.js">
3224    </script>
3224
3225    <!-- Facebook Pixel Code -->
3226    <!-- 
3226<script>
vendor: 435 bytes, lines 3226-3235
3226
3227    !function(f,b,e,v,n,t,s)
3228    {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
3229    n.callMethod.apply(n,arguments):n.queue.push(arguments)};
3230    if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
3231    n.queue=[];t=b.createElement(e);t.async=!0;
3232    t.src=v;s=b.getElementsByTagName(e)[0];
3233    s.parentNode.insertBefore(t,s)}(window,document,'script',
3234    'https://connect.facebook.net/en_US/fbevents.js');
3235     fbq('init', '
3235308328899511239
vendor: 39 bytes, lines 3235-3238
3235');
3236    fbq('track', 'PageView');
3237
3238    
3238</script>
3238 -->
3239
3240    
3240<script type="text/javascript"
3241            src="//www.googleadservices.com/pagead/conversion_async.js">
3242    </script>
3242
3243    
3243<script>
3244        $(document).ready(function () {
3245
3246            $.ajaxSetup({headers: {'csrftoken': 'BcBmvP8gMD3xKbgQehf17Mr6qGz5D4eLdegBk0rV'}});
3247
3248            //Initialize tooltips
3249            $('.nav-tabs > li a[title]').tooltip();
3250            $('.nav-tabs .active a[href="#step1"]').click(function () {
3251                $('.wizard-inner').css('display', 'none');
3252            })
3253            //Wizard
3254            if (!$('.nav-tabs .active a[href="#step1"]')) {
3255                $('.wizard-inner').css('display', 'block');
3256            }
3257            $('a[data-toggle="tab"]').on('show.bs.tab', function (e) {
3258
3259                var $target = $(e.target);
3260
3261                if ($target.parent().hasClass('disabled')) {
3262                    return false;
3263                }
3264            });
3265
3266            /*$(".next-step").click(function (e) {
3267                $('.wizard-inner').show();
3268                var $active = $('.wizard .nav-tabs li.active');
3269                $active.next().removeClass('disabled');
3270                nextTab($active);
3271                window.scrollTo(0, 10);
3272
3273            });*/
3274
3275            $(".prev").click(function (e) {
3276
3277                var $active = $('.wizard .nav-tabs li.active');
3278                $active.next().removeClass('disabled');
3279                prevTab($active);
3280                $('.wizard-inner').css('display', 'block');
3281            });
3282        });
3283
3284        function nextTab(elem) {
3285
3286            $(elem).next().find('a[data-toggle="tab"]').click();
3287        }
3288
3289        function prevTab(elem) {
3290            $(elem).prev().find('a[data-toggle="tab"]').click();
3291        }
3292    </script>
3292
3293
3294    
3294<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"></script>
3294
3295    <noscript>
3296        <img height="1" width="1"
3297             src="https://www.facebook.com/tr?id=308328899511239&ev=PageView
3298&noscript=1"/>
3299    </noscript>
3300    <!-- End Facebook Pixel Code -->
3301
3302<!--Start of Tawk.to Script-->
3303<!--Start of Tawk.to Script-->
3304<script> var Tawk_API=Tawk_API||{}, Tawk_LoadStart=new Date();
3305(function(){
3306var s1=document.createElement("script"),s0=document.getElementsByTagName("script")[0];
3307s1.async=true;
3308s1.src='https://embed.tawk.to/57236f1bb27b7d1124b56794/default';
3309s1.charset='UTF-8';
3310s1.setAttribute('crossorigin','*');
3311s0.parentNode.insertBefore(s1,s0);
3312})();
3313</script>
3313<script async src="https://www.googletagmanager.com/gtag/js?id=AW-1027628032">
3314  
vendor: 138 bytes, lines 3314-3318
3314window.dataLayer = window.dataLayer || [];
3315  function gtag(){dataLayer.push(arguments);}
3316  gtag('js', new Date());
3317
3318  gtag('config', '
3318AW-1027628032
vendor: 5 bytes, line 3318
3318');
3319</script>
3319
3320
3321
3322
3323
3324
3325    
3325<script type="text/javascript">
3326        var demotelInput = $('#mobilenumdemo'),
3327            errorMsgdemo = document.querySelector("#error-msgdemo"),
3328            validMsgdemo = document.querySelector("#valid-msgdemo"),
3329            addressDropdowndemo = $("#country");
3330
3331        var resetdemo = function() {
3332            errorMsgdemo.innerHTML = "";
3333            errorMsgdemo.classList.add("hide");
3334            validMsgdemo.classList.add("hide");
3335        };
3336
3337        $('.intl-tel-input').css('width', '100%');
3338
3339        demotelInput.on('input blur', function () {
3340            resetdemo();
3341            if ($.trim(demotelInput.val())) {
3342                if (validatePhoneNumber(demotelInput.get(0))) {
3343                    $('#mobilenumdemo').css("border-color","");
3344                    $("#error-msgdemo").html('');
3345                    errorMsgdemo.classList.add("hide");
3346                    $('#demoregister').attr('disabled',false);
3347                } else {
3348                    errorMsgdemo.classList.remove("hide");
3349                    errorMsgdemo.innerHTML = "Please enter a valid phone number";
3350                    $('#mobilenumdemo').css("border-color","red");
3351                    $('#error-msgdemo').css({"color":"red","margin-top":"5px"});
3352                    $('#demoregister').attr('disabled',true);
3353                }
3354            }
3355        });
3356        $('input').on('focus', function () {
3357            $(this).parent().removeClass('has-error');
3358        });
3359        addressDropdowndemo.change(function() {
3360            if ($.trim(demotelInput.val())) {
3361                if (validatePhoneNumber(demotelInput.get(0))) {
3362                    $('#mobilenumdemo').css("border-color","");
3363                    $("#error-msgdemo").html('');
3364                    errorMsgdemo.classList.add("hide");
3365                    $('#demoregister').attr('disabled',false);
3366                } else {
3367                    errorMsgdemo.classList.remove("hide");
3368                    errorMsgdemo.innerHTML = "Please enter a valid phone number";
3369                    $('#mobilenumdemo').css("border-color","red");
3370                    $('#error-msgdemo').css({"color":"red","margin-top":"5px"});
3371                    $('#demoregister').attr('disabled',true);
3372                }
3373            }
3374        });
3375
3376
3377        $(document).ready(function() {
3378            $('#tenancy').on('shown.bs.modal', function () {
3379                $('#userdomainPurchase').focus();
3380            });
3381        });
3382
3383        const domainInputPurchase = document.getElementById("userdomainPurchase");
3384        const validationMessagePurchase = document.getElementById("validationMessagePurchase");
3385
3386        domainInputPurchase.addEventListener("input", function() {
3387            const domainName = domainInputPurchase.value;
3388
3389            if (domainName.length > 28) {
3390                validationMessagePurchase.textContent = "Domain must be 28 characters or less.";
3391                validationMessagePurchase.style.color = "red";
3392            } else {
3393                validationMessagePurchase.textContent = "";
3394                validationMessagePurchase.style.color = "";
3395            }
3396        });
3397        $(document).ready(function(){
3398            $('.createtenancy').attr('disabled',true);
3399            $('#userdomainPurchase').keyup(function(){
3400                if($(this).val().length ==0 || $(this).val().length>28)
3401                    $('.createtenancy').attr('disabled', true);
3402                else
3403                    $('.createtenancy').attr('disabled',false);
3404            })
3405        });
3406
3407        function createtenancy(e){
3408            const alphanumeric = /^[a-zA-Z0-9]+$/;
3409            var domain = $('#userdomainPurchase').val();
3410
3411            if ( !alphanumeric.test(domain)) {
3412
3413                var html = '<div class="alert alert-danger alert-dismissible"><button type="button" class="btn-close" data-dismiss="alert" aria-hidden="true"></button><strong>Whoops! </strong>Something went wrong<ul>';
3414                html += '<li>The Domain must only contain letters and numbers.</li>'
3415                document.getElementById('error').innerHTML = html;
3416            }else {
3417                $('#createtenancy').attr('disabled', true)
3418                $("#createtenancy").html("<i class='fas fa-circle-notch fa-spin'></i> Please Wait...");
3419                var order = $('#orderId').val();
3420                $.ajax({
3421                    url: "https://billing.faveohelpdesk.com/create/tenant/purchase",
3422                    type: "POST",
3423                    data: {'domain': domain, 'id': order},
3424                    success: function (data) {
3425                        $('#createtenancy').attr('disabled', false)
3426                        $("#createtenancy").html("<i class='fa fa-check'>&nbsp;&nbsp;</i>Submit");
3427                        if (data.status == 'validationFailure') {
3428
3429                            var html = '<div class="alert alert-danger alert-dismissible"><button type="button" class="btn-close" data-dismiss="alert" aria-hidden="true"></button><strong>Whoops! </strong>Something went wrong<ul>';
3430                            for (var key in data.message) {
3431                                html += '<li>' + data.message[key][0] + '</li>'
3432                            }
3433                            html += '</ul></div>';
3434                            $('#error').show();
3435                            $('#success').hide();
3436                            document.getElementById('error').innerHTML = html;
3437                        } else if (data.status == 'false') {
3438                            $('#error').show();
3439                            $('#success').hide();
3440                            var result = '<div class="alert alert-danger alert-dismissible"><button type="button" class="btn-close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true"></span></button><strong>Whoops! </strong>Something went wrong!<br><ul><li>' + data.message + '</li></ul></div>';
3441                            $('#error').html(result);
3442                        } else if (data.status == 'success_with_warning') {
3443                            console.log('here');
3444                            $('#error').show();
3445                            $('#success').hide();
3446                            var result = '<div class="alert alert-warning alert-dismissible"><button type="button" class="btn-close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true"></span></button><strong>Whoops! </strong><br><ul><li>' + data.message + '</li></ul></div>';
3447                            $('#error').html(result);
3448                        } else {
3449                            window.location.href = data.redirectTo;
3450                        }
3451                    }, error: function (response) {
3452                        $('#createtenancy').attr('disabled', false)
3453                        $("#createtenancy").html("<i class='fa fa-check'>&nbsp;&nbsp;</i>Submit");
3454                        $("#generate").html("<i class='fa fa-check'>&nbsp;&nbsp;</i>Submit");
3455                        if (response.status == 422) {
3456
3457                            var html = '<div class="alert alert-danger alert-dismissible"><button type="button" class="btn-close" data-dismiss="alert" aria-hidden="true"></button><strong>Whoops! </strong>Something went wrong<ul>';
3458                            for (var key in response.responseJSON.errors) {
3459                                html += '<li>' + response.responseJSON.errors[key][0] + '</li>'
3460                            }
3461
3462                        } else {
3463                            var html = '<div class="alert alert-danger alert-dismissible"><button type="button" class="btn-close" data-dismiss="alert" aria-hidden="true"></button><strong>Whoops! </strong>Something went wrong<ul>';
3464                            html += '<li>' + response.responseJSON.message + '</li>'
3465                        }
3466
3467                        html += '</ul></div>';
3468                        $('#error').show();
3469                        $('#success').hide();
3470                        document.getElementById('error').innerHTML = html;
3471
3472                    }
3473
3474                })
3475            }
3476        }
3477
3478
3479
3480        setTimeout(function () {
3481            $(".alert-cloud").alert('close');
3482        }, 10000);
3483    </script>
vendor: 1 bytes, line 3483
3483
3484<script>
3485    $(document).ready(function() {
3486        $.fn.modal.Constructor.Default.backdrop = 'static';
3487    });
3488
3489    const flagIcon = document.getElementById('flagIcon');
3490    const languageDropdown = document.getElementById('language-dropdown');
3491    const curLang = 'en';
3492
3493    $(document).ready(function() {
3494        const localeMap = { 'ar': 'ae', 'bsn': 'bs', 'de': 'de', 'en': 'us', 'en-gb': 'gb', 'es': 'es', 'fr': 'fr', 'id': 'id', 'it': 'it', 'kr': 'kr', 'mt': 'mt', 'nl': 'nl', 'no': 'no', 'pt': 'pt', 'ru': 'ru', 'vi': 'vn', 'zh-hans': 'cn', 'zh-hant': 'cn', 'ja': 'jp', 'ta': 'in', 'hi': 'in', 'he': 'il', 'tr': 'tr' };
3495        const currentLocale = 'en';
3496        const mappedLocale = localeMap[currentLocale] || 'us';
3497        $('#flagIcon').addClass('flag-icon flag-icon-' + mappedLocale);
3498
3499        $.ajax({
3500            url: 'https://billing.faveohelpdesk.com/language/control',
3501            type: 'GET',
3502            dataType: 'JSON',
3503            success: function(response) {
3504                $.each(response.data, function(key, value) {
3505                    // Only include languages where enable_disable == 1
3506                    if (value.status == 1) {
3507                        const mappedLocale = localeMap[value.locale] || value.locale;
3508                        const isSelected = value.locale === currentLocale ? 'selected' : '';
3509                        $('#language-dropdown').append(
3510                            '<a href="javascript:;" class="dropdown-item" data-locale="' + value.locale + '" ' + isSelected + '>' +
3511                            '<i class="flag-icon flag-icon-' + mappedLocale +  ' me-2"></i> '  +
3512                            value.name + '&nbsp;&rlm;(' + value.translation + ')' +
3513                            '</a>'
3514                        );
3515                    }
3516                });
3517
3518                // Add event listeners for the dynamically added language options
3519                $('#language-dropdown').on('click', '.dropdown-item', function() {
3520                    const selectedLanguage = $(this).data('locale');
3521                    const mappedLocale = localeMap[selectedLanguage] || selectedLanguage;
3522                    const flagClass = 'flag-icon flag-icon-' + mappedLocale;
3523                    const dir = selectedLanguage === 'ar' ? 'rtl' : 'ltr';
3524
3525                    updateLanguage(selectedLanguage, flagClass);
3526                });
3527            },
3528            error: function(error) {
3529                console.error('Error fetching languages:', error);
3530            }
3531        });
3532    });
3533
3534    function updateLanguage(language, flagClass) {
3535        $('#flagIcon').attr('class', flagClass);
3536        $.ajax({
3537            url: 'https://billing.faveohelpdesk.com/lang/update',
3538            type: 'POST',
3539            data: { language: language },
3540            success: function(response) {
3541                window.location.reload();
3542            },
3543            error: function(xhr, status, error) {
3544                console.error('Error updating language:', xhr.responseText);
3545            }
3546        });
3547    }
3548</script>
3548
3549
3550<style>
3551    .custom-line {
3552        border: none;
3553        border-top: 1px solid #ccc;
3554        margin: 10px 0;
3555    }
3556    #validationMessage {
3557        position: absolute;
3558        top: 40px; /* Adjust this value to align the error message properly */
3559        left: 0;
3560        font-size: 12px;
3561        color: red;
3562    }
3563
3564    .widget-container {
3565        margin-top:30px !important;
3566    }
3567
3568    .modal-footer {
3569        justify-content: space-between !important;
3570    }
3571
3572</style>
3573</body>
3574</html>
3575
3576<style>
3577    .iti--allow-dropdown {
3578        width: 100% !important;
3579    }
3580
3581
3582    .telephone-input {
3583        width: 100%;
3584    }
3585
3586
3587    .iti__selected-country {
3588        padding: 5px !important;
3589        background-color: #F2F2F2 !important;
3590        outline: none !important;
3591        border-radius: 5% !important;
3592    }
3593
3594
3595    .iti__selected-country-primary:hover {
3596        background-color: #F2F2F2 !important;
3597    }
3598
3599
3600    .iti--inline-dropdown .iti__dropdown-content {
3601        max-width: 355px !important;
3602        min-width: 270px !important;
3603    }
3604
3605
3606    .iti .iti__selected-dial-code {
3607        margin-right: 4px;
3608    }
3609
3610
3611    .iti__search-input {
3612        padding: 12px 9px 6px 9px !important;
3613    }
3614
3615
3616    .iti__arrow {
3617        margin-right: 5px !important;
3618    }
3619
3620
3621</style>
3622<script>
3623
3624    let itiInstances = [];
3625
3626    document.addEventListener('DOMContentLoaded', function () {
3627
3628        let inputs = document.querySelectorAll('input[type="tel"]');
3629
3630        inputs.forEach(function (input, index) {
3631            itiInstances[index] = intlTelInput(input, {
3632                initialCountry: input.getAttribute('data-country-iso') || 'auto',
3633                geoIpLookup: (success, failure) => {
3634                    fetch("https://ipapi.co/json")
3635                        .then((res) => res.json())
3636                        .then((data) => success(data.country_code))
3637                        .catch(() => success('IN'));
3638                },
3639                allowDropdown: true,
3640                separateDialCode: true,
3641                i18n: 'en',
3642                showFlags: true,
3643                formatAsYouType: true,
3644                strictMode: true,
3645                formatOnDisplay: true,
3646                nationalMode: false,
3647                customPlaceholder: (selectedCountryPlaceholder) => selectedCountryPlaceholder,
3648            });
3649
3650            input.addEventListener('countrychange', function() {
3651                const selectedCountry = itiInstances[index].getSelectedCountryData();
3652                input.setAttribute('data-dial-code', selectedCountry.dialCode);
3653                input.setAttribute('data-country-iso', selectedCountry.iso2);
3654            });
3655        });
3656    });
3657
3658    function validatePhoneNumber(input) {
3659        let index = Array.from(document.querySelectorAll('input[type="tel"]')).indexOf(input);
3660        if (index !== -1 && itiInstances[index]) {
3661            return itiInstances[index].isValidNumber();
3662        }
3663        return false;
3664    }
3665
3666    function updateCountryCodeAndFlag(input, countryCode) {
3667        let index = Array.from(document.querySelectorAll('input[type="tel"]')).indexOf(input);
3668        if (index !== -1 && itiInstances[index]) {
3669            itiInstances[index].setCountry(countryCode.toLowerCase());
3670
3671            // Update data attributes based on the selected country
3672            const selectedCountry = itiInstances[index].getSelectedCountryData();
3673            input.setAttribute('data-dial-code', selectedCountry.dialCode);
3674            input.setAttribute('data-country-iso', selectedCountry.iso2);
3675        }
3676    }
3677
3678    function getAllCountryData(filter = null) {
3679        const iti = itiInstances[0]; // get the instance
3680        const countries = iti.countries;
3681
3682        if (!filter) {
3683            return countries;
3684        }
3685
3686        // Convert to lowercase for case-insensitive matching
3687        const filtered = countries.filter(country => {
3688            return Object.keys(filter).every(key => {
3689                const value = filter[key].toString().toLowerCase();
3690                const countryValue = (country[key] || '').toString().toLowerCase();
3691                return countryValue === value;
3692            });
3693        });
3694
3695        return filtered;
3696    }
3697</script>

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.