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"> </i>Close</button> 1151 1152 <button type="submit" class="btn btn-primary" name="demoregister" id="demoregister"><i class="fa fa-book"> </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> +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> [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 Store 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 Or 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">×</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'
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ç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'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"> </i>Close</button> 2050 <button type="submit" class="btn btn-primary createtenancy" id="createtenancy" onclick="createtenancy()"><i class="fa fa-check"> </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'> </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'> </i>Submit"); 2493 $("#generate").html("<i class='fa fa-check'> </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 = '{"id":"IL","name":"Illinois"}'; 3104 var state = JSON.parse(data.replace(/"/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'> </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'> </i>Submit"); 3454 $("#generate").html("<i class='fa fa-check'> </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 + ' ‏(' + 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.