1 2 3<!DOCTYPE html> 4<html lang="en"> 5 <head> 6 7 8
9<script>(function(){try{var b=['_hsmi','ver','_hsenc','hsCtaTracking','mc_eid','refemail'];var u=window.location.href;if(b.some(function(p){return u.indexOf(p+'=')!==-1;})){var url=new URL(u);b.forEach(function(p){url.searchParams.delete(p);});window.history.replaceState({},'',url.toString());}}catch(e){}})();</script>
9 10 11<!-- Google Tag Manager -->
12<script>
vendor: 438 bytes, lines 12-26
12 13 (function(w, d, s, l, i) { 14 w[l] = w[l] || []; 15 w[l].push({ 16 "gtm.start": 17 new Date().getTime(), 18 event: "gtm.js" 19 }); 20 var f = d.getElementsByTagName(s)[0], 21 j = d.createElement(s), dl = l != "dataLayer" ? "&l=" + l : ""; 22 j.async = true; 23 j.src = 24 "https://www.googletagmanager.com/gtm.js?id=" + i + dl; 25 f.parentNode.insertBefore(j, f); 26 })(window, document, "script", "dataLayer", "
26GTM-53V6DZZ7
vendor: 5 bytes, line 26
26");
27</script>
27 28 29 30 31<meta charset="utf-8" /> 32<meta name="viewport" 33 content="width=device-width initial-scale=1.0 maximum-scale=2.0, user-scalable=yes" /> 34 35 36 <title>Crunch+ by Crunch Fitness | Best Online Workout Program: Virtual Fitness & Exercise Classes</title> 37 38 39 40 <meta name="description" 41 content="Crunch+ offers live fitness classes, on-demand streaming classes, and workout plans to keep you motivated and having fun. Get fit on the fly!"> 42 43 44 45 <meta name="keywords" 46 content="online workout program, online fitness classes, best online workout program, online exercise classes, virtual fitness classes, virtual workouts, online gym classes, virtual exercise classes, virtual gym classes, streaming workout program, live fitness class, live workout class"> 47 48 49 50 51 <meta property="og:title" 52 content="Crunch+ by Crunch Fitness | Best Online Workout Program: Virtual Fitness &amp; Exercise Classes" /> 53 54 55 56 <meta property="og:image" 57 content="https://crunchplus-prod-cdn2.imgix.net/2154/images/cYr0wCx3QjmdxlaaZJnh_1718014609416_Account_2154?ixlib=rb-0.3.4&s=dd67a19726d873f88b00d02c3d3867d6&auto=compress" /> 58 59 60 61 <meta property="og:description" 62 content="Crunch+ offers live fitness classes, on-demand streaming classes, and workout plans to keep you motivated and having fun. Get fit on the fly!" /> 63 64 <meta property="og:type" 65 content="video.movie" /> 66 <meta property="og:url" 67 content="https://crunchplus.com/accounts/login" /> 68 69 70 71<link rel="canonical" href="https://crunchplus.com/accounts/login" /> 72 73<meta name="csrf-param" content="authenticity_token" /> 74<meta name="csrf-token" content="fbQdjceyXthVL3+/AklR0X5UibTyDl3mfq2CkWQ9nkQ8xUF6NswECkVIwNdNgD8ncM2gzAYsLLllDYOSEqh0XQ==" /> 75 76 77 78 79 80 <link rel="icon" href="//crunchplus-prod-cdn2.imgix.net/2154/images/22y8qTISDmU083gk72hT_1790657852363_Account_2154?ixlib=rb-0.3.4&s=7bd34255255e0b50083101dff173dfb7&auto=compress" type="image/x-icon"> 81 <link rel="shortcut icon" href="//crunchplus-prod-cdn2.imgix.net/2154/images/22y8qTISDmU083gk72hT_1790657852363_Account_2154?ixlib=rb-0.3.4&s=7bd34255255e0b50083101dff173dfb7&auto=compress" type="image/x-icon" /> 82 <link rel="apple-touch-icon" href="//crunchplus-prod-cdn2.imgix.net/2154/images/22y8qTISDmU083gk72hT_1790657852363_Account_2154?ixlib=rb-0.3.4&s=7bd34255255e0b50083101dff173dfb7&auto=compress"> 83 84 85 86<link rel="stylesheet" media="screen" href="//dbjtwsnsmnuln.cloudfront.net/assets/pink_essence/all-99bc76d8ddcea7fdc8a234e6f03c593284401488941518c36b6410d25b935d7a.css" /> 87 88 89 90 91<style> 92 93 94 95 .modal h2 { 96 color: #ffffff; 97 } 98 99 header .button.secondary { 100 border-color: #ffffff; 101 color: #ffffff; 102 } 103 104 h2.custom-font, .content h2, .main-content h2, #home_page h2, .page-subscribe h2, #favorite_media.active span.fa { 105 color: #ffffff; 106 } 107 108 .fave-corner { 109 border-color: rgba(255, 255, 255, 0) #ffffff rgba(255, 255, 255, 0) rgba(255, 255, 255, 0); 110 } 111 112 113 114 115 116 117 118 119 120 121 header nav ul li.active a { 122 border-bottom: 2px solid #4a4a4a; 123 } 124 125 126 127 128 129 130 131 132 .button.primary, 133 .nu-list.cards li .button.primary, 134 .nu-list.week-calendar li.current-date, .nu-list.week-calendar li.current-date.here, 135 .modal input[type='submit'] { 136 background: #DE325B; 137 border-color: #DE325B; 138 } 139 140 .number { 141 color: ; 142 background-color: ; 143 border-color: 144 } 145 146 .number:focus, 147 .number:hover, 148 .number:active, 149 .number--active { 150 color: #ffffff; 151 border-color: #ffffff !important; 152 } 153 154 .number--current { 155 color: #DE325B; 156 } 157 158 .number--current-active { 159 background-color: #DE325B !important; 160 color: white; 161 } 162 163 .number--current:hover, 164 .number--current-active:hover, 165 .number--current-active:focus, 166 .number--current-active:active { 167 border-color: transparent !important; 168 background-color: #DE325B !important; 169 color: white; 170 } 171 172 .dots__dot, .my-calendar-events__legend .dot { 173 background-color: #ffffff !important; 174 } 175 176 .my-calendar-events__list__cards__card { 177 border-left: solid 4px#DE325B; 178 } 179 180 181 182 183 184 header nav ul li.has-dropdown:hover .dropdown-arrow { 185 border-bottom: 6px solid #E1456A !important; 186 } 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 .page-index .image-feature, 224 .page-index .image-feature .button.plain, 225 .page-index header nav.site-nav-header-login ul li a, 226 .page-index header nav.site-nav-header-login ul li a.button.plain, 227 .page-index header nav.site-nav-header ul li a, 228 .page-index header nav.site-nav-header ul li span { 229 color: #ffffff; 230 } 231 232 .page-index header nav.site-nav-header ul li.has-dropdown > a:hover, 233 .page-index header nav ul li.has-dropdown:hover > a { 234 color: #ffffff !important; 235 } 236 237 .page-index header nav.site-nav-header-login ul li a.button.plain, 238 .page-index .image-feature .button.plain { 239 border-color: #ffffff; 240 241 } 242 243 .page-index header nav ul li.has-dropdown .dropdown-arrow { 244 border-top: 6px solid#ffffff; 245 } 246 247 248 249 250 251 252 253 254 255 256 .page-about .custom-section.logo-soup h2 { 257 color: #fff; 258 259 } 260 261 /* -- Marketing Modal -- */ 262 263 264 265 266 267 268 /* -- Pre-Launch Page -- */ 269 270 271 272 273 274 275 276 277 /* -- Advanced - Custom CSS -- */ 278 279 280 281</style> 282 283
284<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
vendor: 1 bytes, line 284
284
285<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
285 286 287 288 289 290 291 292
293<script> 294 var client = parseInt("2154"); 295</script>
295 296 297 298 299 300 301 302 </head> 303 304 305 306 307 308 309 310 311 312 313 314 315 <div class="vue-app"> 316 <global_paused-subscription-banner></global_paused-subscription-banner> 317 </div> 318 319 320 321 322<body class="iv-pink_essence page-login login-page not-rounded interstate default-delivery public-view"> 323 324<!-- Google Tag Manager -->
vendor: 65 bytes, lines 324-326
324 325<noscript> 326 <iframe src="//www.googletagmanager.com/ns.html?id=
326GTM-53V6DZZ7
vendor: 114 bytes, lines 326-330
326" 327 height="0" 328 width="0" 329 style="display:none;visibility:hidden"></iframe> 330</noscript>
331<script> 332 window.dataLayer = window.dataLayer || []; 333 var payloadPageView = { 334 "event": "VirtualPageview", 335 "user_id": ("" || "none").trim() || "none", 336 "membership_plan": ("" || "none").trim() || "none", 337 "crunch_fitness_member": ("false" || "none").trim() || "none" 338 }; 339 dataLayer.push(payloadPageView); 340</script>
vendor: 1 bytes, line 340
340
341<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
341 342<!-- End Google Tag Manager --> 343 344 345 346 347 348 349 350 351 352 <div class="modal-wrapper"> 353 <div class="overlay"> 354 <div class="modal"> 355 <div class="close" 356 for="modal-preview"><!--Close <span class="fa fa-close"></span>--></div> 357 358 359 <div class="header "> 360 361 362 <h2 class="custom-font">A pop up modal with title</h2> 363 364 365 366 367 </div> 368 369 370 371 <p>To add your form code here go to Theme Settings > Strategy > Forms > 372 <strong>Modal Pop Up</strong> 373 </p> 374 375 <!-- Begin MailChimp Signup Form --> 376 <div id="mc_embed_signup"> 377 <form action="//crunchplus.us6.list-manage.com/subscribe/post?u=123&id=123" 378 method="post" 379 id="mc-embedded-subscribe-form" 380 name="mc-embedded-subscribe-form" 381 class="validate" 382 target="_blank" rel="noopener noreferrer" aria-label="Opens in a new tab" 383 novalidate> 384 <div id="mc_embed_signup_scroll"> 385 386 <div class="indicates-required"> 387 <span class="asterisk">*</span> 388 indicates required 389 </div> 390 <div class="mc-field-group"> 391 <label for="mce-EMAIL">Email Address 392 <span class="asterisk">*</span> 393 </label> 394 <input type="email" 395 value="" 396 name="EMAIL" 397 class="required email" 398 aria-label="Email" 399 id="mce-EMAIL"> 400 </div> 401 <div class="mc-field-group"> 402 <label for="mce-FNAME">First Name</label> 403 <input type="text" 404 tabindex="0" 405 value="" 406 name="FNAME" 407 class="" 408 aria-label="First name" 409 id="mce-FNAME"> 410 </div> 411 <div class="mc-field-group"> 412 <label for="mce-LNAME">Last Name</label> 413 <input type="text" 414 tabindex="0" 415 value="" 416 name="LNAME" 417 aria-label="Last name" 418 class="" 419 id="mce-LNAME"> 420 </div> 421 <div id="mce-responses" 422 class="clear"> 423 <div class="response" 424 id="mce-error-response" 425 style="display:none"></div> 426 <div class="response" 427 id="mce-success-response" 428 style="display:none"></div> 429 </div> 430 <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups--> 431 <div style="position: absolute; left: -5000px;" 432 aria-hidden="true"> 433 <input type="text" 434 tabindex="0" 435 name="b_25487b8f7ec655d5fba97f7fd_b4a9c11fdd" 436 tabindex="-1" 437 value=""> 438 </div> 439 <div class="clear"> 440 <input type="submit" 441 value="Subscribe" 442 name="subscribe" 443 id="mc-embedded-subscribe" 444 class="button"> 445 </div> 446 </div> 447 </form> 448 </div> 449 <!--End mc_embed_signup--> 450 451 </div> 452 </div> 453 </div> 454 455 456<div class="video-modal"> 457 <div id="video-modal-content" class="video-modal-content"> 458 <iframe 459 id="video_player" 460 width="100%" 461 height="100%" 462 frameborder="0" 463 allowfullscreen 464 src= 465 ></iframe> 466 <a href="#" class="close-video-modal"> 467 <svg 468 version="1.1" 469 xmlns="http://www.w3.org/2000/svg" 470 xmlns:xlink="http://www.w3.org/1999/xlink" 471 x="0" 472 y="0"
473 viewBox="0 0 32 32" 474 style="enable-background:new 0 0 32 32;" 475 xml:space="preserve" 476 width="24" 477 height="24" 478 role="presentation" 479 > 480 <g id="icon-x-close"> 481 <path fill="#ffffff" d="M30.3448276,31.4576271 C29.9059965,31.4572473 29.4852797,31.2855701 29.1751724,30.980339 L0.485517241,2.77694915 C-0.122171278,2.13584324 -0.104240278,1.13679247 0.52607603,0.517159487 C1.15639234,-0.102473494 2.17266813,-0.120100579 2.82482759,0.477288136 L31.5144828,28.680678 C31.9872448,29.1460053 32.1285698,29.8453523 31.8726333,30.4529866 C31.6166968,31.0606209 31.0138299,31.4570487 30.3448276,31.4576271 Z" id="Shape"></path> 482 <path fill="#ffffff" d="M1.65517241,31.4576271 C0.986170142,31.4570487 0.383303157,31.0606209 0.127366673,30.4529866 C-0.12856981,29.8453523 0.0127551942,29.1460053 0.485517241,28.680678 L29.1751724,0.477288136 C29.8273319,-0.120100579 30.8436077,-0.102473494 31.473924,0.517159487 C32.1042403,1.13679247 32.1221713,2.13584324 31.5144828,2.77694915 L2.82482759,30.980339 C2.51472031,31.2855701 2.09400353,31.4572473 1.65517241,31.4576271 Z" id="Shape"></path> 483 </g> 484 </svg> 485 </a> 486 </div> 487 <div class="overlay"></div> 488</div> 489 490 491 <a href="javascript:" 492 id="anchor" 493 aria-label="Back to Top"> <span class="fa fa-chevron-up"></span> </a> 494 495 496<div class="site-nav-drawer hidden"> 497 <div class="inner"> 498 <p class="title">
499 <span class="close"></span> 500 </p> 501 502 <form class="search-bar global-search" 503 role="search" 504 id="search-form"> 505 <input type="search" 506 id="term" 507 name="term" 508 aria-label="Search Term" 509 placeholder="Enter search term" 510 value="" /> 511 <button type="submit"> 512 <span>SEARCH</span> 513 </button> 514 </form> 515 516 <nav role="navigation"> 517 <ul> 518 519 520 521 522 523 524 <li class="toggle-item" 525 id="nav_dt_browse"> 526 <span class="label toggle">Workouts 527 <span class="fa fa-caret-down"></span> 528 </span> 529 <ul class="toggle-wrapper"> 530 <li> 531 <a href="/categories" class="workouts-dropdown__link workouts-dropdown__link--ondemand">On-Demand</a> 532 </li> 533 <li> 534 <a href="/gym_workouts" class="workouts-dropdown__link workouts-dropdown__link--gym" aria-label="Gym Workouts â New"> 535 <span class="workouts-dropdown__gym-text">Gym Workouts</span> 536 <span class="workouts-dropdown__new-badge">NEW</span> 537 </a> 538 </li> 539 </ul> 540 </li> 541 542 543 544 545 <li class="live-stream-link nav_dt_browse" 546 aria-label="Explore live streams"> 547 <a href="/live_streams" aria-label="Livestream">Livestream</a> 548 </li> 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 <li class="toggle-item" id="nav_dt_browse"> 565 <span class="label toggle">Subscribe 566 <span class="fa fa-caret-down"></span> 567 </span> 568 <ul class="toggle-wrapper"> 569 <li> 570 <a href="/orders/retail_account">All - Access</a> 571 </li> 572 <li> 573 <a href="/accounts/signup/">Crunch Members</a> 574 </li> 575 </ul> 576 </li> 577 <li id="nav_dt_start_free_trial"> 578 <a href="/crunch_subscriptions" aria-label="Start free trail for retail user">Start Free Trial</a> 579 </li> 580 581 <li 582 id="nav_dt_ia"> 583 <a href="/instantaccess">Apps</a> 584 </li> 585 <li id="nav_sn_support"> 586 <a href="javascript:zE.activate({hideOnClose: true})">Support</a> 587 </li> 588 589 590 591 592 <li class="active" 593 id="nav_sn_login"> 594 <a href="/accounts/login" aria-label="Log into your account">Log In</a> 595 </li> 596 597 </ul> 598 </nav> 599 600 <div class="site-nav-drawer-footer"> 601 <p> 602 Let's be social 603 <span class="social-icons"> 604 605 606 <a class="fa fa-twitter" 607 rel="external" 608 href="https://twitter.com/crunchgym" 609 aria-label="Twitter"></a> 610 611 612 613 <a class="fa fa-facebook" 614 rel="external" 615 href="https://www.facebook.com/CRUNCH/" 616 aria-label="Facebook"></a> 617 618 619 620 <a class="fa fa-instagram" 621 rel="external" 622 href="https://www.instagram.com/crunchgym/" 623 aria-label="Instagram"></a> 624 625 626 627 </span> 628 </p> 629 630 <p> 631 © 2026 Crunch+. All Rights Reserved. </p> 632 </div> 633 </div> 634</div> 635 636<style> 637 .toggle .fa-caret-down { 638 color: #333; 639 transition: transform 0.3s ease, color 0.3s ease; 640 } 641 642 .toggle-item.open > .toggle .fa-caret-down { 643 transform: rotate(180deg); 644 color: #E1456A; 645 } 646</style> 647
648<script> 649 document.addEventListener("DOMContentLoaded", function () { 650 document.querySelectorAll(".toggle-item .toggle").forEach(function (toggle) { 651 toggle.addEventListener("click", function () { 652 const parent = this.closest(".toggle-item"); 653 parent.classList.toggle("open"); 654 }); 655 }); 656 }); 657</script>
657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674<!-- OneTrust Cookies Consent Notice -->
675<script type="text/javascript"> 676 (function () { 677 if (window.location.hostname === "crunchplus.com") { 678 loadOptanonScripts( 679 "https://cdn.cookielaw.org/consent/01949038-adfa-7a50-a000-2f9d149c8771/OtAutoBlock.js", 680 "https://cdn.cookielaw.org/scripttemplates/otSDKStub.js", 681 "01949038-adfa-7a50-a000-2f9d149c8771" 682 ); 683 } else { 684 loadOptanonScripts( 685 "https://cdn.cookielaw.org/consent/01949038-adfa-7a50-a000-2f9d149c8771-test/OtAutoBlock.js", 686 "https://cdn.cookielaw.org/scripttemplates/otSDKStub.js", 687 "01949038-adfa-7a50-a000-2f9d149c8771-test" 688 ); 689 } 690 691 function loadOptanonScripts(autoBlockUrl, sdkStubUrl, domainScript) { 692 var otScript1 = document.createElement('script'); 693 otScript1.src = autoBlockUrl; 694 document.head.appendChild(otScript1); 695 696 var otScript2 = document.createElement('script'); 697 otScript2.src = sdkStubUrl; 698 otScript2.setAttribute('data-domain-script', domainScript); 699 document.head.appendChild(otScript2); 700 701 var optanonScript = document.createElement('script'); 702 optanonScript.type = "text/javascript"; 703 optanonScript.innerHTML = "function OptanonWrapper() { }"; 704 document.head.appendChild(optanonScript); 705 } 706 })(); 707</script>
707 708<!-- OneTrust Cookies Consent Notice End --> 709 710<style> 711 div#onetrust-close-btn-container { 712 display: none; 713 } 714 715 @media screen and (max-width: 1024px){ 716 .login-button-mobile { 717 background-color: white; 718 color: #000; 719 display: flex; 720 width: 70px; 721 border-radius: 100px; 722 padding: 8px; 723 justify-content: center; 724 text-decoration: none; 725 font-family: 'Interstate-Black' !important; 726 } 727 728 header .inner .single.branding { 729 display: flex; 730 margin: 1em; 731 } 732 733 body header .inner { 734 padding: 0; 735 } 736 737 .menu-drawer .fa.fa-bars { 738 font-size: 20px !important; 739 } 740 741 .mobile-show { 742 align-self: center; 743 } 744 745 body .header--right { 746 display: -webkit-flex; 747 display: flex; 748 -webkit-justify-content: flex-end; 749 justify-content: flex-end; 750 -webkit-align-self: center; 751 align-self: center; 752 gap: 1rem; 753 } 754 755 body button.mobile-login { 756 padding: 0; 757 } 758 759 body header .logo img { 760 max-height: 45px !important; 761 } 762 } 763 764 .whats-new__notification { 765 background: linear-gradient(90deg, #E33B89 0%, #5B32AC 100%); 766 } 767 768 @media screen and (min-width: 1025px){ 769 body .hide-header-right-section { 770 display: none; 771 } 772 773 body button.mobile-login { 774 display: none; 775 } 776 } 777 778 @keyframes popupAnimation { 779 0% { 780 top: -100%; /* Start position off-screen */ 781 left: 50%; 782 transform: translateX(-50%); 783 } 784 45% { 785 top: 50%; /* Move to the center */ 786 } 787 80% { 788 top: 48%; /* Slight bounce */ 789 } 790 100% { 791 top: 50%; /* End position centered */ 792 left: 50%; 793 transform: translate(-50%, -50%); 794 } 795 } 796 797 798 .popup { 799 display: none; 800 position: fixed; 801 top: 50%; 802 left: 50%; 803 transform: translate(-50%, -50%); 804 width: auto; 805 max-width: 96%; 806 807 max-height: 90%; 808 animation: popupAnimation 1s ease-in-out; 809 background-color: #fff; 810 padding: 20px; 811 border-radius: 10px; 812 box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); 813 z-index: 99999; 814 } 815 816 .popup-content { 817 text-align: center; 818 color: #000; 819 } 820 821 .popup h2 { 822 font-family: "Interstate-Black" !important; 823 font-size: 25px; 824 word-spacing: -3px; 825 animation: none; 826 text-align: center; 827 margin: 0 auto 10px; 828 display: block; 829 } 830 831 .popup p { 832 margin-bottom: 20px; 833 } 834 835 .popup .button { 836 display: flex; 837 justify-content: center; 838 background-color: #fff; 839 font-size: 14px; 840 gap: 14px; 841 cursor: pointer; 842 } 843 844 .popup button { 845 border: none; 846 } 847 848 #close-btn { 849 font-family: "Interstate-Black" !important; 850 } 851 852 #install-btn { 853 font-family: "Interstate-Black" !important; 854 width: 120px; 855 justify-content: center; 856 display: flex; 857 background: linear-gradient(90deg, #E33B89 0%, #5B32AC 100%); 858 } 859 860 .close-button { 861 background: none; 862 top: 0; 863 right: 0; 864 } 865 866 .close-button.close::before, .close-button.close::after { 867 background: #000; 868 height: 1em; 869 margin-right: 7px; 870 margin-top: 2px; 871 left: unset; 872 } 873 874 .backdrop { 875 display: none; 876 position: fixed; 877 top: 0; 878 left: 0; 879 width: 100%; 880 height: 100%; 881 background-color: rgba(0, 0, 0, 0.5); 882 z-index: 999; 883 } 884 885 @media screen and (max-width: 380px){ 886 #close-btn { 887 font-size: 11px; 888 } 889 890 #install-btn { 891 font-size: 11px; 892 } 893 894 .popup h2 { 895 font-size: 20px; 896 } 897 } 898 899 @media screen and (max-width: 319px){ 900 .popup .button { 901 display: grid; 902 } 903 } 904 905 .show { 906 display: block; 907 } 908 909 header .inner.search.show-search { 910 margin-bottom: 0px !important 911 } 912 913</style> 914 915 916 917 918<header class="site-header"> 919 920 <input type="hidden" 921 id="show_location_login" 922 value="false" /> 923 924 925 <input type="hidden" 926 id="content_delivery_preference" 927 value="" /> 928 929 <input type="hidden" 930 id="general_messaging_restricted_button_link" 931 value="" /> 932 933 <body> 934 <div id="install-popup" class="popup"> 935 <button type="button" class="close close-button close-button-event-class" aria-label="Close"> 936 </button> 937 <div class="popup-content"> 938 <h2>Workout With The Crunch+ App</h2> 939 <p>Live & on-demand workouts are better on the app.</p> 940 </div> 941 <div class="button"> 942 <button type="button" aria-label="Install an app" tabindex="0" id="install-btn" style="background: linear-gradient(90deg, #E33B89 0%, #5B32AC 100%);">Install Now</button> 943 <button type="button" tabindex="0" id="close-btn" aria-label="Continue on website">Continue on website</button> 944 </div> 945 </div> 946 <div id="backdrop" class="backdrop"></div> 947 </body> 948 <div class="inner restricted"> 949 <div class="single left"> 950 951 952 953 <nav style="width: 100%" role="navigation" class="site-nav-header mobile-hide" 954 aria-label="Top Primary"> 955 <ul> 956 957 958 959 960 <li class="has-dropdown"> 961 <a href="/categories" aria-label="Browse all categories" aria-haspopup="true" aria-expanded="false">Workouts
962 <span class="dropdown-arrow"></span> 963 </a> 964 <ul class="dropdown workouts-dropdown" 965 role="menu"> 966 <li class="workouts-dropdown__row"> 967 <a href="/categories" class="workouts-dropdown__link workouts-dropdown__link--ondemand">On-Demand</a> 968 </li> 969 <li class="workouts-dropdown__row"> 970 <a href="/gym_workouts" class="workouts-dropdown__link workouts-dropdown__link--gym" aria-label="Gym Workouts â New"> 971 <span class="workouts-dropdown__gym-text">Gym Workouts</span> 972 <span class="workouts-dropdown__new-badge">NEW</span> 973 </a> 974 </li> 975 </ul> 976 </li> 977 978 979 980 981 982 983 984 985 986 <li class="live-stream-link" aria-label="Explore live streams"> 987 <a href="/live_streams" aria-label="Livestream">Livestream</a> 988 </li> 989 990 991 992 993 <li> 994 <a href="/instantaccess" aria-label="Explore instant access devices">APPS</a> 995 </li> 996 997 998 999 1000 1001 </ul> 1002 </nav> 1003 1004 </div> 1005 1006 1007 <div class="single branding"> 1008 <nav role="navigation" class="site-nav-header-login mobile-show" 1009 aria-label="Mobile"> 1010 <ul> 1011 <li class="menu-drawer"> 1012 <a href="#" 1013 data-transition="ease" 1014 aria-label="Show Mobile Menu" 1015 title="Mobile Menu"> 1016 <i class="fa fa-bars"></i> 1017 </a> 1018 </li> 1019 </ul> 1020 </nav> 1021 1022 1023 <a href="/" 1024 class="logo"> 1025 1026 1027 1028 1029 <img src="//dbjtwsnsmnuln.cloudfront.net/assets/pink_essence/White-logo-by-crunch-fitness-c841aa3d48b47c06bcf40f3220d37c5b51798893b59ce9da0071eab149654685.png" 1030 alt="Pink Essence theme logo" /> 1031 1032 1033 </a> 1034 1035 1036 <div class="header--right hide-header-right-section"> 1037 1038 1039 <button type="button" tabindex="0" class="mobile-login"> 1040 <a href="/accounts/login/" 1041 aria-label="Login into your account" 1042 class="login-button-mobile">LOGIN 1043 </a> 1044 </button> 1045 1046 1047 </div> 1048 1049 </div> 1050 1051 <div class="single right"> 1052 <div class="inner"> 1053 <nav role="navigation" class="site-nav-header-login " 1054 aria-label="Top Secondary"> 1055 <ul> 1056 1057 <li id="nav_dt_search" 1058 class="toggle-search" 1059 aria-label="Search" 1060 tabindex="0"> 1061 <span class="toggle open"> 1062 <span class="fa fa-search"></span> 1063 </span> 1064 </li> 1065 1066 1067 <li class="has-dropdown"> 1068 <a href="/crunch_subscriptions" 1069 aria-label="View subscription plans" 1070 aria-haspopup="true" 1071 aria-expanded="false"> 1072 Subscribe <span class="dropdown-arrow"></span> 1073 </a> 1074 1075 <ul class="dropdown subscribe" role="menu"> 1076 <li id="sub_all_access"> 1077 <a href="/orders/retail_account" 1078 aria-label="Subscribe to the AllâAccess plan"> 1079 ALL â Access 1080 </a> 1081 </li> 1082 <li id="sub_crunch_member"> 1083 <a href="/accounts/signup/" 1084 aria-label="Subscribe as a Crunch Member"> 1085 Crunch Members 1086 </a> 1087 </li> 1088 </ul> 1089 </li> 1090 1091 1092 1093 1094 1095 1096 1097 <li id="dt_login"> 1098 <a href="/accounts/login/" 1099 aria-label="Login to your account" 1100 >LOGIN 1101 </a> 1102 </li> 1103 1104 1105 1106 1107 1108 <li> 1109 <a href="/crunch_subscriptions" class="button plain" aria-label="Explore retail member plans">TRY FOR FREE</a> 1110 </li> 1111 1112 </ul> 1113 <ul><li id="nav_dt_search_left" 1114 class="toggle-search"><div class="inner search"> 1115 <form class="search-bar global-search" 1116 role="search" 1117 id="search-form"> 1118 <input type="search" 1119 id="term" 1120 name="term" 1121 placeholder="Enter search term" 1122 aria-label="Search" 1123 value="" /> 1124 <button type="submit" aria-label="Search">
1125 <span>SEARCH</span> 1126 </button> 1127 </form> 1128 </div> 1129 <span class="toggle fa fa-close"></span> 1130 </li></ul> 1131 </nav> 1132 </div> 1133 </div> 1134 </div> 1135 1136</header> 1137
1138<script> 1139 function setCookie(name, value, days) { 1140 let expires = ""; 1141 if (days) { 1142 const date = new Date(); 1143 date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); 1144 expires = "; expires=" + date.toUTCString(); 1145 } 1146 document.cookie = name + "=" + value + expires + "; path=/"; 1147 } 1148 1149 function getCookie(name) { 1150 const nameEQ = name + "="; 1151 const ca = document.cookie.split(';'); 1152 for(let i = 0; i < ca.length; i++) { 1153 let c = ca[i]; 1154 while (c.charAt(0) === ' ') c = c.substring(1, c.length); 1155 if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length); 1156 } 1157 return null; 1158 } 1159 var params = new URLSearchParams(window.location.search); 1160 1161 if (params.has("term")) { 1162 var payloadSearch = { 1163 'event': 'search', 1164 'search_term': params.get("term"), 1165 } 1166 dataLayer.push(payloadSearch); 1167 } 1168 1169 function isIOS() { 1170 return /iPhone|iPad|iPod/i.test(navigator.userAgent); 1171 } 1172 1173 function isSafariOnIPad() { 1174 return navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1; 1175 } 1176 1177 function isMobileOrTablet() { 1178 const userAgent = navigator.userAgent; 1179 return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent) || isSafariOnIPad(); 1180 } 1181 1182 function showInstallPopup() { 1183 const installPopup = document.getElementById("install-popup"); 1184 const backdrop = document.getElementById("backdrop"); 1185 1186 if (getCookie('installPopup') !== 'false' && isMobileOrTablet()) { 1187 backdrop.classList.add("show"); 1188 installPopup.classList.add("show"); 1189 } 1190 } 1191 1192 document.addEventListener("DOMContentLoaded", function() { 1193 const action = "login"; 1194 const excludedActions = ['new_account', 'payment', 'thank_you', 'password', 'crunch_subscriptions', 'user_signup', 'tlc_90dayfiance']; // Excluded list of pages 1195 1196 if (!excludedActions.includes(action)) { 1197 setTimeout(showInstallPopup, 10000); // Show popup after 10 seconds of page load 1198 } 1199 1200 // Prevent the popup from being shown on scroll or click 1201 window.addEventListener("scroll", function(event) { 1202 event.stopPropagation(); 1203 }); 1204 1205 window.addEventListener("click", function(event) { 1206 event.stopPropagation(); 1207 }); 1208 1209 const installPopup = document.getElementById("install-popup"); 1210 const installBtn = document.getElementById("install-btn"); 1211 const closeBtn = document.querySelectorAll(".close-button-event-class, #close-btn"); 1212 const backdrop = document.getElementById("backdrop"); 1213 1214 1215 closeBtn.forEach((el) => { 1216 el.addEventListener("click", function() { 1217 installPopup.classList.remove("show"); 1218 backdrop.classList.remove("show"); 1219 setCookie('installPopup', 'false', 90); // Set cookie to expire in 3 months (approximately 90 days) 1220 }); 1221 }) 1222 1223 installBtn.addEventListener("click", function() { 1224 const appUrlIOS = "https://apps.apple.com/us/app/crunch/id6443678389"; 1225 const appUrlAndroid = "https://play.google.com/store/apps/details?id=com.crunchplus"; 1226 1227 if (isIOS() || isSafariOnIPad()) { 1228 window.location.href = appUrlIOS; 1229 } else { 1230 window.location.href = appUrlAndroid; 1231 } 1232 setCookie('installPopup', 'false', 90); // Set cookie to expire in 3 months (approximately 90 days) 1233 installPopup.classList.remove("show"); 1234 backdrop.classList.remove("show"); 1235 }); 1236 }); 1237</script>
1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249<style> 1250 .text-section.social-feeds, 1251 header, 1252 footer { 1253 display: none; 1254 } 1255 1256 .interstate h1 { 1257 font-size: 28px !important; 1258 font-family: Interstate-Black !important; 1259 color: #000 !important; 1260 margin: 0; 1261 } 1262 1263 .bold-btn{ 1264 margin-top: 0px; 1265 height: 45px; 1266 font-size: 17px; 1267 text-transform: capitalize; 1268 font-family: 'Interstate-Black' !important; 1269 } 1270 1271 body.login-page:before { 1272 1273 background-image: url("//crunchplus-prod-cdn2.imgix.net/2154/images/mJJwh6xpSSKQQG7fkhGS_1703501760997_ThemeSetting_2845?ixlib=rb-0.3.4&s=635451ec0afa328df6bd615a5de93ef4&auto=compress"); 1274 background-size: cover; 1275 background-position: center; 1276 background-repeat: no-repeat; 1277 width: 100%; 1278 height: 100vh; 1279 left: 0; 1280 top: 0; 1281 position: fixed; 1282 z-index: -1; 1283 1284 } 1285 .login-errors, .login-errors a { 1286 font-size: 14px; 1287 color: red !important; 1288 } 1289 .form-error.customer_login { 1290 font-size: small !important; 1291 height: auto; 1292 width: 100%; 1293 overflow: hidden; 1294 } 1295 1296 .small { 1297 padding-top: 10px; 1298 font-weight: bold; 1299 a { 1300 color: #000000 !important; 1301 font-size: 11px;" 1302 } 1303 } 1304 1305 .page-login .no-pad-no-margin { 1306 padding-top: 0; 1307 margin-bottom: 0; 1308 } 1309 1310 .fa-angle-left { 1311 color: #333333 1312 } 1313 1314 .login-submit { 1315 padding-top: 10px !important; 1316 } 1317 1318#loginSelect { 1319 background: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0Ljk1IDEwIj48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6I2ZmZjt9LmNscy0ye2ZpbGw6IzQ0NDt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPmFycm93czwvdGl0bGU+PHJlY3QgY2xhc3M9ImNscy0xIiB3aWR0aD0iNC45NSIgaGVpZ2h0PSIxMCIvPjxwb2x5Z29uIGNsYXNzPSJjbHMtMiIgcG9pbnRzPSIxLjQxIDQuNjcgMi40OCAzLjE4IDMuNTQgNC42NyAxLjQxIDQuNjciLz48cG9seWdvbiBjbGFzcz0iY2xzLTIiIHBvaW50cz0iMy41NCA1LjMzIDIuNDggNi44MiAxLjQxIDUuMzMgMy41NCA1LjMzIi8+PC9zdmc+) no-repeat; 1320 background-position: right 5px top; /* Change the px value here to change the distance */ 1321 -moz-appearance: none; 1322 -webkit-appearance: none; 1323 appearance: none; 1324 padding : 4px 20px 1325} 1326 1327 .country-select { 1328 height:50px; 1329 width:100%; 1330 background-color: #E9E9E9; 1331 border-radius: 8px; 1332 margin-bottom: 10px; 1333 font-size: 16px; 1334 text-align: left; 1335 cursor: pointer; 1336 position: relative; 1337 } 1338 .country-select:hover { 1339 background-color: #d9d9d9; 1340 } 1341 .country-select.active { 1342 background-color: #79BDE9; 1343 color: #000000bd; 1344 } 1345 .country-select-icon { 1346 height: 50px; 1347 display: inline-block; 1348 position: relative; 1349 padding-left: 10px; 1350 } 1351 .country-select-text { 1352 transform: translateY(30%); 1353 display: inline-block; 1354 position: relative; 1355 padding-left: 20px; 1356 font-weight: 400; 1357 font-weight: bold; 1358 } 1359 1360 .logo { 1361 height: 60px; 1362 width: 160px; 1363 } 1364 1365 .country-select img { 1366 height: 36px; 1367 width: 36px; 1368 transform: translateY(20%); 1369 } 1370 @media only screen and (max-width: 600px) { 1371 .country-select { 1372 font-size: 14px; 1373 } 1374 .country-select-text { 1375 transform: translateY(50%); 1376 } 1377 .country-select-icon, .country-select-icon img { 1378 display: none; 1379 transform: none; 1380 } 1381 } 1382 1383 .divider { 1384 text-align: center; 1385 margin: 10px 0;; 1386 position: relative; 1387 } 1388 1389 .divider span { 1390 background: #fff; 1391 padding: 0 16px; 1392 position: relative; 1393 z-index: 1; 1394 color: black; 1395 font-size: 14px; 1396 font-family: Interstate-Regular; 1397 } 1398 1399 .divider hr { 1400 position: absolute; 1401 top: 50%; 1402 left: 0; 1403 right: 0; 1404 margin: 0; 1405 border: none; 1406 border-top: 1px solid #e0e0e0; 1407 } 1408 1409 .social-login { 1410 display: flex; 1411 flex-direction: row; 1412 gap: 12px; 1413 justify-content: space-between; 1414 } 1415 1416 .social-login button { 1417 font-size: 14px; 1418 font-weight: 500; 1419 flex: 1; 1420 background-color: white !important 1421 } 1422 1423 .social-btn { 1424 display: flex; 1425 align-items: center; 1426 justify-content: center; 1427 padding: 12px; 1428 border: 1px solid #e0e0e0; 1429 border-radius: 100px; 1430 background: white; 1431 cursor: pointer; 1432 width: 100%; 1433 font-size: 14px; 1434 transition: background-color 0.2s, border-color 0.2s; 1435 color: #000; 1436 min-width: 0; 1437 } 1438 1439 .social-btn:hover { 1440 background-color: #f8f8f8 !important; 1441 border-color: #d0d0d0; 1442 } 1443 1444 .social-btn img { 1445 margin-right: 2px;
1446 width: 20px; 1447 height: 20px; 1448 object-fit: contain; 1449 } 1450 1451 .social-btn span { 1452 font-family: Interstate-Black; 1453 text-transform: none; 1454 } 1455 1456 1457 /* Override theme's general form button styles for social buttons */ 1458 form .social-btn, 1459 form button.social-btn, 1460 form [type="button"].social-btn { 1461 background: white !important; 1462 background-color: white !important; 1463 background-image: none !important; 1464 border: 1px solid #989898 !important; 1465 color: #000 !important; 1466 padding: 10px; 1467 font-family: inherit !important; 1468 } 1469 1470 form .social-btn:hover, 1471 form button.social-btn:hover, 1472 form [type="button"].social-btn:hover { 1473 background: #f8f8f8 !important; 1474 background-color: #f8f8f8 !important; 1475 background-image: none !important; 1476 border: 1px solid #989898 !important; 1477 padding: 10px; 1478 color: #000 !important; 1479 } 1480 1481 .apple { 1482 width: 26px !important; 1483 height: 24px !important; 1484 margin-top: -5px; 1485 } 1486 1487 .google { 1488 width: 29px !important; 1489 height: 28px !important; 1490 } 1491 1492 .meta { 1493 width: 26px !important; 1494 height: 16px !important; 1495 1496 } 1497 1498 /* Add vertical spacing between login section and "Available On" section */ 1499 .image-section.apps .text-section { 1500 margin-top: 60px !important; 1501 padding-top: 20px !important; 1502 } 1503 1504 /* More specific targeting for login page text-section */ 1505 .page-login .text-section { 1506 margin-top: 60px !important; 1507 padding-top: 20px !important; 1508 } 1509 1510 /* Add bottom margin to the login content section */ 1511 .page-login .image-section .content { 1512 margin-bottom: 60px !important; 1513 } 1514 1515 /* Mobile-specific styles for social login */ 1516 /* Mobile-specific styles for social login */ 1517 @media only screen and (max-width: 480px) { 1518 .social-login { 1519 display: flex; 1520 flex-direction: row; 1521 gap: 8px; 1522 width: 100%; 1523 padding: 0; 1524 } 1525 1526 .social-login .social-btn, 1527 .social-login button.social-btn, 1528 form .social-login .social-btn, 1529 form .social-login button.social-btn, 1530 .social-login .social-btn:hover, 1531 .social-login button.social-btn:hover, 1532 form .social-login .social-btn:hover, 1533 form .social-login button.social-btn:hover { 1534 display: flex; 1535 flex-direction: column; 1536 align-items: center; 1537 justify-content: center; 1538 padding: 6px; 1539 border: 1px solid #989898 !important; 1540 border-radius: 25px !important; 1541 background: white; 1542 flex: 1; 1543 min-height: 40px; 1544 min-width: 0; 1545 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) !important; 1546 transition: all 0.2s ease-in-out; 1547 } 1548 1549 .social-btn img { 1550 width: 20px; 1551 height: 20px; 1552 margin-right: 0; 1553 margin-bottom: 2px; 1554 object-fit: contain; 1555 } 1556 1557 .social-btn span { 1558 font-size: 10px; 1559 color: #000; 1560 font-weight: 500; 1561 text-align: center; 1562 white-space: nowrap; 1563 } 1564 1565 .social-btn .apple { 1566 width: 18px !important; 1567 height: 18px !important; 1568 margin-top: 0; 1569 } 1570 1571 .social-btn .google { 1572 width: 18px !important; 1573 height: 18px !important; 1574 } 1575 1576 .social-btn .meta { 1577 width: 18px !important; 1578 height: 18px !important; 1579 } 1580 } 1581 @media only screen and (max-width: 1024px) { 1582 .page-login .text-section, 1583 .page-login .device-image { 1584 display: none !important; 1585 } 1586 } 1587 1588 /* Landscape mode optimizations */ 1589 @media only screen and (orientation: landscape) and (max-height: 600px) { 1590 /* Force viewport to start at top */ 1591 html { 1592 scroll-behavior: smooth !important; 1593 overflow-x: hidden !important; 1594 } 1595 1596 body.login-page { 1597 height: auto !important; 1598 min-height: 100vh !important; 1599 overflow-y: auto !important; 1600 -webkit-overflow-scrolling: touch !important; 1601 position: relative !important; 1602 margin: 0 !important; 1603 padding: 0 !important; 1604 } 1605 1606 body.login-page:before { 1607 position: fixed !important; 1608 height: 100vh !important; 1609 z-index: -1 !important; 1610 } 1611 1612 .image-section.apps { 1613 height: auto !important; 1614 min-height: 100vh !important; 1615 overflow-y: visible !important; 1616 overflow-x: hidden !important; 1617 display: block !important; 1618 padding: 0 !important; 1619 box-sizing: border-box; 1620 position: relative !important; 1621 top: 0 !important; 1622 margin: 0 !important; 1623 } 1624 1625 .image-section.apps .content { 1626 margin: 15px auto !important; 1627 max-width: 400px; 1628 margin: 0 auto; 1629 width: 100%; 1630 height: auto !important; 1631 min-height: auto !important; 1632 box-sizing: border-box; 1633 display: block !important; 1634 position: relative !important; 1635 top: 0 !important; 1636 } 1637 1638 .image-section.apps .content .inner { 1639 padding: 0; 1640 position: relative !important; 1641 top: 0 !important; 1642 height: auto !important; 1643 } 1644 1645 /* Ensure logo has proper top space */ 1646 .logo { 1647 height: 60px !important; 1648 width: 160px !important; 1649 margin-bottom: 15px !important; 1650 margin-top: 10px !important; 1651 display: block; 1652 position: relative !important; 1653 z-index: 10 !important; 1654 } 1655 1656 .logo img { 1657 height: 60px !important; 1658 width: auto !important; 1659 } 1660 1661 /* Ensure bucket starts right after logo */ 1662 .bucket { 1663 background: rgba(255, 255, 255, 0.95); 1664 border-radius: 15px; 1665 padding: 15px; 1666 margin: 0px 0 5px 0 !important; 1667 backdrop-filter: blur(10px); 1668 position: relative !important; 1669 z-index: 10 !important; 1670 height: auto !important; 1671 } 1672 1673 .bold-text, .interstate h1 { 1674 font-size: 28px !important; 1675 margin-bottom: 10px !important; 1676 margin-top: 5px !important; 1677 } 1678 1679 .small { 1680 padding-top: 10px !important; 1681 margin-bottom: 5px !important; 1682 margin-top: 0px !important; 1683 } 1684 1685 .small a { 1686 font-size: 11px !important; 1687 } 1688 1689 .form__field { 1690 margin-bottom: 10px !important; 1691 } 1692 1693 .form__field input { 1694 height: 45px !important; 1695 font-size: 16px !important; 1696 } 1697 1698 .form__field label { 1699 font-size: 16px !important; 1700 margin-bottom: 5px !important; 1701 } 1702 1703 .bold-btn { 1704 height: 45px !important; 1705 font-size: 17px !important; 1706 } 1707 1708 .social-login { 1709 margin-top: 15px !important; 1710 margin-bottom: 25px !important; 1711 } 1712 1713 .social-btn { 1714 padding: 12px !important; 1715 font-size: 14px !important; 1716 } 1717 1718 .social-btn img {
1719 width: 20px !important; 1720 height: 20px !important; 1721 } 1722 1723 .divider { 1724 margin: 15px 0 !important; 1725 } 1726 1727 .divider span { 1728 font-size: 14px !important; 1729 } 1730 1731 .text-end { 1732 margin: 8px 0 !important; 1733 } 1734 1735 .text-end a { 1736 font-size: 12px !important; 1737 } 1738 1739 /* Hide text section in landscape to make more room */ 1740 .text-section { 1741 display: none !important; 1742 } 1743 1744 .device-image { 1745 display: none !important; 1746 } 1747 } 1748 1749 /* Additional mobile landscape optimizations */ 1750 @media only screen and (orientation: landscape) and (max-height: 480px) { 1751 /* Force viewport to start at top */ 1752 html { 1753 scroll-behavior: smooth !important; 1754 overflow-x: hidden !important; 1755 } 1756 1757 body.login-page { 1758 height: auto !important; 1759 min-height: 100vh !important; 1760 overflow-y: auto !important; 1761 -webkit-overflow-scrolling: touch !important; 1762 position: relative !important; 1763 margin: 0 !important; 1764 padding: 0 !important; 1765 } 1766 1767 .image-section.apps { 1768 height: auto !important; 1769 min-height: 100vh !important; 1770 padding: 0 !important; 1771 position: relative !important; 1772 top: 0 !important; 1773 margin: 0 !important; 1774 overflow-y: visible !important; 1775 overflow-x: hidden !important; 1776 } 1777 1778 .image-section.apps .content { 1779 margin: 10px auto !important; 1780 height: auto !important; 1781 min-height: auto !important; 1782 position: relative !important; 1783 top: 0 !important; 1784 } 1785 1786 .bucket { 1787 padding: 15px; 1788 margin: 0px 0 5px 0 !important; 1789 position: relative !important; 1790 z-index: 10 !important; 1791 height: auto !important; 1792 } 1793 1794 /* Ensure logo has proper top space */ 1795 .logo { 1796 height: 60px !important; 1797 width: 160px !important; 1798 margin-bottom: 15px !important; 1799 margin-top: 10px !important; 1800 position: relative !important; 1801 z-index: 10 !important; 1802 } 1803 1804 .logo img { 1805 height: 60px !important; 1806 width: auto !important; 1807 } 1808 1809 .bold-text, .interstate h1 { 1810 font-size: 28px !important; 1811 margin-bottom: 10px !important; 1812 margin-top: 5px !important; 1813 } 1814 1815 .form__field { 1816 margin-bottom: 10px !important; 1817 } 1818 1819 .form__field input { 1820 height: 45px !important; 1821 font-size: 16px !important; 1822 } 1823 1824 .form__field label { 1825 font-size: 16px !important; 1826 margin-bottom: 5px !important; 1827 } 1828 1829 .bold-btn { 1830 height: 45px !important; 1831 font-size: 17px !important; 1832 } 1833 1834 .small { 1835 padding-top: 10px !important; 1836 margin-top: 0px !important; 1837 } 1838 1839 .small a { 1840 font-size: 11px !important; 1841 } 1842 1843 .divider { 1844 margin: 15px 0 !important; 1845 } 1846 1847 .divider span { 1848 font-size: 14px !important; 1849 } 1850 1851 .social-login { 1852 margin-top: 15px !important; 1853 margin-bottom: 25px !important; 1854 } 1855 1856 .social-btn { 1857 padding: 12px !important; 1858 font-size: 14px !important; 1859 } 1860 1861 .social-btn img { 1862 width: 20px !important; 1863 height: 20px !important; 1864 } 1865 1866 .text-end { 1867 margin: 8px 0 !important; 1868 } 1869 1870 .text-end a { 1871 font-size: 12px !important; 1872 } 1873 1874 /* Hide text section in landscape to make more room */ 1875 .text-section { 1876 display: none !important; 1877 } 1878 1879 .device-image { 1880 display: none !important; 1881 } 1882 } 1883 1884 /* Modal scroll prevention */ 1885 body.modal-open { 1886 overflow: hidden !important; 1887 position: fixed !important; 1888 width: 100% !important; 1889 height: 100% !important; 1890 } 1891 1892 /* Hide login form content when modal is open */ 1893 body.modal-open .image-section.apps > .content > .inner > *:not(#oauth-login-modal) { 1894 display: none !important; 1895 } 1896 1897 /* Hide the main content container background when modal is open */ 1898 body.modal-open .image-section.apps > .content { 1899 background: transparent !important; 1900 } 1901 1902 body.modal-open .image-section.apps > .content > .inner { 1903 background: transparent !important; 1904 } 1905 1906 /* Ensure modal covers full screen and prevents background interaction */ 1907 #oauth-login-modal { 1908 position: fixed !important; 1909 top: 0 !important; 1910 left: 0 !important; 1911 width: 100vw !important; 1912 height: 100vh !important; 1913 background-color: rgba(0, 0, 0, 0.5) !important; 1914 display: none; 1915 justify-content: center;
1916 align-items: center; 1917 z-index: 9999 !important; 1918 overflow: auto; 1919 } 1920 1921 /* Modal content styling */ 1922 #oauth-login-modal > div { 1923 background: white; 1924 padding: 30px; 1925 border-radius: 8px; 1926 box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); 1927 max-width: 400px; 1928 width: 90%; 1929 max-height: 90vh; 1930 overflow-y: auto; 1931 position: relative; 1932 } 1933 1934 /* Landscape mode modal adjustments */ 1935 @media only screen and (orientation: landscape) and (max-height: 600px) { 1936 #oauth-login-modal { 1937 align-items: flex-start !important; 1938 padding: 20px 0 !important; 1939 overflow-y: auto !important; 1940 -webkit-overflow-scrolling: touch !important; 1941 } 1942 1943 #oauth-login-modal > div { 1944 max-height: calc(100vh - 40px) !important; 1945 height: auto !important; 1946 margin: auto !important; 1947 overflow-y: auto !important; 1948 -webkit-overflow-scrolling: touch !important; 1949 } 1950 } 1951</style> 1952 <div class="image-section apps"> 1953 <section class="content"> 1954 <div class="inner"> 1955 1956 1957 1958 <a href="/" aria-label="Back to request url"> 1959 1960 <span class="logo"> 1961 <img src="//crunchplus-prod-cdn2.imgix.net/2154/images/0zdrDkiuRBmGsWgVzewz_1738229798587_ThemeSetting_2845?ixlib=rb-0.3.4&s=2fedb4690203a5d002fee0abf502aa09&auto=compress" 1962 alt="Crunch+" /></span> 1963 1964 </a> 1965 <div 1966 class="bucket" 1967 id="customer_login_form" 1968 style="display: block;"> 1969 <p class="small no-pad-no-margin"> 1970 <span class="fa fa-angle-left"></span> 1971 <a onclick="history.back()">Back</a> 1972 </p> 1973 <h1 class="bold-text">Login</h1> 1974 1975 1976 <form accept-charset="UTF-8" id="customer_login" method="post" action="/login?c"> 1977 1978 <input name="utf8" type="hidden" value="✓" /> 1979 1980 <input name="authenticity_token" type="hidden" value="PUPnJpHYF3yZEHPHbzXEh3+c+oUgzi458N2DvqYaEVU=" /> 1981 1982 1983 <input type="hidden" name="user[merchant_id]" value="2154" /> 1984 1985 1986 1987 <div class="form__wrapper"> 1988 1989 <input type="hidden" id="authenticity_token" value="O7CglXTcpBpD/U4+34vuo9nFsK0Pm6RqeXgy++otlVR6wfxihaL+yFOa8VaQQoBV11yZ1fu51TVi2DP4nLh/TQ==" /> 1990 <input type="hidden" id="customer_sign_up" name="customer_sign_up" value="" /> 1991 <input type="hidden" id="price_id" name="price_id" value="" /> 1992 <input type="hidden" id="code" name="code" value="" /> 1993 1994 <fieldset class="form__field"> 1995 <label for="CustomerEmail">Email</label> 1996 <input 1997 type="email" 1998 name="user[email]" 1999 id="CustomerEmail" 2000 placeholder="" 2001 class="mandatory_field" 2002 autocorrect="off" 2003 autocapitalize="off" 2004 autocomplete="off" 2005 autofocus> 2006 </fieldset> 2007 <fieldset class="form__field"> 2008 <label for="CustomerPassword">Password</label> 2009 <input 2010 type="password" 2011 value="" 2012 name="user[password]" 2013 id="CustomerPassword" 2014 autocomplete="off" 2015 placeholder="" 2016 class="mandatory_field"> 2017 </fieldset> 2018 <p class="text-end"> 2019 <a 2020 href="#" 2021 onclick="showRecoverPasswordForm();return false;">Forgot 2022 password?</a> 2023 </p> 2024 <fieldset class="form__field"> 2025 <button 2026 tabindex="0" 2027 class="button bold-btn checkMandatory" 2028 type="submit" 2029 aria-label="Log into your account" 2030 />Login</button> 2031 </fieldset> 2032 2033 </div> 2034 <div class="divider"> 2035 <span>Or Login with</span> 2036 </div> 2037 2038 <div class="social-login"> 2039 <button type="button" class="social-btn" id="apple-login" data-apple-client-id="com.crunchplus.signin" data-apple-redirect-uri="https://www.crunchplus.com/auth/apple/callback" data-state="apple_signin"> 2040 <img src="https://crunchplus.com/assets/retail-signup/optimized/apple-e9b039947999c2a40f13b2481a1ddc861c2208c4394fd5abc11d90c3f8410b45.svg" alt="Apple" class="apple">
2041 <span>Apple</span> 2042 </button> 2043 <button type="button" class="social-btn" id="google-login" data-google-url="/auth/google_oauth2?state=google_signin"> 2044 <img src="//dbjtwsnsmnuln.cloudfront.net/assets/retail-signup/optimized/google-50d9c4358b5626026eeb8d65dc872fc3fabb758aa3d73c974de9c0ef2670beea.webp" alt="Google" class="google"> 2045 <span>Google</span> 2046 </button> 2047 <button id="facebook-signin" type="button" class="social-btn" data-facebook-app-id="2425241290982063" data-facebook-redirect-uri="https://www.crunchplus.com/auth/facebook/callback" data-state="facebook_signin"> 2048 <img src="//dbjtwsnsmnuln.cloudfront.net/assets/retail-signup/optimized/meta-9d714faa7ce97b21fce91bf782a23865be5cf7a45ed7ea5c757338bc1515e80b.webp" alt="Meta" class="meta"> 2049 <span>Meta</span> 2050 </button> 2051 </div> 2052 2053 2054 </form> 2055 2056 </div> 2057 <div 2058 class="bucket" 2059 id="recover_password" 2060 style="display: none;"> 2061 2062 <p style="font-weight: bold; font-size:12px;"> 2063 <span class="fa fa-angle-left"></span> 2064 <a 2065 href="#" 2066 class="cancel-btn login-btn" 2067 style="text-decoration: none;" 2068 onclick="hideRecoverPasswordForm();return false;">Back</a> 2069 </p> 2070 2071 <h1>Password</h1> 2072 2073 2074 <form accept-charset="UTF-8" id="recover_customer_password" method="post" action="/password?c"> 2075 2076 <input name="utf8" type="hidden" value="✓" /> 2077 2078 <input name="authenticity_token" type="hidden" value="PUPnJpHYF3yZEHPHbzXEh3+c+oUgzi458N2DvqYaEVU=" /> 2079 2080 <input type="hidden" name="user[merchant_id]" value="2154" /> 2081 2082 2083 <div class="form__wrapper"> 2084 <div 2085 class="note flash-success" 2086 id="resetSuccess" 2087 style="display:none;"> 2088 We've sent you an email with a link to update your password. 2089 </div> 2090 2091 <fieldset class="form__field"> 2092 <label for="RecoverEmail">Email</label> 2093 <input 2094 type="email" 2095 value="" 2096 name="user[email]" 2097 id="RecoverEmail" 2098 placeholder="Email" 2099 autocorrect="off" 2100 autocapitalize="off"> 2101 </fieldset> 2102 2103 <fieldset class="form__field login-submit"> 2104 <input 2105 type="submit" 2106 class="button bold-btn" 2107 value="Submit"> 2108 </fieldset> 2109 2110 2111 2112 </form> 2113 2114 </div> 2115 </div> 2116 2117 <!-- OAuth Login Modal (hidden by default) --> 2118 <div id="oauth-login-modal"> 2119 <div style="position: relative;"> 2120 <!-- Close button in top right corner --> 2121 <button id="close-modal" style=" 2122 background: none; 2123 border: none; 2124 width: 32px; 2125 height: 32px; 2126 cursor: pointer; 2127 padding: 0; 2128 color: #666; 2129 display: flex; 2130 align-items: center; 2131 justify-content: center; 2132 border-radius: 50%; 2133 transition: all 0.2s ease; 2134 position: absolute; 2135 top: 10px; 2136 right: 10px; 2137 z-index: 10; 2138 " onmouseover="this.style.backgroundColor='#f0f0f0'; this.style.color='#333';" onmouseout="this.style.backgroundColor='transparent'; this.style.color='#666';"> 2139 <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"> 2140 <path d="M18.3 5.71a.996.996 0 0 0-1.41 0L12 10.59 7.11 5.7A.996.996 0 1 0 5.7 7.11L10.59 12 5.7 16.89a.996.996 0 1 0 1.41 1.41L12 13.41l4.89 4.89a.996.996 0 0 0 1.41-1.41L13.41 12l4.89-4.89c.38-.38.38-1.02 0-1.4z"/> 2141 </svg> 2142 </button> 2143 2144 <!-- Crunch Logo --> 2145 <div style="text-align: center; margin: 0 0 5px 0;"> 2146 <img 2147 src="//dbjtwsnsmnuln.cloudfront.net/assets/pink_essence/crunch-pink-logo-707dc5942165a82799bef57aa4a66d82d5159fce44af66426a1f47c3221168b0.png" 2148 alt="Crunch Fitness Logo" 2149 style="max-width: 200px; height: 55px;" 2150 /> 2151 </div> 2152 2153 <!-- Modal message --> 2154 <div style="margin-bottom: 5px;"> 2155 <p style="color: #000; margin: 0; font-weight: bold; line-height: 1.4; font-size: 14px;" id="modal-message">
2155Account already exists, login with your Crunch+ credentials to continue.</p> 2156 </div> 2157 <form id="oauth-login-form"> 2158 <div id="oauth-error-message" style=" 2159 color: #d32f2f; 2160 font-size: 14px; 2161 margin-bottom: 5px; 2162 display: none; 2163 "></div> 2164 <div style="margin-bottom: 20px;"> 2165 <label for="oauth-email" style="display: block; margin-bottom: 5px; font-weight: bold; color: #000; font-size: 14px;">Email</label> 2166 <input type="email" id="oauth-email" name="email" required style=" 2167 width: 100%; 2168 padding: 10px; 2169 border: 1px solid #ddd; 2170 border-radius: 4px; 2171 font-size: 16px; 2172 color: #000; 2173 box-sizing: border-box; 2174 "> 2175 </div> 2176 <div style="margin-bottom: 20px;"> 2177 <label for="oauth-password" style="display: block; margin-bottom: 5px; font-weight: bold; color: #000; font-size: 14px;">Password</label> 2178 <input type="password" id="oauth-password" name="password" required style=" 2179 width: 100%; 2180 padding: 10px; 2181 border: 1px solid #ddd; 2182 border-radius: 4px; 2183 font-size: 16px; 2184 color: #000; 2185 box-sizing: border-box; 2186 "> 2187 </div> 2188 <button type="submit" id="oauth-submit-btn" style=" 2189 width: 100%; 2190 padding: 14px; 2191 background-color: #4285f4; 2192 color: white; 2193 border: none; 2194 border-radius: 4px; 2195 font-size: 16px; 2196 cursor: pointer; 2197 margin-top: 10px; 2198 ">Sign In</button> 2199 </form> 2200 </div> 2201 </div> 2202 </div> 2203 </section> 2204 <div class="text-section"> 2205 <h2>Available On</h2> 2206 <div class="icons"> 2207 <span><img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-apple-icon-white-0d2329e53e22636dd4f9a761df1690a70ed6ef28ba30a94edda24fc48bd7b5a2.png" class="ia-icon-apple-ios" alt="Watch our videos in our app on your Apple device" /></span> 2208<span><img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-android-white-073b48287baeb182a3ffbdb02b3d2375ebf8b0ec4c716d9f504b41585421d5fd.png" class="ia-icon-android" alt="Watch our videos in our app on your Android device" /></span> 2209<span><img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-apple-tv-white-bda23d665b1e50b216bc5255c2b2877093361d4318a8c8e7f5a61629a5dfddd9.png" class="ia-icon-apple-tv" alt="Watch our videos in our app on your Apple TV device" /></span> 2210<span><img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-android-tv-white-8f6c78200d3293de0bbeaf12312453b83afa95178e52d0025aee483c9a3b1c60.png" class="ia-icon-android-tv" alt="Watch our videos in our app on your AndroidTV device" /></span> 2211<span><img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-fire-tv-white-b55e0fdd0791467821acdfe002cb971a9389ae0a6dee477147a0f3443905015b.png" class="ia-icon-fire-tv" alt="Watch our videos in our app on your FireTV device" /></span> 2212<span><img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-roku-white-7ddb99c67c38050433c79c466f797df0cb074d63be9e2ff839345d4d992bea00.png" class="ia-icon-roku" alt="Watch our videos in our app on your Roku device" /></span> 2213 2214 </div> 2215 </div> 2216 2217 <figure role="none" class="device-image device-image-tablet"> 2218 2219 <span 2220 class="device-image-screenshot" 2221 ></span> 2222 </figure> 2223 2224 </div> 2225 </div> 2226
2227<script> 2228 /* 2229 Show/hide the recover password form when requested. 2230 */ 2231 window.addEventListener("load", function () { 2232 $(document).ready(function () { 2233 // Clean up Facebook OAuth fragment if present 2234 if (window.location.hash === '#_=_') { 2235 if (window.history && window.history.replaceState) { 2236 window.history.replaceState({}, document.title, window.location.pathname + window.location.search); 2237 } else { 2238 // Fallback for older browsers 2239 window.location.hash = ''; 2240 } 2241 } 2242 2243 var urlId = getParameter("id"); 2244 var urlCode = getParameter("code"); 2245 2246 if (urlId || urlCode) { 2247 $('#customer_sign_up').val('true'); 2248 if (urlId) { 2249 $('#price_id').val(urlId); 2250 } 2251 if (urlCode) { 2252 $('#code').val(urlCode); 2253 } 2254 } 2255 2256 var email = getParameter("email"); 2257 var lid = getParameter("lid"); 2258 var loginSelect = document.getElementById('loginSelect'); 2259 if(lid != false && loginSelect) { 2260 for(var i, j = 0; i = loginSelect.options[j]; j++) { 2261 if(i.value == lid) { 2262 loginSelect.selectedIndex = j; 2263 break; 2264 } 2265 } 2266 } 2267 2268 if (email != false) { 2269 $("#CustomerEmail") 2270 .val(email); 2271 } 2272 2273 $(".checkMandatory").click(async function(e){ 2274 var email = $('#CustomerEmail').val(); 2275 var form = $(this).closest('form'); 2276 var mandatory_fields = $(form).find('.mandatory_field') 2277 var isValid = checkIfAllFieldsHaveValues(mandatory_fields); 2278 if (!isValid){ 2279 e.preventDefault(); 2280 $(mandatory_fields).each(function() { 2281 custom_validation(this); 2282 }); 2283 $(form).find(".has-error").find('input').focus(); 2284 $('#loader-image').hide(); 2285 } 2286 await fetch('/get_membership_plan', { 2287 method: 'POST', 2288 headers: { 2289 'Content-Type': 'application/json', 2290 }, 2291 body: JSON.stringify({ 2292 email: email, 2293 authenticity_token: $('#authenticity_token').val() 2294 }) 2295 }) 2296 .then(response => response.json()) 2297 .then(data => { 2298 var hashedUserId = CryptoJS.SHA256(email).toString(); 2299 if(data.is_user === true ) { 2300 var loginEventPayload = { 2301 'event': "login", 2302 'user_id': hashedUserId, 2303 'membership_plan': data.membership_plan, 2304 'crunch_fitness_member': !!data.membership_plan, 2305 "login_count": 1 2306 }; 2307 dataLayer.push(loginEventPayload); 2308 } 2309 }) 2310 .catch(error => {}); 2311 }); 2312 2313 $(".mandatory_field").keyup(function(e){ 2314 custom_validation(this); 2315 }); 2316 }); 2317 2318 function checkIfAllFieldsHaveValues(elements) { 2319 var isValid = true; 2320 $(elements).each(function() { 2321 if ( !$(this).prop('disabled') && !$(this).prop('readonly') && $(this).val() === '' ) 2322 isValid = false; 2323 }); 2324 return isValid; 2325 } 2326 2327 function custom_validation(element){ 2328 var form = $(element).closest('form'); 2329 var fieldset_element = $(element).parent().closest('fieldset'); 2330 if ($(element).val().length > 0){ 2331 $(fieldset_element).removeClass('has-error'); 2332 $(fieldset_element).find('small:eq(0)').remove(); 2333 $(element).css("border", "1px solid #8c8c8c"); 2334 } else { 2335 $(fieldset_element).addClass('has-error'); 2336 $(fieldset_element).css("position", "relative"); 2337 $(element).css("border", "1px solid red"); 2338 } 2339 if ($(form).find(".has-error").length > 0){ 2340 $(form).find("button[type='submit']").prop('disabled',true); 2341 } else { 2342 $(form).find("button[type='submit']").prop('disabled',false); 2343 } 2344 } 2345 }); 2346 2347 function getParameter(theParameter) { 2348 var params = window.location.search.substr(1) 2349 .split("&"); 2350 for (var i = 0; i < params.length; i++) { 2351 var p = params[i].split("="); 2352 if (p[0] == theParameter) { 2353 return decodeURIComponent(p[1]); 2354 } 2355 } 2356 return false;
2357 } 2358 2359 function showRecoverPasswordForm() { 2360 $("#recover_password") 2361 .show(); 2362 $("#customer_login_form") 2363 .hide(); 2364 } 2365 2366 function hideRecoverPasswordForm() { 2367 $("#recover_password") 2368 .hide(); 2369 $("#customer_login_form") 2370 .show(); 2371 } 2372 2373 // Allow deep linking to the recover password form 2374 if (window.location.hash == "#recover") { 2375 showRecoverPasswordForm(); 2376 } 2377 2378 // reset_success is only true when the reset form is 2379 2380 2381 async function storeOAuthParams() { 2382 const params = {}; 2383 const urlId = getParameter("id"); 2384 const urlCode = getParameter("code"); 2385 2386 if (urlId) { 2387 params.price_id = urlId; 2388 } else { 2389 const priceIdField = document.getElementById('price_id'); 2390 if (priceIdField && priceIdField.value) { 2391 params.price_id = priceIdField.value; 2392 } 2393 } 2394 2395 if (urlCode) { 2396 params.code = urlCode; 2397 } else { 2398 const codeField = document.getElementById('code'); 2399 if (codeField && codeField.value) { 2400 params.code = codeField.value; 2401 } 2402 } 2403 2404 if (Object.keys(params).length > 0) { 2405 try { 2406 const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content'); 2407 const response = await fetch('/orders/store_oauth_params', { 2408 method: 'POST', 2409 headers: { 2410 'Content-Type': 'application/json', 2411 'X-CSRF-Token': csrfToken || '', 2412 'Accept': 'application/json' 2413 }, 2414 body: JSON.stringify(params) 2415 }); 2416 2417 if (!response.ok) { 2418 return false; 2419 } 2420 2421 const result = await response.json(); 2422 return result && result.success === true; 2423 } catch (error) { 2424 return false; 2425 } 2426 } 2427 2428 return true; 2429 } 2430 2431 function handleGoogleSignIn() { 2432 const googleBtn = document.getElementById('google-login'); 2433 if (googleBtn) { 2434 googleBtn.addEventListener('click', async () => { 2435 await storeOAuthParams(); 2436 const url = googleBtn.getAttribute('data-google-url'); 2437 if (url) { 2438 window.location.href = url; 2439 } 2440 }); 2441 } 2442 } 2443 2444 // Function to set up modal event listeners (called once on page load) 2445 function setupModalEventListeners() { 2446 // Add event listeners for modal 2447 document.getElementById('close-modal').addEventListener('click', hideLoginModal); 2448 document.getElementById('oauth-login-form').addEventListener('submit', handleOAuthLogin); 2449 } 2450 2451 // Function to prevent scrolling when modal is open 2452 function preventScroll(e) { 2453 // Allow scrolling within the modal 2454 if (e.target.closest('#oauth-login-modal')) { 2455 return true; 2456 } 2457 2458 e.preventDefault(); 2459 e.stopPropagation(); 2460 return false; 2461 } 2462 2463 // Function to show login modal (simplified since modal is already in DOM) 2464 function showLoginModal(message) { 2465 // Store current scroll position 2466 const scrollY = window.scrollY; 2467 2468 // Update message and show modal 2469 document.getElementById('modal-message').textContent = message; 2470 document.getElementById('oauth-login-modal').style.display = 'flex'; 2471 2472 // Prevent background scrolling 2473 document.body.classList.add('modal-open'); 2474 document.body.style.top = `-${scrollY}px`; 2475 2476 // Store scroll position for restoration 2477 document.body.setAttribute('data-scroll-y', scrollY); 2478 2479 // Add scroll prevention event listeners 2480 document.addEventListener('wheel', preventScroll, { passive: false }); 2481 document.addEventListener('touchmove', preventScroll, { passive: false }); 2482 document.addEventListener('keydown', function(e) { 2483 // Prevent arrow keys, page up/down, space, home, end 2484 if ([32, 33, 34, 35, 36, 37, 38, 39, 40].includes(e.keyCode)) { 2485 preventScroll(e); 2486 } 2487 }); 2488 } 2489 2490 // Function to hide login modal 2491 function hideLoginModal() { 2492 const modal = document.getElementById('oauth-login-modal'); 2493 if (modal) { 2494 modal.style.display = 'none'; 2495 2496 // Restore background scrolling 2497 document.body.classList.remove('modal-open'); 2498 2499 // Restore scroll position 2500 const scrollY = document.body.getAttribute('data-scroll-y'); 2501 document.body.style.top = ''; 2502 if (scrollY) { 2503 window.scrollTo(0, parseInt(scrollY, 10)); 2504 } 2505 document.body.removeAttribute('data-scroll-y'); 2506 2507 // Remove scroll prevention event listeners 2508 document.removeEventListener('wheel', preventScroll); 2509 document.removeEventListener('touchmove', preventScroll); 2510 document.removeEventListener('keydown', preventScroll); 2511 2512 // Clean up URL parameters to remove show_login_modal 2513 const url = new URL(window.location); 2514 url.searchParams.delete('show_login_modal'); 2515 window.history.replaceState({}, document.title, url); 2516 } 2517 } 2518 2519 // Function to handle OAuth login form submission 2520 function handleOAuthLogin(e) { 2521 e.preventDefault(); 2522 2523 const email = document.getElementById('oauth-email').value; 2524 const password = document.getElementById('oauth-password').value; 2525 const submitBtn = document.getElementById('oauth-submit-btn'); 2526 const errorMessage = document.getElementById('oauth-error-message'); 2527 2528 // Clear previous errors 2529 errorMessage.style.display = 'none'; 2530 2531 // Disable submit button 2532 submitBtn.disabled = true; 2533 submitBtn.textContent = 'Signing in...'; 2534 2535 // Get CSRF token 2536 const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); 2537 2538 // Submit using fetch API 2539 const formData = new FormData(); 2540 formData.append('email', email); 2541 formData.append('password', password); 2542 2543 fetch('/auth/google_oauth2/associate_account_with_sso', { 2544 method: 'POST', 2545 headers: { 2546 'X-CSRF-Token': csrfToken 2547 }, 2548 body: formData 2549 }) 2550 .then(response => response.json()) 2551 .then(data => { 2552 if (data.success) { 2553 // Hide modal and redirect 2554 window.location.href = data.redirect_url; 2555 } else if (data.isRedirectUser && data.redirect_url) { 2556 // User account doesn't exist, show message and redirect after 3 seconds 2557 errorMessage.textContent = data.message || 'Account not found. Redirecting to signup page...'; 2558 errorMessage.style.display = 'block'; 2559 errorMessage.style.color = '#d32f2f'; 2560 submitBtn.disabled = true; 2561 submitBtn.textContent = 'Redirecting...'; 2562 2563 setTimeout(() => { 2564 window.location.href = data.redirect_url; 2565 }, 3000); 2566 } else { 2567 // Show error message 2568 errorMessage.textContent = data.message || data.error || 'Invalid email or password'; 2569 errorMessage.style.display = 'block'; 2570 errorMessage.style.color = '#d32f2f'; // Red color for error message 2571 submitBtn.disabled = false;
2572 submitBtn.textContent = 'Sign In'; 2573 } 2574 }) 2575 .catch(error => { 2576 errorMessage.textContent = 'An error occurred. Please try again.'; 2577 errorMessage.style.display = 'block'; 2578 submitBtn.disabled = false; 2579 submitBtn.textContent = 'Sign In'; 2580 }); 2581 } 2582 2583 function handleAppleSignIn() { 2584 const appleBtn = document.getElementById('apple-login'); 2585 if (appleBtn) { 2586 appleBtn.addEventListener('click', async () => { 2587 await storeOAuthParams(); 2588 2589 const clientId = appleBtn.getAttribute('data-apple-client-id'); 2590 const redirectUri = appleBtn.getAttribute('data-apple-redirect-uri'); 2591 const baseState = appleBtn.getAttribute('data-state'); 2592 const oauthParams = {}; 2593 const urlId = getParameter("id"); 2594 const urlCode = getParameter("code"); 2595 2596 if (urlId) { 2597 oauthParams.price_id = urlId; 2598 } else { 2599 const priceIdField = document.getElementById('price_id'); 2600 if (priceIdField && priceIdField.value) { 2601 oauthParams.price_id = priceIdField.value; 2602 } 2603 } 2604 2605 if (urlCode) { 2606 oauthParams.code = urlCode; 2607 } else { 2608 const codeField = document.getElementById('code'); 2609 if (codeField && codeField.value) { 2610 oauthParams.code = codeField.value; 2611 } 2612 } 2613 2614 let state = baseState; 2615 if (Object.keys(oauthParams).length > 0) { 2616 const encodedParams = btoa(JSON.stringify(oauthParams)); 2617 state = baseState + '|' + encodedParams; 2618 } 2619 2620 if (clientId && redirectUri) { 2621 const appleAuthUrl = 'https://appleid.apple.com/auth/authorize' + 2622 '?client_id=' + encodeURIComponent(clientId) + 2623 '&redirect_uri=' + encodeURIComponent(redirectUri) + 2624 '&response_type=code' + 2625 '&scope=' + encodeURIComponent('name email') + 2626 '&response_mode=form_post' + 2627 '&state=' + encodeURIComponent(state) + 2628 '&nonce=' + encodeURIComponent(Math.random().toString(36).substring(2, 15)); 2629 2630 window.location.href = appleAuthUrl; 2631 } 2632 }); 2633 } 2634 } 2635 2636 function handleFacebookSignIn() { 2637 const facebookBtn = document.getElementById('facebook-signin'); 2638 if (facebookBtn) { 2639 facebookBtn.addEventListener('click', async () => { 2640 await storeOAuthParams(); 2641 const appId = facebookBtn.getAttribute('data-facebook-app-id'); 2642 const redirectUri = facebookBtn.getAttribute('data-facebook-redirect-uri'); 2643 const state = facebookBtn.getAttribute('data-state'); 2644 2645 if (appId && redirectUri) { 2646 const facebookAuthUrl = 'https://www.facebook.com/v21.0/dialog/oauth' + 2647 '?client_id=' + encodeURIComponent(appId) + 2648 '&redirect_uri=' + encodeURIComponent(redirectUri) + 2649 '&response_type=code' + 2650 '&scope=' + encodeURIComponent('email,public_profile') + 2651 '&state=' + state; 2652 2653 window.location.href = facebookAuthUrl; 2654 } 2655 }); 2656 } 2657 } 2658 2659 document.addEventListener('DOMContentLoaded', function() { 2660 handleGoogleSignIn(); 2661 handleAppleSignIn(); 2662 handleFacebookSignIn(); 2663 setupModalEventListeners(); 2664 2665 const urlParams = new URLSearchParams(window.location.search); 2666 if (urlParams.get('show_login_modal') === 'true') {
2667 const message = 'Account already exists, login with your Crunch+ credentials to continue.'; 2668 showLoginModal(message); 2669 } 2670 }); 2671 2672 // Function to display social auth error 2673 function handleSocialAuthError(errorMessage) { 2674 const socialErrorDiv = document.getElementById('social-auth-error'); 2675 if (socialErrorDiv) { 2676 socialErrorDiv.innerHTML = `<div class="err_msg"><p class='msg_text'>${errorMessage}</p></div>`; 2677 } 2678 } 2679 2680 // Check for OAuth callback status 2681 const urlParams = new URLSearchParams(window.location.search); 2682 if (urlParams.get('oauth_success') === 'false') { 2683 const errorMessage = urlParams.get('oauth_error') || 'Social authentication failed. Please try again.'; 2684 handleSocialAuthError(errorMessage); 2685 } 2686</script>
2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703<footer role="contentinfo" aria-label="Footer"> 2704 <div class="inner"> 2705 <section class="single third show-wrapper"> 2706 <h5 style="font-size: 1.2em; text-decoration: none; font-weight: 600;" class="mobile-ui toggle">About</h5> 2707 <div class="mobile-wrapper"> 2708 <nav role="navigation" class="site-nav-footer" 2709 aria-label="Bottom Contact"> 2710 <ul> 2711 2712 <li class="active" 2713 id="nav_fn_login"> 2714 <a href="/accounts/login" aria-label="Log into your account">Log In</a> 2715 </li> 2716 2717 2718 <li id="nav_fn_login"> 2719 <a href="/crunch_subscriptions" aria-label="Free trial">Free Trial</a> 2720 </li> 2721 2722 <li id="nav_fn_logout"> 2723 <a href="/crunch_subscriptions" aria-label="Explore subscriptions">Subscriptions</a> 2724 </li> 2725 2726 <li> 2727 <a href="/page/international-india" target="_blank" rel="noopener noreferrer" aria-label="Learn about Crunch India">Crunch India Coming Soon</a> 2728 </li> 2729 </ul> 2730 </div> 2731 </section> 2732 2733 <section class="single third show-wrapper"> 2734 <h5 style="font-size: 1.2em; text-decoration: none; font-weight: 600;" class="mobile-ui toggle">Support</h5> 2735 <div class="mobile-wrapper"> 2736 <nav role="navigation" class="site-nav-footer" 2737 aria-label="Bottom Account"> 2738 <ul> 2739 <li> 2740 <a href="mailto:[email protected]" 2741 alt="Support" 2742 aria-label="Contact for support/help">Contact Us 2743 </a> 2744 </li> 2745 2746 2747 2748 <li> 2749 <a href="/page/faq/" 2750 target="_blank" 2751 aria-label="Frequently asked questions" 2752 rel="noopener noreferrer">FAQ 2753 </a> 2754 </li> 2755 <li> 2756 <a href="/page/terms-of-service/" 2757 target="_blank" 2758 aria-label="Check terms and conditions" 2759 rel="noopener noreferrer">Terms & Conditions 2760 </a> 2761 </li> 2762 <li> 2763 <a href="/page/privacy/" 2764 target="_blank" 2765 aria-label="Check privacy policy" 2766 rel="noopener noreferrer">Privacy Policy 2767 </a> 2768 </li> 2769 <li> 2770 <a href="/instantaccess" 2771 rel="noopener noreferrer" 2772 aria-label="Get the crunch+ app" 2773 id="nav_fn_ia">Get the Crunch+ App 2774 </a> 2775 </li> 2776 <p class="social-icons"> 2777 2778 2779 2780 2781 <a class="fa fa-twitter" 2782 rel="external" 2783 href="https://twitter.com/crunchgym" 2784 aria-label="Twitter"></a> 2785 2786 2787 2788 2789 2790 2791 <a class="fa fa-facebook" 2792 rel="external" 2793 href="https://www.facebook.com/CRUNCH/" 2794 aria-label="Facebook"></a> 2795 2796 2797 2798 2799 2800 2801 <a class="fa fa-instagram" 2802 rel="external" 2803 href="https://www.instagram.com/crunchgym/" 2804 aria-label="Instagram"></a> 2805 2806 2807 </p> 2808 <div class="html-output"> 2809 2810 2811 <p>Account Inquiries: <a href="mailto: [email protected]">[email protected]</a></p> 2812 2813 </div> 2814 <p class="custom-footer-font">© 2026 Crunch+. All Rights Reserved. </p> 2815 </ul> 2816 <div class="logo-container"> 2817 <div class="logo-container--left"> 2818 <div> 2819 2820 <a href="https://apps.apple.com/us/app/crunch/id6443678389" target="_blank" rel="noopener noreferrer" aria-label="Apple TV"> 2821 <img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/download-on-the-app-store-apple-logo-svgrepo-com-09935af539d3592a5c0de0c2ab3cdb94e9f7269d53b1997fec9470cb8b4f093a.png" class="app-log" alt="Stream Club Pilates on Demand with your Ap
2821ple TV" /> 2822 </a> 2823 </div> 2824 <div> 2825 2826 <a href="https://play.google.com/store/apps/details?id=com.crunchplus" target="_blank" rel="noopener noreferrer" aria-label="Google app store"> 2827 <img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/google-play-badge-logo-svgrepo-com-57d6e9263348d6ba13864facf643c1c05785ad75d4dfdd86ea5e0c1df1e1feac.png" class="app-log" alt="Stream Club Pilates on Demand with google app store" /> 2828 </a> 2829 </div> 2830 </div> 2831 <div class="logo-container--right"> 2832 <div> 2833 2834 <a href="https://play.google.com/store/apps/details?id=com.crunchplus" target="_blank" rel="noopener noreferrer" aria-label="Android TV"> 2835 <img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-android-tv-white-8f6c78200d3293de0bbeaf12312453b83afa95178e52d0025aee483c9a3b1c60.png" class="app-log" alt="Stream Club Pilates on Demand with android tv" /> 2836 </a> 2837 </div> 2838 <div> 2839 2840 <a href="https://apps.apple.com/us/app/crunch/id6443678389" target="_blank" rel="noopener noreferrer" aria-label="Apple TV"> 2841 <img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-apple-tv-white-bda23d665b1e50b216bc5255c2b2877093361d4318a8c8e7f5a61629a5dfddd9.png" class="app-log" alt="Stream Club Pilates on Demand with apple tv" /> 2842 </a> 2843 </div> 2844 <div> 2845 2846 2847 2848 <a style="color: black !important;" href="https://www.amazon.com/Crunch-LLC/dp/B0BLHNPFBC" target="_blank" rel="noopener noreferrer" aria-label="Opens in a new tab"> 2849 <img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-fire-tv-white-b55e0fdd0791467821acdfe002cb971a9389ae0a6dee477147a0f3443905015b.png" class="app-log" alt="Stream Club Pilates on Demand with apple tv" /> 2850 </a> 2851 <a href="https://channelstore.roku.com/details/b2cc77408e2efebb9f3024285d7b4b56/crunch+" target="_blank" rel="noopener noreferrer" aria-label="Stream Club Pilates on Demand with apple tv"> 2852 <img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-roku-white-7ddb99c67c38050433c79c466f797df0cb074d63be9e2ff839345d4d992bea00.png" class="app-log roku-icon" alt="Watch our videos in our app on your Roku device" /> 2853 </a> 2854 </div> 2855 </div> 2856 </div> 2857 </nav> 2858 </div> 2859 </section> 2860 2861 2862 2863 2864 </div> 2865</footer> 2866 2867 2868 2869
2869<script type="text/javascript" src="https://js.stripe.com/v3/"></script>
vendor: 1 bytes, line 2869
2869
2870<script 2871 type="text/javascript" 2872 2873 src="https://js.authorize.net/v1/Accept.js" 2874 2875 charset="utf-8"></script>
2875 2876 2877<div id="fb-root"></div>
2878<script>(function(d, s, id) { 2879 var js, fjs = d.getElementsByTagName(s)[0]; 2880 if (d.getElementById(id)) return; 2881 js = d.createElement(s); js.id = id; 2882 js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.8&appId=130026020819382"; 2883 fjs.parentNode.insertBefore(js, fjs); 2884}(document, 'script', 'facebook-jssdk'));</script>
2884 2885
2886<script>window.twttr = (function(d, s, id) { 2887 var js, fjs = d.getElementsByTagName(s)[0], 2888 t = window.twttr || {}; 2889 if (d.getElementById(id)) return t; 2890 js = d.createElement(s); 2891 js.id = id; 2892 js.src = "https://platform.twitter.com/widgets.js"; 2893 fjs.parentNode.insertBefore(js, fjs); 2894 2895 t._e = []; 2896 t.ready = function(f) { 2897 t._e.push(f); 2898 }; 2899 2900 return t; 2901}(document, "script", "twitter-wjs"));</script>
2901 2902 2903
2904<script> 2905 2906 2907 window.addEventListener("load", function () { 2908 $.query.SET("livestream", "false"); 2909 2910 $(".close-notify").on("click", function () { 2911 $(".successful-update").hide(500); 2912 }); 2913 2914 $(".toggle-the-content").click(function () { 2915 $(this).closest(".collapsable-content").toggleClass("hide"); 2916 }); 2917 2918 // sharing 2919 $(".fbshare").on("click", function () { 2920 var url = $(this).attr("data-url"); 2921 console.log(url); 2922 var fbpopup = window.open("https://www.facebook.com/sharer/sharer.php?u=" + url, "pop", "width=500, height=350, scrollbars=no"); 2923 return false; 2924 }); 2925 2926 // mobile navigation 2927 $("aside .mobile-ui.toggle .label, aside .mobile-ui .close-toggle") 2928 .click(function () { 2929 $("aside").toggleClass("apply-mobile-ui"); 2930 }); 2931 2932 $(".toggle-nav .mobile-ui.toggle .label, .toggle-nav .mobile-ui .close") 2933 .click(function () { 2934 $(".toggle-nav").toggleClass("apply-mobile-ui"); 2935 return false; 2936 }); 2937 2938 $(".toggle-item .toggle").click(function () { 2939 $(this).parent(".toggle-item").toggleClass("show"); 2940 }); 2941 2942 $("span.favorite_media").click(function () { 2943 var id = $("span.favorite_media").attr("id"); 2944 var favorited = $("span.favorite_media").hasClass("active"); 2945 2946 if (favorited == false) { 2947 $(this).toggleClass("active"); 2948 fetch(`/api/widget/v1/user/add_favorite/media/${id}`, { 2949 method: 'POST', 2950 }) 2951 .then(response => response.json()) 2952 .then(response => { 2953 var params = new URLSearchParams(window.location.search); 2954 var payloadAddToFavorites = { 2955 'event': "", 2956 'video_title': "", 2957 'video_duration': "", 2958 'video_category': params.get("category").replace(/^"|"$/g, ''), 2959 'video_rating': '' 2960 }; 2961 dataLayer.push(payloadAddToFavorites); 2962 }) 2963 .catch(error => console.error('Error:', error)); 2964 } else if (favorited == true) { 2965 $(this).toggleClass("active"); 2966 fetch(`/api/widget/v1/user/remove_favorite/media/${id}`, { 2967 method: 'DELETE', 2968 headers: { 2969 'Content-Type': 'application/json' 2970 } 2971 }) 2972 .catch(error => console.error('Error:', error)); 2973 } 2974 }); 2975 2976 $(".show-cancellation-modal .modal-wrapper .overlay, .modal .close") 2977 .click(function () { 2978 $("body").removeClass("show-cancellation-modal"); 2979 }); 2980 2981 $(".cancel-link-modal").click(function () { 2982 $("body").addClass("show-cancellation-modal"); 2983 }); 2984 2985 // purchases table 2986 $(".table-purchases .fa.toggle-the-content").click(function () { 2987 $(this).parent(".collapsable-content").toggleClass("show"); 2988 return false; 2989 }); 2990 2991 // show purchased or all content dropdown 2992 $(function () { 2993 // bind change event to select 2994 $("#filter_content").on("change", function () { 2995 var url = $(this).val(); // get selected value 2996 if (url) { // require a URL 2997 window.location = url; // redirect 2998 } 2999 return false; 3000 }); 3001 }); 3002 3003 $(document).ready(function () { 3004 var status_hash = {}; 3005 var handleArrows = function (arrows, index, visible, length) { 3006 if ((index + visible) >= length) { 3007 arrows.filter(".right").addClass("disabled"); 3008 } else { 3009 arrows.filter(".right").removeClass("disabled"); 3010 } 3011 3012 if (index == 0) { 3013 arrows.filter(".left").addClass("disabled"); 3014 } else { 3015 arrows.filter(".left").removeClass("disabled"); 3016 } 3017 }; 3018 var categories = $(".browse, .category-products"); 3019 $.each(categories, function (i) { 3020 status_hash[i] = {}; 3021 status_hash[i]["items"] = $(this).find("ul.grid li"); 3022 if (status_hash[i]["items"].length > 0) { 3023 status_hash[i]["width"] = status_hash[i]["items"][0].scrollWidth + 5; 3024 status_hash[i]["item"] = status_hash[i]["items"][0]; 3025 status_hash[i]["length"] = status_hash[i]["items"].length; 3026 status_hash[i]["visible"] = 5; 3027 status_hash[i]["index"] = 0; 3028 status_hash[i]["endIndex"] = (status_hash[i]["length"] - status_hash[i]["visible"]); 3029 var arrows = $(this).find(".arrow"); 3030 arrows.filter(".right").click(function () { 3031 if (status_hash[i]["index"] < status_hash[i]["endIndex"]) { 3032 status_hash[i]["index"]++;
3033 status_hash[i]["items"].animate({ "left": "-=" + status_hash[i]["width"] + "px" }, 500); 3034 handleArrows(arrows, status_hash[i]["index"], status_hash[i]["visible"], status_hash[i]["length"]); 3035 } 3036 }); 3037 arrows.filter(".left").click(function () { 3038 if (status_hash[i]["index"] > 0) { 3039 status_hash[i]["index"]--; 3040 status_hash[i]["items"].animate({ "left": "+=" + status_hash[i]["width"] + "px" }, 500); 3041 handleArrows(arrows, status_hash[i]["index"], status_hash[i]["visible"], status_hash[i]["length"]); 3042 } 3043 }); 3044 } 3045 }); 3046 3047 // sitewide search 3048 $(".global-search").submit(function (e) { 3049 var delivery_only = '' === "delivery_only"; 3050 var search_path = location.origin; 3051 if (delivery_only) { 3052 search_path += "/accounts/search_items/"; 3053 } else { 3054 search_path += "/search_items/"; 3055 } 3056 e.preventDefault(); 3057 var termQuery = $.query.REMOVE("term"); 3058 var pageTypeQuery = $.query.GET("page_type"); 3059 var term = ""; 3060 var $inputs = $(":input", this); 3061 $inputs.each(function () { 3062 if (this.name === "term") { 3063 term = $(this).val(); 3064 } 3065 }); 3066 if (term) { 3067 termQuery = $.query.SET("term", term); 3068 } 3069 3070 3071 3072 3073 location.href = search_path + termQuery; 3074 }); 3075 3076 $(".dropdown-button").click(function () { 3077 var $button, $menu; 3078 $button = $(this); 3079 $menu = $button.siblings(".dropdown-menu"); 3080 $menu.toggleClass("show-menu"); 3081 $menu.children("li").click(function () { 3082 $menu.removeClass("show-menu"); 3083 $button.html($(this).html()); 3084 }); 3085 }); 3086 }); 3087 3088 // search 3089 3090 $("#custom-search-form").submit(function (e) { 3091 e.preventDefault(); 3092 var termQuery = $.query.REMOVE("term"); 3093 var pageType = $.query.GET("page_type"); 3094 3095 if (!pageType) { 3096 pageType = ''; 3097 } 3098 console.log(pageType); 3099 var term = ""; 3100 var $inputs = $("#custom-search-form :input"); 3101 $inputs.each(function () { 3102 if (this.name === "term") { 3103 term = $(this).val(); 3104 } 3105 }); 3106 if (term) { 3107 termQuery = $.query.SET("term", term); 3108 } 3109 location.search = termQuery; 3110 }); 3111 3112 // search results type products or media 3113 $(".toggle-page-type").click(function () { 3114 var pageType = $.query.GET("page_type"); 3115 var searchString = $.query.REMOVE("page"); 3116 if (pageType == "") { 3117 3118 searchString = $.query.SET("page_type", "products"); 3119 3120 location.search = searchString; 3121 } else if (pageType == "media") { 3122 searchString = $.query.SET("page_type", "products"); 3123 location.search = searchString; 3124 } else { 3125 searchString = $.query.SET("page_type", "media"); 3126 location.search = searchString; 3127 } 3128 }); 3129 3130 // taxonomies or categories 3131 $(document).ready(function () { 3132 //For Filter Pages 3133 var filterIds = getParameterByName("filters"); 3134 var filterIdArray = filterIds.split(","); 3135 if (filterIdArray[0] === "") { 3136 filterIdArray = []; 3137 } 3138 3139 for (var i = 0; i < filterIdArray.length; i++) { 3140 var currentTaxObj = $(".tax-filter-link[data-taxid='" + filterIdArray[i] + "']"); 3141 currentTaxObj.addClass("selected"); 3142 } 3143 3144 $(".tax-filter-link").click(function () { 3145 if ($(this).hasClass("selected")) { 3146 for (var i = 0; i < filterIdArray.length; i++) { 3147 if (filterIdArray[i] == $(this).data("taxid")) { 3148 filterIdArray.splice(i, 1); 3149 } 3150 } 3151 } else { 3152 filterIdArray.push($(this).data("taxid")); 3153 } 3154 3155 // if( filterIdArray.length > 0 ){ 3156 href = window.location.href.split("?")[0]; 3157 3158 window.location.href = href + "?filters=" + filterIdArray.join(","); 3159 return false; 3160 // } 3161 }); 3162 3163 // responsive video iframe embeds 3164 $(function () { 3165 $("iframe.video").each(function () { 3166 var height = $(this).width() * .5625; 3167 $(this).css("height", height + "px"); 3168 }); 3169 $(window).resize(function () { 3170 $("iframe.video").each(function () { 3171 var height = $(this).width() * .5625; 3172 $(this).css("height", height + "px"); 3173 }); 3174 }); 3175 }); 3176 3177 }); 3178 3179 // To grab url variables and separate them with commas 3180 // http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript 3181 function getParameterByName(name) { 3182 name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
3183 var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), 3184 results = regex.exec(location.search); 3185 return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); 3186 } 3187 3188 // clean tabbed content 3189 $(document).ready(function() { 3190 $(".accordion-body").hide(); 3191 3192 $(".accordion-heading").bind("click", function(e) { 3193 $(this).parent().find(".accordion-body").slideToggle("fast"); 3194 $(this).parent().toggleClass("is-expanded"); 3195 e.preventDefault(); 3196 }); 3197 3198 if($(".accordion-body li .selected")) { 3199 const parentItem = $(".accordion-body li .selected").parent().parent(); 3200 parentItem.show(); 3201 } else { 3202 $(".accordion-body").hide(); 3203 } 3204 }); 3205 3206 // preview modal 3207 $(function () { 3208 $("#modal-teaser").on("change", function () { 3209 if ($(this).is(":checked")) { 3210 $("body").addClass("modal-open teaser"); 3211 } else { 3212 $("body").removeClass("modal-open teaser"); 3213 } 3214 }); 3215 3216 $("#modal-preview").on("change", function () { 3217 if ($(this).is(":checked")) { 3218 $("body").addClass("modal-open preview"); 3219 } else { 3220 $("body").removeClass("modal-open preview"); 3221 } 3222 }); 3223 3224 $(".modal .overlay, .modal .inner, .modal .close") 3225 .on("click", function () { 3226 $(".modal .state:checked").prop("checked", false).change(); 3227 $("iframe.video").each(function () { 3228 var el_src = $(this).attr("src"); 3229 $(this).attr("src", el_src); 3230 }); 3231 }); 3232 3233 $(".modal .inner").on("click", function (e) { 3234 e.stopPropagation(); 3235 }); 3236 }); 3237 3238 // video modal 3239 $(document).ready(function () { 3240 function toggle_video_modal() { 3241 $(".js-trigger-video-modal").on("click", function (e) { 3242 e.preventDefault(); 3243 var src = $(this).attr("href"); 3244 $("#video_player").attr("src", src); 3245 $("body").addClass("show-video-modal noscroll"); 3246 }); 3247 3248 function close_video_modal() { 3249 event.preventDefault(); 3250 $("body").removeClass("show-video-modal noscroll"); 3251 $("#video_player").attr("src", ""); 3252 } 3253 3254 $("body") 3255 .on("click", ".close-video-modal, .video-modal .overlay", function (event) { 3256 close_video_modal(); 3257 }); 3258 3259 $("body").keyup(function (e) { 3260 if (e.keyCode == 27) { 3261 close_video_modal(); 3262 } 3263 }); 3264 } 3265 3266 toggle_video_modal(); 3267 }); 3268 }); 3269</script>
3269 3270 3271
3272<script type="text/javascript"> 3273 (function() { 3274 var STORAGE_KEY = 'crunchplus_scroll_restore'; 3275 function getScrollY() { 3276 return window.scrollY !== undefined 3277 ? window.scrollY 3278 : (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop || 0; 3279 } 3280 function saveScroll() { 3281 try { 3282 var y = getScrollY(); 3283 if (y <= 0) return; 3284 sessionStorage.setItem(STORAGE_KEY, JSON.stringify({ 3285 pathname: window.location.pathname, 3286 scrollY: y 3287 })); 3288 } catch (e) {} 3289 } 3290 function restoreScroll() { 3291 try { 3292 var raw = sessionStorage.getItem(STORAGE_KEY); 3293 if (!raw) return; 3294 var data = JSON.parse(raw); 3295 if (!data || data.pathname !== window.location.pathname) return; 3296 var y = parseInt(data.scrollY, 10); 3297 if (!y) return; 3298 sessionStorage.removeItem(STORAGE_KEY); 3299 function doScroll() { 3300 window.scrollTo(0, y); 3301 if (document.documentElement) document.documentElement.scrollTop = y; 3302 if (document.body) document.body.scrollTop = y; 3303 } 3304 doScroll(); 3305 requestAnimationFrame(function() { 3306 doScroll(); 3307 setTimeout(doScroll, 0); 3308 }); 3309 } catch (e) {} 3310 } 3311 window.addEventListener('pagehide', saveScroll, { passive: true }); 3312 window.addEventListener('pageshow', function(e) { 3313 if (e.persisted) { 3314 restoreScroll(); 3315 } 3316 }, { passive: true }); 3317 window.addEventListener('load', function() { 3318 setTimeout(function() { 3319 requestAnimationFrame(restoreScroll); 3320 }, 100); 3321 }, { passive: true }); 3322 })(); 3323</script>
3323 3324
3325<script type="text/javascript"> 3326 window.addEventListener("load", function () { 3327 jQuery(document) 3328 .ready(function () { 3329 jQuery(".scrollbar-outer") 3330 .scrollbar(); 3331 }); 3332 3333 3334 var acc = document.getElementsByClassName("question"); 3335 var i; 3336 3337 for (i = 0; i < acc.length; i++) { 3338 acc[i].addEventListener("click", function() { 3339 this.classList.toggle("active"); 3340 var panel = this.nextElementSibling; 3341 var plusIcon = jQuery(this).find('.acc-icon'); 3342 if (panel.style.display === "block") { 3343 panel.style.display = "none"; 3344 plusIcon.removeClass('minus-icon'); 3345 plusIcon.addClass('plus-icon'); 3346 } else { 3347 panel.style.display = "block"; 3348 plusIcon.addClass('minus-icon'); 3349 plusIcon.removeClass('plus-icon'); 3350 } 3351 }); 3352 } 3353 3354 // Lead Gen Modal 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 // slideshow 3380 jQuery(document) 3381 .ready(function ($) { 3382 $(".slider") 3383 .unslider({ 3384 autoplay: true, 3385 speed: 1000, 3386 delay: 6000, 3387 animation: 'fade', 3388 arrows: { 3389 prev: "", 3390 next: "" 3391 } 3392 }); 3393 3394 // Mobile Menu 3395 $(".menu-drawer a, .site-nav-drawer .close") 3396 .click(function () { 3397 $(".site-nav-drawer") 3398 .toggleClass("hidden") 3399 .animate("slow"); 3400 $("body") 3401 .toggleClass("locked") 3402 .animate("slow"); 3403 }); 3404 3405 $(".sub-nav-toggle") 3406 .click(function () { 3407 $("ul.sub-nav") 3408 .toggleClass("hidden") 3409 .animate("slow"); 3410 }); 3411 3412 $(".bucket.testimonial:gt(3)") 3413 .parent() 3414 .addClass("fs"); 3415 }); 3416 3417 $(".search-toggle, .inner.search .fa-close") 3418 .click(function () { 3419 $(".inner.search") 3420 .toggleClass("show-search"); 3421 }); 3422 3423 // Select all links with hashes 3424 $("a[href*=\"#\"]") 3425 // Remove links that don't actually link to anything 3426 .not("[href=\"#\"]") 3427 .not("[href=\"#0\"]") 3428 .click(function (event) { 3429 // On-page links 3430 if ( 3431 location.pathname.replace(/^\//, "") == this.pathname.replace(/^\//, "") 3432 && 3433 location.hostname == this.hostname 3434 ) { 3435 // Figure out element to scroll to 3436 var target = $(this.hash); 3437 target = target.length ? target : $("[name=" + this.hash.slice(1) + "]"); 3438 // Does a scroll target exist? 3439 if (target.length) { 3440 // Only prevent default if animation is actually gonna happen 3441 event.preventDefault(); 3442 $("html, body") 3443 .animate({ 3444 scrollTop: target.offset().top 3445 }, 1000, function () { 3446 // Callback after animation 3447 // Must change focus! 3448 var $target = $(target); 3449 $target.focus(); 3450 if ($target.is(":focus")) { // Checking if the target was focused 3451 return false; 3452 } else { 3453 $target.attr("tabindex", "-1"); // Adding tabindex for elements not focusable 3454 $target.focus(); // Set focus again 3455 } 3456 3457 }); 3458 } 3459 } 3460 }); 3461 3462 $(function () { 3463 var viewportWidth = $(window) 3464 .width(); 3465 3466 if (viewportWidth > 1024) { 3467 $(".bg-video video") 3468 .each(function () { 3469 var height = $(".bg-video video") 3470 .width() * .5625; 3471 $(".bg-video") 3472 .css("height", height + "px"); 3473 }); 3474 $(window) 3475 .resize(function () { 3476 $(".bg-video video") 3477 .each(function () { 3478 var height = $(".bg-video video") 3479 .width() * .5625; 3480 $(".bg-video") 3481 .css("height", height + "px"); 3482 }); 3483 }); 3484 } 3485 }); 3486 3487 $("header nav .toggle.open, header nav .fa-close") 3488 .click(function () { 3489 $("#nav_dt_search,#nav_dt_search_left") 3490 .toggleClass("show-search"); 3491 $(".inner.search") 3492 .toggleClass("show-search"); 3493 }); 3494 }); 3495</script>
3495 3496 3497
3498<script src="//dbjtwsnsmnuln.cloudfront.net/assets/pink_essence/all-1975a51196b825a9805fcaef9408d8290dc366452d9e83a60a52df826d7082ce.js"></script>
3498 3499 3500 3501
3502<script src="//dbjtwsnsmnuln.cloudfront.net/assets/app-subscriber-8745873d46492a11423b82cc182aeb6ea5b82d8cca48f7141771630214dca1e7.js?hash=1790863416"></script>
3502 3503 3504 3505 3506 <div class="vue-app" 3507 style="position: relative"> 3508 <global_toasts></global_toasts> 3509 <div id="global_modal--target"></div> 3510 </div> 3511 3512 <!-- Include the Sticky Footer Partial --> 3513 <style> 3514 .sticky-footer { 3515 position: fixed !important; 3516 bottom: 0; 3517 left: 0; 3518 width: 100%; 3519 background: linear-gradient(90deg, #E33B89, #5B32AC); 3520 padding: 20px; 3521 box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.1); 3522 z-index: 1000; 3523 display: flex; 3524 justify-content: center; 3525 align-items: center; 3526 position: relative; 3527 } 3528 3529 .sticky-footer p { 3530 margin: 0; 3531 color: white; 3532 font-size: 16px; 3533 text-align: center; 3534 } 3535 3536 .sticky-footer a { 3537 color: white; 3538 text-decoration: underline; 3539 } 3540 3541 .close-footer { 3542 position: absolute; 3543 top: 50%; 3544 right: 20px; 3545 transform: translateY(-50%); 3546 background: none; 3547 border: none; 3548 color: white; 3549 font-size: 24px; 3550 cursor: pointer; 3551 padding: 0; 3552 } 3553 3554 @media (max-width: 768px) { 3555 .close-footer { 3556 top: 12px; 3557 right: 10px; 3558 font-size: 20px; 3559 } 3560 3561 .sticky-footer { 3562 padding: 15px; 3563 font-size: 14px; 3564 } 3565 3566 .footer-collapsed p { 3567 font-size: 14px; 3568 } 3569 } 3570 3571 .learn-more-link { 3572 color: white; 3573 text-decoration: underline; 3574 font-weight: normal; 3575 background: none; 3576 border: none; 3577 padding: 0; 3578 font-size: 14px; 3579 cursor: pointer; 3580 } 3581 3582 @media (min-width: 769px) { 3583 .footer-collapsed { 3584 display: none !important; 3585 } 3586 .footer-expanded { 3587 display: block !important; 3588 } 3589 } 3590</style> 3591 3592<div class="sticky-footer" id="sticky-footer"> 3593 <div class="footer-collapsed" id="footer-collapsed"> 3594 <p> 3595 Weâve updated our Terms and Privacy Policy. 3596 <a href="javascript:void(0);" onclick="expandFooter()" class="learn-more-link">Learn More</a> 3597 </p> 3598 </div> 3599 3600 <div class="footer-expanded" id="footer-expanded" style="display: none;"> 3601 <p>Weâve updated our <a href="/page/terms-of-service/" target="_blank">Terms of Use</a> and 3602 <a href="/page/privacy/" target="_blank">Privacy Policy</a> to explain how we collect, use, and share your data, and your rights.</p> 3603 <p>By continuing to use this website, you acknowledge and consent to the revised terms.</p> 3604 <div class="close-footer" onclick="closeFooter()"><i class="fa fa-times" aria-hidden="true" style="font-size: large !important;"></i></div> 3605 </div> 3606</div> 3607
3608<script> 3609 // Function to check if the cookie is set for closing the footer 3610 function hideStickyFooterIfClosed() { 3611 if (getCookie('sticky_footer_closed') === 'true') { 3612 document.getElementById('sticky-footer').style.display = 'none'; 3613 } 3614 } 3615 3616 // Call this function on page load to hide the footer if the cookie is set 3617 hideStickyFooterIfClosed(); 3618 window.onload = hideStickyFooterIfClosed; 3619 3620 // Function to close the footer and set the cookie 3621 function closeFooter() { 3622 var footer = document.getElementById('sticky-footer'); 3623 if (footer) { 3624 footer.style.display = 'none'; 3625 setCookie('sticky_footer_closed', 'true', 0); 3626 } 3627 } 3628 3629 function expandFooter() { 3630 document.getElementById('footer-collapsed').style.display = 'none'; 3631 document.getElementById('footer-expanded').style.display = 'block'; 3632 } 3633 3634 function getCookie(name) { 3635 let nameEQ = name + "="; 3636 let ca = document.cookie.split(';'); 3637 for (let i = 0; i < ca.length; i++) { 3638 let c = ca[i]; 3639 while (c.charAt(0) == ' ') c = c.substring(1, c.length); 3640 if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); 3641 } 3642 return null; 3643 } 3644 3645 // Function to set a cookie 3646 function setCookie(name, value, days) { 3647 let expires = ""; 3648 if (days) { 3649 let date = new Date(); 3650 date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); 3651 expires = "; expires=" + date.toUTCString(); 3652 } 3653 document.cookie = name + "=" + (value || "") + expires + "; path=/"; 3654 } 3655</script>
3655 3656 3657 3658
3658<script> 3659 (function() { 3660 var s = document.createElement('script'); 3661 var h = document.querySelector('head') || document.body; 3662 s.src = 'https://acsbapp.com/apps/app/dist/js/app.js'; 3663 s.async = true; 3664 s.onload = function() { 3665 var config = { 3666 statementLink: '', 3667 footerHtml: '', 3668 hideMobile: false, 3669 hideTrigger: false, 3670 disableBgProcess: false, 3671 language: 'en', 3672 position: 'left', 3673 leadColor: '#c35a96', 3674 triggerColor: '#c35a96', 3675 triggerRadius: '50%', 3676 triggerPositionX: 'left', 3677 triggerPositionY: 'bottom', 3678 triggerIcon: 'people', 3679 triggerSize: 'medium', 3680 triggerOffsetX: 20, 3681 triggerOffsetY: 110, 3682 mobile: { 3683 triggerSize: 'small', 3684 triggerPositionX: 'left', 3685 triggerPositionY: 'center', 3686 triggerOffsetX: 10, 3687 triggerOffsetY: 0, 3688 triggerRadius: '50%' 3689 } 3690 }; 3691 3692 acsbJS.init(config); 3693 }; 3694 h.appendChild(s); 3695 })(); 3696 </script>
3696 3697 3698 <!-- AI Chat Widget --> 3699 3700
3700<script> 3701 window.AI_AGENT_CONFIG = { 3702 widgetID: "7f00e4eb-9276-4bfe-9c95-85b6733112bc" 3703 }; 3704 </script>
3704 3705
3705<script src="https://platform-js.omapagents.ai/widget.js"></script>
3705 3706 3707 </body> 3708</html>
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.