© Copyright 2018 – 2024 FIRECRACKER SPORTS. All Rights Reserved.​ TERMS OF USE  |  PRIVACY POLICY

Northeast Premier Baseball League (9U-14U)

03/29/2025 - 06/15/2025
Providence , Rhode Island

INFORMATION

  • Age groups:
    6 Divisions 9U 10U 11U 12U 13U 14U
  • Pool Play:
    Saturday, March 29th through Saturday, June 14th, 2025
  • Price:
    9U - $199.0010U - $299.0011U - $299.0012U - $299.0013U - $299.0014U - $299.00
  • Playoffs/Championships:
    Sunday, June 15th, 2025

For more clarification on "Sub-Divisions" click here

  • Registration Fee: Free until December 31st, 2024. Starting January 1st, 2025 the registration fee will be $299.00 per team.
  • Pre-season and in season monthly meetings with coaches and program directors.
  • Teams are required to have a home field but teams will have equal amount of home and away games, weather permitting.
  • Firecracker Sports will provide matchups for teams to schedule games at their home venues. Once a game has been scheduled between two teams, the home team is required to report this to Firecracker Sports, by emailing operations@firecrackersports.com, for the game to be posted on the League website and verify umpires are scheduled.
  • Teams will be scheduled for matchups against teams in their "geographical area" within their age division, including their "sub-division."
  • All League games will be scored using GameChanger. Teams are required to score their games using the app and must report the final score to Firecracker Sports by filling out the Game Report form here. Teams also will send in a player of the game, for each game played on this form. Players will then be selected to be Player of the Week, for each age division on social media. This must be submitted by end of that game's date.

  • The league will provide all field costs, umpire costs, balls and trophy ceremonies with social media exposure on site for each championship game of each division.
    • 13U and 14U Divisions will play their “Best of 3” Championship(s) at collegiate venues!
  • After the 2025 season, the top 2 teams of the "Champions Division" will be promoted, and the bottom 2 teams of the "Premier Division" will be relegated...allowing true competition and divisions that are based on merit, league play and consistency in building rosters. This will be an annual promotion for those teams to ascend or be demoted based on performance.
  • Enhanced Social Media Presence...Weekly coverage including pitcher/player of the week, players to watch, games of the week and much more!
  • Want more, we got you covered! Player profiles for every player in the league including stats, scores, demographics for free to every family, college coach evaluations at playoff games such as semifinals and championships. Players will have more of an opportunity to gain evaluation for Fire55 and Jr. Fire55, the premier showcase of the summer at Dunkin Park, home of the Hartford Yard Goats. Jr. Fire55 is for those 13U - 14U as well. Options for Trackman and team analytic days during the season.
  • More coming shortly...All Star Games, Skills Competitions, HR Derby, All League, MVP Trophies plus more more!
  • Save the best for last...The top organization of the league, dictated by overall points system, will qualify for the “Grand Slam level of our loyalty program” for their program, starting Fall 2025 and through the Summer of 2026. Program benefits are listed on the "Discounts" button on this page

Registration

  • DIVISION:
    • 9U
    • 10U
    • 11U
    • 12U
    • 13U
    • 14U
    • OPEN
    • OPEN
    • Champions
    • OPEN
    • Champions
    • OPEN
    • Champions
    • OPEN
    • Champions
    • OPEN
    • Champions
    109 Teams Registered
    COST: $199.00 - $299.00

College Coaches Attending

Teams

(7 teams) - OPEN
(7 teams) - OPEN
(5 teams) - Champions
(2 teams) - Premier
(3 teams) - OPEN
(4 teams) - Premier
(1 teams) - Champions
(5 teams) - OPEN
(5 teams) - Premier
(9 teams) - Champions
(5 teams) - OPEN
(11 teams) - Champions
(7 teams) - Premier
(7 teams) - OPEN
(4 teams) - Premier
(8 teams) - Champions

Locations

TBA Playoff Site 4

,

Get Directions
Fields
    TBA Playoff Site 3

    ,

    Get Directions
    Fields
      TBA Playoff Site 2

      ,

      Get Directions
      Fields
        TBA Playoff Site 1

        ,

        Get Directions
        Fields
          Blunt Park

          1780 Roosevelt Avenue

          Springfield massachusetts ,United States

          Get Directions
          Fields
            Thomas J. Hyland Memorial Park and Southwest Recreation Center

            391 New Britain Avenue Fairfield Avenue Historic District

            Hartford connecticut ,United States

            Get Directions
            Fields
              Beachgrounds Park

              116 Main Street

              South Hadley massachusetts ,United States

              Get Directions
              VENUE DIVISIONS
              • 13U
              Fields
                Quaker Hill Elementary School

                285 Bloomingdale Road Quaker Hill

                Waterford connecticut ,United States

                Get Directions
                VENUE DIVISIONS
                • 9U
                Fields
                  Cohanzie Park

                  45 Dayton Road

                  Waterford connecticut ,United States

                  Get Directions
                  VENUE DIVISIONS
                  • 9U
                  • 11U
                  Fields
                    Waterford Veterans Memorial Field

                    174, Boston Post Road

                    Waterford connecticut ,United States

                    Get Directions
                    VENUE DIVISIONS
                    • 11U
                    Fields
                      Epsom Central School

                      282, Black Hall Road Epsom

                      Epsom new hampshire ,United States

                      Get Directions
                      VENUE DIVISIONS
                      • 14U
                      Fields
                        Dr. Kevin M. Hurley Middle School

                        Newman Avenue

                        Seekonk massachusetts ,United States

                        Get Directions
                        VENUE DIVISIONS
                        • 14U
                        Fields
                          Kingswood Oxford School

                          Kingswood Road

                          West Hartford connecticut ,United States

                          Get Directions
                          VENUE DIVISIONS
                          • 14U
                          Fields
                            TBA/Massachusetts

                            TBA/Massachusetts

                            TBA massachusetts ,USA

                            Get Directions
                            VENUE DIVISIONS
                            • 14U
                            Fields
                              Maplewood Park (Stafford Rd)

                              Stafford Road

                              Fall River massachusetts ,United States

                              Get Directions
                              VENUE DIVISIONS
                              • 14U
                              Fields
                                Crandall Park

                                Cider Mill Road

                                Tolland connecticut ,United States

                                Get Directions
                                VENUE DIVISIONS
                                • 10U
                                Fields
                                  TBA/Rhode Island

                                  TBA/Rhode Island

                                  TBA rhode island ,USA

                                  Get Directions
                                  VENUE DIVISIONS
                                  • 10U
                                  Fields
                                    Lyman Moore Middle School

                                    Auburn Street

                                    Portland maine ,United States

                                    Get Directions
                                    VENUE DIVISIONS
                                    • 14U
                                    Fields
                                      Xavier High School

                                      Randolph Road

                                      Middletown connecticut ,United States

                                      Get Directions
                                      VENUE DIVISIONS
                                      • 14U
                                      Fields
                                        Kevin DelGobbo Field

                                        Osborn Road

                                        Naugatuck connecticut ,United States

                                        Get Directions
                                        VENUE DIVISIONS
                                        • 14U
                                        Fields
                                          Recreation Park

                                          25 Maxwell Noble Dr

                                          Plantsville connecticut ,USA

                                          Get Directions
                                          VENUE DIVISIONS
                                          • 13U
                                          • 14U
                                          Fields
                                            Ellington Middle School

                                            Middle Butcher Road

                                            Ellington connecticut ,United States

                                            Get Directions
                                            VENUE DIVISIONS
                                            • 13U
                                            Fields
                                              Wolf Swamp Field

                                              Wolf Swamp Road

                                              Longmeadow massachusetts ,United States

                                              Get Directions
                                              VENUE DIVISIONS
                                              • 13U
                                              • 14U
                                              Fields
                                                Trombino Sports Complex

                                                Moorehouse Road

                                                Westerly rhode island ,United States

                                                Get Directions
                                                VENUE DIVISIONS
                                                • 13U
                                                Fields
                                                  Cromwell Middle School

                                                  Captain James Mann Memorial Drive

                                                  Cromwell connecticut ,United States

                                                  Get Directions
                                                  VENUE DIVISIONS
                                                  • 13U
                                                  • 14U
                                                  Fields
                                                    Marshall Roy Field

                                                    El Paso Street

                                                    Springfield massachusetts ,United States

                                                    Get Directions
                                                    VENUE DIVISIONS
                                                    • 13U
                                                    Fields
                                                      Tilloston Field

                                                      Crystal Street

                                                      Lenox massachusetts ,United States

                                                      Get Directions
                                                      VENUE DIVISIONS
                                                      • 13U
                                                      Fields
                                                        Colt State Park

                                                        Asylum Road

                                                        Bristol rhode island ,United States

                                                        Get Directions
                                                        VENUE DIVISIONS
                                                        • 13U
                                                        Fields
                                                          Minnechaug Regional High School

                                                          Main Street

                                                          Wilbraham massachusetts ,United States

                                                          Get Directions
                                                          VENUE DIVISIONS
                                                          • 13U
                                                          Fields
                                                            Mills Pond Park

                                                            East Hill Road Canton Valley

                                                            Canton connecticut ,United States

                                                            Get Directions
                                                            VENUE DIVISIONS
                                                            • 13U
                                                            Fields
                                                              Hamden Hall Country Day School

                                                              Skiff Street

                                                              Hamden connecticut ,United States

                                                              Get Directions
                                                              VENUE DIVISIONS
                                                              • 13U
                                                              Fields
                                                                Longmeadow DiPippo Park

                                                                Williams Court

                                                                Longmeadow massachusetts ,United States

                                                                Get Directions
                                                                VENUE DIVISIONS
                                                                • 13U
                                                                • 14U
                                                                Fields
                                                                  Northwest Park

                                                                  Tolland Turnpike

                                                                  Manchester connecticut ,United States

                                                                  Get Directions
                                                                  VENUE DIVISIONS
                                                                  • 13U
                                                                  Fields
                                                                    Allen Field

                                                                    West Road Ashby

                                                                    Ashby massachusetts ,United States

                                                                    Get Directions
                                                                    VENUE DIVISIONS
                                                                    • 13U
                                                                    • 14U
                                                                    Fields
                                                                      TBA/Connecticut

                                                                      TBA/Connecticut

                                                                      TBA connecticut ,USA

                                                                      Get Directions
                                                                      VENUE DIVISIONS
                                                                      • 9U
                                                                      Fields
                                                                        Southington Memorial Park

                                                                        Woodruff Street

                                                                        Southington connecticut ,United States

                                                                        Get Directions
                                                                        VENUE DIVISIONS
                                                                        • 10U
                                                                        • 12U
                                                                        Fields
                                                                          Suffield High School

                                                                          Sheldon Street

                                                                          Suffield connecticut ,United States

                                                                          Get Directions
                                                                          VENUE DIVISIONS
                                                                          • 12U
                                                                          • 13U
                                                                          Fields
                                                                            Turner Park

                                                                            Williams Street

                                                                            Longmeadow massachusetts ,United States

                                                                            Get Directions
                                                                            VENUE DIVISIONS
                                                                            • 12U
                                                                            Fields
                                                                              Montowese Park

                                                                              Quinnipiac Avenue Montowese

                                                                              North Haven connecticut ,United States

                                                                              Get Directions
                                                                              VENUE DIVISIONS
                                                                              • 12U
                                                                              Fields
                                                                                Orchard Park

                                                                                Orchard Park Street

                                                                                Boston massachusetts ,United States

                                                                                Get Directions
                                                                                VENUE DIVISIONS
                                                                                • 12U
                                                                                Fields
                                                                                  Miller Richardson Park

                                                                                  Main Street

                                                                                  Coventry connecticut ,United States

                                                                                  Get Directions
                                                                                  VENUE DIVISIONS
                                                                                  • 12U
                                                                                  Fields
                                                                                    Southington West LL

                                                                                    Spring Street

                                                                                    Southington connecticut ,United States

                                                                                    Get Directions
                                                                                    VENUE DIVISIONS
                                                                                    • 12U
                                                                                    • 13U
                                                                                    • 14U
                                                                                    Fields
                                                                                      Bradley School

                                                                                      David Humphrey Road

                                                                                      Derby connecticut ,United States

                                                                                      Get Directions
                                                                                      VENUE DIVISIONS
                                                                                      • 12U
                                                                                      Fields
                                                                                        Whalley Park

                                                                                        Powder Mill Road

                                                                                        Southwick massachusetts ,United States

                                                                                        Get Directions
                                                                                        VENUE DIVISIONS
                                                                                        • 12U
                                                                                        • 13U
                                                                                        • 14U
                                                                                        Fields
                                                                                          Watrous Park

                                                                                          Geer Street

                                                                                          Cromwell connecticut ,United States

                                                                                          Get Directions
                                                                                          VENUE DIVISIONS
                                                                                          • 12U
                                                                                          Fields
                                                                                            Hampden Memorial Park

                                                                                            495 Main Street

                                                                                            Hampden massachusetts ,US

                                                                                            Get Directions
                                                                                            VENUE DIVISIONS
                                                                                            • 11U
                                                                                            Fields
                                                                                              Samoset Middle School

                                                                                              Decicco Drive

                                                                                              Leominster massachusetts ,United States

                                                                                              Get Directions
                                                                                              VENUE DIVISIONS
                                                                                              • 12U
                                                                                              Fields
                                                                                                Newington High School

                                                                                                Willard Avenue

                                                                                                Newington connecticut ,United States

                                                                                                Get Directions
                                                                                                VENUE DIVISIONS
                                                                                                • 10U
                                                                                                • 13U
                                                                                                • 14U
                                                                                                Fields
                                                                                                  Mansfield Memorial Park

                                                                                                  Church Street

                                                                                                  Mansfield massachusetts ,United States

                                                                                                  Get Directions
                                                                                                  VENUE DIVISIONS
                                                                                                  • 10U
                                                                                                  Fields
                                                                                                    Kimberly Ann Rock Memorial Athletic Complex

                                                                                                    220 Ferris Avenue Rumford

                                                                                                    Rumford rhode island ,USA

                                                                                                    Get Directions
                                                                                                    VENUE DIVISIONS
                                                                                                    • 10U
                                                                                                    • 12U
                                                                                                    Fields
                                                                                                      Church Hill Park

                                                                                                      Main Street

                                                                                                      Newington connecticut ,United States

                                                                                                      Get Directions
                                                                                                      VENUE DIVISIONS
                                                                                                      • 10U
                                                                                                      • 12U
                                                                                                      Fields
                                                                                                        Ricci Field

                                                                                                        Duckworth Street

                                                                                                        Cranston rhode island ,United States

                                                                                                        Get Directions
                                                                                                        VENUE DIVISIONS
                                                                                                        • 10U
                                                                                                        Fields
                                                                                                          North Leominster LL

                                                                                                          Bernice Avenue

                                                                                                          Leominster massachusetts ,United States

                                                                                                          Get Directions
                                                                                                          VENUE DIVISIONS
                                                                                                          • 10U
                                                                                                          Fields
                                                                                                            Daggett Field

                                                                                                            Daggett Avenue

                                                                                                            Pawtucket rhode island ,United States

                                                                                                            Get Directions
                                                                                                            VENUE DIVISIONS
                                                                                                            • 10U
                                                                                                            • 13U
                                                                                                            • 14U
                                                                                                            Fields
                                                                                                              Cross Farms Field

                                                                                                              Rhodes Road

                                                                                                              Tolland connecticut ,United States

                                                                                                              Get Directions
                                                                                                              VENUE DIVISIONS
                                                                                                              • 10U
                                                                                                              Fields
                                                                                                                Brooklawn Park

                                                                                                                Acushnet Avenue

                                                                                                                New Bedford massachusetts ,United States

                                                                                                                Get Directions
                                                                                                                VENUE DIVISIONS
                                                                                                                • 10U
                                                                                                                Fields
                                                                                                                  TBA/Naugatuck, CT

                                                                                                                  TBA/Naugatuck, CT

                                                                                                                  Naugatuck connecticut ,USA

                                                                                                                  Get Directions
                                                                                                                  VENUE DIVISIONS
                                                                                                                  • 10U
                                                                                                                  Fields
                                                                                                                    TBA/Pawtucket, RI

                                                                                                                    TBA/Pawtucket, RI

                                                                                                                    TBA rhode island ,USA

                                                                                                                    Get Directions
                                                                                                                    VENUE DIVISIONS
                                                                                                                    • 10U
                                                                                                                    Fields
                                                                                                                      TBA/Southern New Hampshire

                                                                                                                      TBA/Southern New Hampshire

                                                                                                                      TBA new hampshire ,USA

                                                                                                                      Get Directions
                                                                                                                      VENUE DIVISIONS
                                                                                                                      • 10U
                                                                                                                      Fields
                                                                                                                        Milton Green Memorial Field

                                                                                                                        13 CT-117, Preston

                                                                                                                        Preston connecticut ,USA

                                                                                                                        Get Directions
                                                                                                                        VENUE DIVISIONS
                                                                                                                        • 9U
                                                                                                                        Fields
                                                                                                                        Memorial School

                                                                                                                        Main Street

                                                                                                                        Wilbraham massachusetts ,

                                                                                                                        Get Directions
                                                                                                                        VENUE DIVISIONS
                                                                                                                        • 9U
                                                                                                                        Fields
                                                                                                                          • Grass
                                                                                                                        Pope Park

                                                                                                                        Pope Street

                                                                                                                        Acushnet massachusetts ,

                                                                                                                        Get Directions
                                                                                                                        VENUE DIVISIONS
                                                                                                                        • 9U
                                                                                                                        • 10U
                                                                                                                        • 11U
                                                                                                                        • 12U
                                                                                                                        • 13U
                                                                                                                        Fields
                                                                                                                        • 60/90 Field
                                                                                                                          • Grass
                                                                                                                        • 50/70 Field
                                                                                                                          • Grass
                                                                                                                        • 46/60 Field
                                                                                                                          • Grass
                                                                                                                        Swansea Independent Baseball League (SIBL)

                                                                                                                        Nike Site Road

                                                                                                                        Swansea massachusetts ,

                                                                                                                        Get Directions
                                                                                                                        VENUE DIVISIONS
                                                                                                                        • 9U
                                                                                                                        • 10U
                                                                                                                        • 12U
                                                                                                                        Fields
                                                                                                                          • Grass
                                                                                                                        Maplewood Park

                                                                                                                        10, Albert Street

                                                                                                                        Fall River massachusetts ,United States

                                                                                                                        Get Directions
                                                                                                                        VENUE DIVISIONS
                                                                                                                        • 9U
                                                                                                                        • 13U
                                                                                                                        Fields
                                                                                                                        Lisa Dedrick Memorial Field and Park

                                                                                                                        45 Dayton Road

                                                                                                                        Waterford connecticut ,United States

                                                                                                                        Get Directions
                                                                                                                        VENUE DIVISIONS
                                                                                                                        • 9U
                                                                                                                        Fields
                                                                                                                        Max Read Field

                                                                                                                        544 Pleasant St

                                                                                                                        Pawtucket rhode island ,USA

                                                                                                                        Get Directions
                                                                                                                        VENUE DIVISIONS
                                                                                                                        • 13U
                                                                                                                        • 14U
                                                                                                                        Fields
                                                                                                                          VENUE DETAILS

                                                                                                                          Max Read Field

                                                                                                                          Mitchell Woods

                                                                                                                          701 Montauk Ave

                                                                                                                          New London ,

                                                                                                                          Get Directions
                                                                                                                          VENUE DIVISIONS
                                                                                                                          • 10U
                                                                                                                          Fields
                                                                                                                            VENUE DETAILS

                                                                                                                            Mitchell Woods

                                                                                                                            Alumni Field

                                                                                                                            168 Alumni Road

                                                                                                                            Newington connecticut ,United States

                                                                                                                            Get Directions
                                                                                                                            VENUE DIVISIONS
                                                                                                                            • 10U
                                                                                                                            Fields
                                                                                                                            • Field - 1
                                                                                                                              • Lights
                                                                                                                              • Grass
                                                                                                                            VENUE DETAILS

                                                                                                                            Alumni Field

                                                                                                                            Warwick Continental LL Complex

                                                                                                                            225 Crossings Blvd

                                                                                                                            Warwick rhode island ,USA

                                                                                                                            Get Directions
                                                                                                                            VENUE DIVISIONS
                                                                                                                            • 11U
                                                                                                                            • 12U
                                                                                                                            Fields
                                                                                                                            • D’Abrosca Memorial Field
                                                                                                                              • Lights
                                                                                                                              • Grass
                                                                                                                              • Permanent Bathrooms
                                                                                                                              • Concession Stand
                                                                                                                            • Founders Field
                                                                                                                              • Grass
                                                                                                                              • Permanent Bathrooms
                                                                                                                              • Concession Stand
                                                                                                                            Boys & Girls Club - Pawtucket

                                                                                                                            1 Moeller Place

                                                                                                                            Pawtucket rhode island ,USA

                                                                                                                            Get Directions
                                                                                                                            VENUE DIVISIONS
                                                                                                                            • 10U
                                                                                                                            Fields
                                                                                                                              VENUE DETAILS

                                                                                                                              Boys & Girls Club - Pawtucket

                                                                                                                              Martha Hart Park

                                                                                                                              135 Corbin Ave

                                                                                                                              New Britain connecticut ,USA

                                                                                                                              Get Directions
                                                                                                                              VENUE DIVISIONS
                                                                                                                              • 12U
                                                                                                                              Fields
                                                                                                                                VENUE DETAILS

                                                                                                                                Martha Hart Park

                                                                                                                                Walnut Hill Park

                                                                                                                                184 W Main St

                                                                                                                                New Britain ,

                                                                                                                                Get Directions
                                                                                                                                VENUE DIVISIONS
                                                                                                                                • 13U
                                                                                                                                Fields
                                                                                                                                  VENUE DETAILS

                                                                                                                                  Walnut Hill Park

                                                                                                                                  McLaughlin Field - Upper Field

                                                                                                                                  992 Lancaster street

                                                                                                                                  Leominster massachusetts ,USA

                                                                                                                                  Get Directions
                                                                                                                                  VENUE DIVISIONS
                                                                                                                                  • 13U
                                                                                                                                  Fields
                                                                                                                                  • Upper Field
                                                                                                                                    • Lights
                                                                                                                                    • Grass
                                                                                                                                    • Portable Bathrooms
                                                                                                                                  Rhode Island College

                                                                                                                                  600 Library Road

                                                                                                                                  Providence ,

                                                                                                                                  Get Directions
                                                                                                                                  VENUE DIVISIONS
                                                                                                                                  • 13U
                                                                                                                                  • 14U
                                                                                                                                  Fields
                                                                                                                                  • Pontarelli Field
                                                                                                                                    • Grass
                                                                                                                                    • Permanent Bathrooms
                                                                                                                                    • Concession Stand
                                                                                                                                  VENUE DETAILS

                                                                                                                                  Rhode Island College

                                                                                                                                  Slater Park

                                                                                                                                  401 Newport Ave

                                                                                                                                  Pawtucket rhode island ,

                                                                                                                                  Get Directions
                                                                                                                                  VENUE DIVISIONS
                                                                                                                                  • 9U
                                                                                                                                  • 10U
                                                                                                                                  • 13U
                                                                                                                                  • 14U
                                                                                                                                  Fields
                                                                                                                                  • McConnon Field
                                                                                                                                    • Lights
                                                                                                                                    • Grass
                                                                                                                                    • Portable Bathrooms
                                                                                                                                  • Dick Cosimini Field
                                                                                                                                    • Grass
                                                                                                                                  Veterans Park

                                                                                                                                  271 Smithfield Ave

                                                                                                                                  Pawtucket rhode island ,USA

                                                                                                                                  Get Directions
                                                                                                                                  VENUE DIVISIONS
                                                                                                                                  • 13U
                                                                                                                                  Fields
                                                                                                                                    VENUE DETAILS

                                                                                                                                    Veterans Park

                                                                                                                                    Hank Soar Athletic Complex

                                                                                                                                    470 Prospect St

                                                                                                                                    Pawtucket rhode island ,

                                                                                                                                    Get Directions
                                                                                                                                    VENUE DIVISIONS
                                                                                                                                    • 11U
                                                                                                                                    • 12U
                                                                                                                                    Fields
                                                                                                                                    • Field #1
                                                                                                                                      • Lights
                                                                                                                                      • Grass
                                                                                                                                      • Permanent Bathrooms
                                                                                                                                    • Field #2
                                                                                                                                      • Lights
                                                                                                                                      • Grass
                                                                                                                                      • Permanent Bathrooms
                                                                                                                                    • Field #3
                                                                                                                                      • Lights
                                                                                                                                      • Grass
                                                                                                                                      • Permanent Bathrooms
                                                                                                                                    University of Rhode Island

                                                                                                                                    3 Keaney Rd

                                                                                                                                    Kingston rhode island ,USA

                                                                                                                                    Get Directions
                                                                                                                                    VENUE DIVISIONS
                                                                                                                                    • 14U
                                                                                                                                    Fields
                                                                                                                                    • Bill Beck Field
                                                                                                                                      • Turf
                                                                                                                                      • Portable Bathrooms
                                                                                                                                    VENUE DETAILS

                                                                                                                                    The following items are prohibited at this turf venue…

                                                                                                                                    • Metal Spikes
                                                                                                                                    • Sunflower Seeds
                                                                                                                                    • Gum

                                                                                                                                    schedule

                                                                                                                                    5.12.25 2:00pm

                                                                                                                                    Scores are currently being uploaded from this past weekend, and will be updated with standings shortly.

                                                                                                                                    HOTELS

                                                                                                                                    SCHEDULES & STANDINGS

                                                                                                                                    Standings

                                                                                                                                     TeamWLTRARSRDW%
                                                                                                                                    DateTimeGameDivisionLocationTeamScoreTeamNotes

                                                                                                                                    Brackets

                                                                                                                                    TOP PERFORMERS

                                                                                                                                    RULES

                                                                                                                                    There is no rules.

                                                                                                                                    WEATHER

                                                                                                                                    `);printWindow.document.close(); }); /* function gpe_get_schedules_list() { const event_id = '39771'; let division_filter_drop = $("#division_filter_drop").val(); let pool_filter_drop = $("#pool_filter_drop").val(); let date_filter_drop = $("#date_filter_drop").val();// Show processing indicator (manually trigger it) table.destroy(); // Destroy old DataTable before making new AJAX call $("#schedules_table tbody").html('Loading...'); // Temporary loader row$.ajax({ url: gpe.ajax_url, type: 'post', data: { action: 'gpe_ajax', type: 'gpe_get_schedules_list', event_id: event_id, division_filter_drop: division_filter_drop, pool_filter_drop: pool_filter_drop, date_filter_drop: date_filter_drop }, success: function (response) { // Clear the table body and add new content $("#schedules_table tbody").empty().html(response.data.html);// Reinitialize DataTable with processing enabled table = $("#schedules_table").DataTable({ processing: true, serverSide: false, // Keep it false unless loading data dynamically searching: true, paging: true, autoWidth: false }); } }); } function gpe_get_standing_list() { const event_id = '39771'; let division_filter_drop = $("#division_filter_drop_for_standing").val(); let pool_filter_drop = $("#pool_filter_drop_for_standing").val(); // Show processing indicator (manually trigger it) standings_table.destroy(); // Destroy old DataTable before making new AJAX call $("#standings_table tbody").html('Loading...'); // Temporary loader row $.ajax({ url: gpe.ajax_url, type: 'post', data: { action: 'gpe_ajax', type: 'gpe_get_standing_list', event_id: event_id, division_filter_drop: division_filter_drop, pool_filter_drop: pool_filter_drop }, success: function (response) { // Clear the table body and add new content $("#standings_table tbody").empty().html(response.data.html); // Reinitialize DataTable with processing enabled standings_table = $("#standings_table").DataTable({ processing: true, serverSide: false, // Keep it false unless loading data dynamically searching: true, paging: false }); } }); }*/ $('#shareDropdown').change(function(){ var selectedOption = $(this).val(); if (selectedOption === "copy") { var pageLink = window.location.href; var tempInput = $(""); $("body").append(tempInput); tempInput.val(pageLink).select(); document.execCommand("copy"); tempInput.remove(); Swal.fire({ title:"Success", text:"Copied to clipboard!", icon:'success' }); // Reset dropdown selection $(this).prop('selectedIndex', 0); } }); }); let isSchedulesTableInitialized = false;function gpeCustomeTabsnew(evt, cityName) { var i, tabcontent, tablinks; tabcontent = document.getElementsByClassName("gpe_tabcontent"); for (i = 0; i < tabcontent.length; i++) { tabcontent[i].style.display = "none"; } tablinks = document.getElementsByClassName("gpe_tablinks"); for (i = 0; i < tablinks.length; i++) { tablinks[i].className = tablinks[i].className.replace(" gpe_active", ""); } document.getElementById(cityName).style.display = "block"; evt.currentTarget.className += " gpe_active";if (cityName === "schedules_and_standings") { // ✅ Prevent reinitializing the DataTable if (!isSchedulesTableInitialized) { // Only call once window.gpe_get_schedules_list(); window.gpe_get_standing_list(); isSchedulesTableInitialized = true; } } }function gpeCustomeTabs(evt, cityName) { var i, tabcontent, tablinks; tabcontent = document.getElementsByClassName("gpe_tabcontent"); for (i = 0; i < tabcontent.length; i++) { tabcontent[i].style.display = "none"; } tablinks = document.getElementsByClassName("gpe_tablinks"); for (i = 0; i < tablinks.length; i++) { tablinks[i].className = tablinks[i].className.replace(" gpe_active", ""); } document.getElementById(cityName).style.display = "block"; evt.currentTarget.className += " gpe_active"; // Redraw connectors when Bracket tab is activated if (cityName === "brackets"){ //alert("Bracket"); loadSavedBracket(); } if (cityName === "brackets" && window.globalSerialMap) { // Wait until the browser has painted the visible DOM //requestAnimationFrame(() => { //setTimeout(() => { waitForLayoutAndDraw(window.globalSerialMap, 20); //}, 100); //}); } }// Get the element with id="defaultOpen" and click on it document.getElementById("defaultOpen").click(); var acc = document.getElementsByClassName("gpe_accordion"); var i; for (i = 0; i < acc.length; i++) { acc[i].addEventListener("click", function() { this.classList.toggle("active"); var panel = this.nextElementSibling; if (panel.style.maxHeight) { panel.style.maxHeight = null; } else { panel.style.maxHeight = panel.scrollHeight + "px"; } }); }var latitude = document.getElementById("latitude").value; var longitude = document.getElementById("longitude").value;var iframe = document.createElement("iframe"); iframe.src = "https://www.google.com/maps/embed?pb=!1m28!1m12!1m3!1d19797.686238814687!2d-71.3765509!3d41.8633795!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!4m13!3e6!4m5!1s0x89e45a80fc2b13ab%3A0x8f62f2e279889968!2sCurrent%20Location!3m2!1d" + latitude + "!2d" + longitude + "!4m5!1s0x89e45a7a2b41f7f3%3A0x6cb46461e8d0c1b4!2s" + latitude + "%2C" + longitude + "!3m2!1d" + latitude + "!2d" + longitude + "!5e0!3m2!1sen!2sus!4v1644233201036!5m2!1sen!2sus"; iframe.width = "528"; iframe.height = "295"; iframe.style.border = "0"; iframe.allowfullscreen = true;var mapContainer = document.getElementById("mapContainer"); mapContainer.innerHTML = ""; mapContainer.appendChild(iframe); function getPoolsByDivision(divisionId) { return $.ajax({ url: gpe.ajax_url, method: "POST", dataType: "json", data: { action: "gpe_ajax", type: "get_pools_save", division_id: divisionId } }); }function loadSavedBracket() { // Get the division ID from the division select dropdown const divisionId = $("#division_select").val(); // Get the current event ID dynamically from PHP const eventId = '39771';// If division ID is not selected, exit early if (!divisionId) return;// Perform both AJAX requests in parallel $.when( $.ajax({ url: gpe.ajax_url, // URL for the AJAX request type: "POST", // HTTP method dataType: "json", // Expected response type data: { action: "gpe_ajax", // WordPress action hook for AJAX type: "get_saved_bracket", // Custom action to get saved bracket data event_id: eventId, // The current event ID division_id: divisionId // The selected division ID } }), getPoolsByDivision(divisionId) // Function to get pools for the selected division ).done(function (bracketRes, poolsRes) { // Extract bracket data from the first response (bracketRes) const bracketData = bracketRes[0]?.data?.bracket_data || []; // Prepare a map of pool ID to pool title const poolMap = {}; poolsRes[0]?.data?.forEach(pool => { poolMap[pool.id] = pool.title; });// Call renderSavedBracket function to render the bracket renderSavedBracket(bracketData, poolMap); }).fail(function () { // In case of failure, show an error message in the bracket container $("#bracket").html("
                                                                                                                                    Error loading bracket.
                                                                                                                                    "); }); } function renderSavedBracket(bracketData, poolMap) { let bracketWrapper = $(".bracket_wrapper"); if (bracketWrapper.length === 0) { bracketWrapper = $("
                                                                                                                                    ").addClass("bracket_wrapper"); // Append it to the main container if it's missing $("#bracket").replaceWith(bracketWrapper); } else { bracketWrapper.empty(); // Clear existing content if already present } let bracketDiv = $("
                                                                                                                                    ").attr("id", "bracket"); bracketWrapper.append(bracketDiv); if (!bracketData || bracketData.length === 0) { bracketDiv.append(`

                                                                                                                                    Bracket not available, please select a different division from the drop down menu

                                                                                                                                    `); return; } let groups = {}; let serialMap = {}; let matchCounter = 1; bracketData.forEach(match => { if (match.is_important === "1") { if (!groups[match.group_number]) groups[match.group_number] = {}; if (!groups[match.group_number][match.column_number]) groups[match.group_number][match.column_number] = []; groups[match.group_number][match.column_number].push(match); } }); const sortedGroups = Object.keys(groups).sort(); const mainGroup = sortedGroups[0]; let groupScrollWrapper = $("
                                                                                                                                    ").addClass("group-scroll-wrapper"); for (let group of sortedGroups) { let groupSerialCounter = 1; let groupDiv = $("
                                                                                                                                    ").addClass("group").attr("data-group", group); let columnsContainer = $("
                                                                                                                                    ").addClass("columns-container"); let groupMatchesArray = Object.values(groups[group]).flat(); let groupLabel = groupMatchesArray[0]?.group_label ?? `Group ${group}`; let labelDiv = $("
                                                                                                                                    ").addClass("group-label").text(groupLabel); groupDiv.append(labelDiv); let columns = Object.keys(groups[group]).sort((a, b) => a - b); const groupMatches = {}; const allMatches = Object.values(groups[group]).flat(); const matchCount = allMatches.length; const isFiveTeam = allMatches.length === 4 && columns.length === 3; const isSevenTeam = matchCount === 6 && columns.length === 4; const isTenTeam = matchCount === 9 && columns.length === 4; const isNineTeam = matchCount === 8 && columns.length === 4; const isSixTeam = matchCount === 5 && columns.length === 3; const isTwelveTeam = matchCount === 11 && columns.length === 4; // Adjust if using 12 matches if (isTwelveTeam) { allMatches.sort((a, b) => parseInt(a.name) - parseInt(b.name)); const displayOrder = [ allMatches[0], allMatches[1], allMatches[2], allMatches[3], // Round 1 allMatches[4], allMatches[5], allMatches[6], allMatches[7], // Round 2 allMatches[8], allMatches[9], // Semifinals allMatches[10] // Final ];let roundDiv1 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[0]); let roundDiv2 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[1]); let roundDiv3 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[2]); let roundDiv4 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[3]);displayOrder.forEach((match, i) => { const serial = groupSerialCounter++; const matchId = `match-serial-${group}-${serial}`; let matchDiv = $("
                                                                                                                                    ") .addClass("match") .attr("id", matchId) .attr("data-match-index", match.name);let score1 = match.team1_score ?? "-"; let score2 = match.team2_score ?? "-"; //let team1 = match.team_name1 ?? "Team 1"; //let team2 = match.team_name2 ?? "Team 2"; let team1 = match.source_label_team1 && match.source_label_team1.trim() !== "" ? match.source_label_team1 : (match.team_name1 ?? "Team 1"); let team2 = match.source_label_team2 && match.source_label_team2.trim() !== "" ? match.source_label_team2 : (match.team_name2 ?? "Team 2");let startTime = formatStartDateTime(match.start_date, match.start_time); let location = match.location || "";matchDiv.html(`
                                                                                                                                    ${match.name}
                                                                                                                                    ${startTime}
                                                                                                                                    ${location}
                                                                                                                                    ${team1} ${score1}
                                                                                                                                    ${team2} ${score2}
                                                                                                                                    `);const matchContainer = $("
                                                                                                                                    ").addClass("match-container").css("margin-bottom", "20px"); matchContainer.append(matchDiv);match.serial = serial; if (!groupMatches[match.column_number]) groupMatches[match.column_number] = []; groupMatches[match.column_number].push(match); serialMap[`${group}-${serial}`] = { ...match, group, column: match.column_number, serial };if (i < 4) roundDiv1.append(matchContainer); // Round 1 else if (i < 8) roundDiv2.append(matchContainer); // Round 2 else if (i < 10) roundDiv3.append(matchContainer); // Semis else roundDiv4.append(matchContainer); // Final });columnsContainer.append(roundDiv1); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv2); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv3); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv4);groupDiv.append(columnsContainer); groupScrollWrapper.append(groupDiv);const groupNumbers = Object.keys(groups); // make sure 'groups' is defined and validconst importantMatchExists = Object.values(groupMatches) .flat() .some(m => m.is_importantlast === "1");setTimeout(() => { if (importantMatchExists) { const currentGroupNumber = group; const currentIndex = groupNumbers.indexOf(currentGroupNumber); const prevGroupNumber = currentIndex > 0 ? groupNumbers[currentIndex - 1] : null; const lastChecked = true;positionMatcheslast(groupMatches, currentGroupNumber, prevGroupNumber, lastChecked); } positionMatches(groupMatches, group); waitForLayoutAndDraw(serialMap, 20); }, 100);continue; }if (isSixTeam) { allMatches.sort((a, b) => parseInt(a.name) - parseInt(b.name));const displayOrder = [ allMatches[0], // Match 1 allMatches[1], // Match 2 allMatches[2], // Match 3 allMatches[3], // Match 4 allMatches[4] // Final ];let roundDiv1 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[0]); let roundDiv2 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[1]); let roundDiv3 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[2]);displayOrder.forEach((match, i) => { const serial = groupSerialCounter++; const matchId = `match-serial-${group}-${serial}`;let matchDiv = $("
                                                                                                                                    ") .addClass("match") .attr("id", matchId) .attr("data-match-index", match.name);let score1 = match.team1_score ?? "-"; let score2 = match.team2_score ?? "-"; //let team1 = match.team_name1 ?? "Team 1"; //let team2 = match.team_name2 ?? "Team 2"; let team1 = match.source_label_team1 && match.source_label_team1.trim() !== "" ? match.source_label_team1 : (match.team_name1 ?? "Team 1"); let team2 = match.source_label_team2 && match.source_label_team2.trim() !== "" ? match.source_label_team2 : (match.team_name2 ?? "Team 2");let startTime = formatStartDateTime(match.start_date, match.start_time); let location = match.location || "";matchDiv.html(`
                                                                                                                                    ${match.name}
                                                                                                                                    ${startTime}
                                                                                                                                    ${location}
                                                                                                                                    ${team1} ${score1}
                                                                                                                                    ${team2} ${score2}
                                                                                                                                    `);const matchContainer = $("
                                                                                                                                    ").addClass("match-container").css("margin-bottom", "20px"); matchContainer.append(matchDiv);match.serial = serial; if (!groupMatches[match.column_number]) groupMatches[match.column_number] = []; groupMatches[match.column_number].push(match);serialMap[`${group}-${serial}`] = { ...match, group, column: match.column_number, serial };if (i < 2) roundDiv1.append(matchContainer); else if (i < 4) roundDiv2.append(matchContainer); else roundDiv3.append(matchContainer); });columnsContainer.append(roundDiv1); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv2); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv3);groupDiv.append(columnsContainer); groupScrollWrapper.append(groupDiv);const groupNumbers = Object.keys(groups); // make sure 'groups' is defined and validconst importantMatchExists = Object.values(groupMatches) .flat() .some(m => m.is_importantlast === "1");setTimeout(() => { if (importantMatchExists) { const currentGroupNumber = group; const currentIndex = groupNumbers.indexOf(currentGroupNumber); const prevGroupNumber = currentIndex > 0 ? groupNumbers[currentIndex - 1] : null; const lastChecked = true;positionMatcheslast(groupMatches, currentGroupNumber, prevGroupNumber, lastChecked); } positionMatches(groupMatches, group); waitForLayoutAndDraw(serialMap, 20); }, 100);continue; } if (isNineTeam) { allMatches.sort((a, b) => parseInt(a.name) - parseInt(b.name));const displayOrder = [ allMatches[0], // Game 1 - Round 1 allMatches[1], // Game 2 - Round 2 allMatches[2], // Game 3 allMatches[3], // Game 4 allMatches[4], // Game 5 allMatches[5], // Game 6 - Round 3 allMatches[6], // Game 7 allMatches[7] // Game 8 - Round 4 (Final) ];let roundDiv1 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[0]); let roundDiv2 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[1]); let roundDiv3 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[2]); let roundDiv4 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[3]);displayOrder.forEach((match, i) => { const serial = groupSerialCounter++; const matchId = `match-serial-${group}-${serial}`;let matchDiv = $("
                                                                                                                                    ") .addClass("match") .attr("id", matchId) .attr("data-match-index", match.name);let score1 = match.team1_score ?? "-"; let score2 = match.team2_score ?? "-"; //let team1 = match.team_name1 ?? "Team 1"; //let team2 = match.team_name2 ?? "Team 2"; let team1 = match.source_label_team1 && match.source_label_team1.trim() !== "" ? match.source_label_team1 : (match.team_name1 ?? "Team 1"); let team2 = match.source_label_team2 && match.source_label_team2.trim() !== "" ? match.source_label_team2 : (match.team_name2 ?? "Team 2");let startTime = formatStartDateTime(match.start_date, match.start_time); let location = match.location || "";matchDiv.html(`
                                                                                                                                    ${match.name}
                                                                                                                                    ${startTime}
                                                                                                                                    ${location}
                                                                                                                                    ${team1} ${score1}
                                                                                                                                    ${team2} ${score2}
                                                                                                                                    `);const matchContainer = $("
                                                                                                                                    ").addClass("match-container").css("margin-bottom", "20px"); matchContainer.append(matchDiv);match.serial = serial; if (!groupMatches[match.column_number]) groupMatches[match.column_number] = []; groupMatches[match.column_number].push(match);serialMap[`${group}-${serial}`] = { ...match, group, column: match.column_number, serial };if (i === 0) roundDiv1.append(matchContainer); else if (i >= 1 && i <= 4) roundDiv2.append(matchContainer); else if (i === 5 || i === 6) roundDiv3.append(matchContainer); else if (i === 7) roundDiv4.append(matchContainer); });columnsContainer.append(roundDiv1); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv2); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv3); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv4);groupDiv.append(columnsContainer); groupScrollWrapper.append(groupDiv);const groupNumbers = Object.keys(groups); // make sure 'groups' is defined and validconst importantMatchExists = Object.values(groupMatches) .flat() .some(m => m.is_importantlast === "1");setTimeout(() => { if (importantMatchExists) { const currentGroupNumber = group; const currentIndex = groupNumbers.indexOf(currentGroupNumber); const prevGroupNumber = currentIndex > 0 ? groupNumbers[currentIndex - 1] : null; const lastChecked = true;positionMatcheslast(groupMatches, currentGroupNumber, prevGroupNumber, lastChecked); } positionMatches(groupMatches, group); waitForLayoutAndDraw(serialMap, 20); }, 100);continue; }if (isTenTeam) { allMatches.sort((a, b) => parseInt(a.name) - parseInt(b.name)); console.log("10-team allMatches:", allMatches.map(m => ({ name: m.name, id: m.id, column: m.column_number })));// Custom display order: Round 2 is visually reordered // Custom display order: Round 2 is visually reordered const displayOrder = [ allMatches[0], allMatches[1], // Round 1: Match 36, 37 allMatches[2], allMatches[3], allMatches[4], allMatches[5], // Round 2: Matches 3, 4, 5, 6 (in order) allMatches[6], allMatches[7], // Round 3: Matches 42–43 allMatches[8] // Final: Match 44 ];let roundDiv1 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[0]); let roundDiv2 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[1]); let roundDiv3 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[2]); let roundDiv4 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[3]);displayOrder.forEach((match, i) => { const serial = groupSerialCounter++; const matchId = `match-serial-${group}-${serial}`;let matchDiv = $("
                                                                                                                                    ") .addClass("match") .attr("id", matchId) .attr("data-match-index", match.name);let score1 = match.team1_score ?? "-"; let score2 = match.team2_score ?? "-"; //let team1 = match.team_name1 ?? "Team 1"; //let team2 = match.team_name2 ?? "Team 2"; let team1 = match.source_label_team1 && match.source_label_team1.trim() !== "" ? match.source_label_team1 : (match.team_name1 ?? "Team 1"); let team2 = match.source_label_team2 && match.source_label_team2.trim() !== "" ? match.source_label_team2 : (match.team_name2 ?? "Team 2");let startTime = formatStartDateTime(match.start_date, match.start_time); let location = match.location || "";matchDiv.html(`
                                                                                                                                    ${match.name}
                                                                                                                                    ${startTime}
                                                                                                                                    ${location}
                                                                                                                                    ${team1} ${score1}
                                                                                                                                    ${team2} ${score2}
                                                                                                                                    `);const matchContainer = $("
                                                                                                                                    ") .addClass("match-container") .css("margin-bottom", "20px"); // ← add spacing between matchesmatchContainer.append(matchDiv);match.serial = serial; if (!groupMatches[match.column_number]) groupMatches[match.column_number] = []; groupMatches[match.column_number].push(match);serialMap[`${group}-${serial}`] = { ...match, group, column: match.column_number, serial };if (i < 2) roundDiv1.append(matchContainer); // Round 1 else if (i >= 2 && i <= 5) { // Force desired visual order for Round 2: Matches 38, 39, 40, 41 // Map i to visual index: 2→0, 3→1, 4→2, 5→3 const round2Order = [2, 3, 4, 5]; const targetIndex = round2Order.indexOf(i);if (targetIndex !== -1) { const container = roundDiv2.find(".match-container").eq(targetIndex); if (container.length) { container.before(matchContainer); } else { roundDiv2.append(matchContainer); } } }else if (i < 8) roundDiv3.append(matchContainer); // Round 3 else roundDiv4.append(matchContainer); // Final });columnsContainer.append(roundDiv1); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv2); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv3); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv4);groupDiv.append(columnsContainer); groupScrollWrapper.append(groupDiv);const groupNumbers = Object.keys(groups); // make sure 'groups' is defined and validconst importantMatchExists = Object.values(groupMatches) .flat() .some(m => m.is_importantlast === "1");setTimeout(() => { if (importantMatchExists) { const currentGroupNumber = group; const currentIndex = groupNumbers.indexOf(currentGroupNumber); const prevGroupNumber = currentIndex > 0 ? groupNumbers[currentIndex - 1] : null; const lastChecked = true;positionMatcheslast(groupMatches, currentGroupNumber, prevGroupNumber, lastChecked); } positionMatches(groupMatches, group); waitForLayoutAndDraw(serialMap, 20); }, 100);continue; }if (isFiveTeam) { allMatches.sort((a, b) => parseInt(a.name) - parseInt(b.name)); const displayOrder = [allMatches[0], allMatches[2], allMatches[1], allMatches[3]]; groupMatches[columns[0]] = [allMatches[0]]; groupMatches[columns[1]] = [allMatches[2], allMatches[1]]; groupMatches[columns[2]] = [allMatches[3]]; let roundDiv1 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[0]); let roundDiv2 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[1]); let roundDiv3 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[2]); displayOrder.forEach((match, i) => { const serial = groupSerialCounter++; const matchId = `match-serial-${group}-${serial}`; let matchDiv = $("
                                                                                                                                    ") .addClass("match") .attr("id", matchId) .attr("data-match-index", match.name);let score1 = match.team1_score ?? "-"; let score2 = match.team2_score ?? "-"; //let team1 = match.team_name1 ?? "Team 1"; //let team2 = match.team_name2 ?? "Team 2"; let team1 = match.source_label_team1 && match.source_label_team1.trim() !== "" ? match.source_label_team1 : (match.team_name1 ?? "Team 1"); let team2 = match.source_label_team2 && match.source_label_team2.trim() !== "" ? match.source_label_team2 : (match.team_name2 ?? "Team 2");let startTime = formatStartDateTime(match.start_date, match.start_time); let location = match.location || "";matchDiv.html(`
                                                                                                                                    ${match.name}
                                                                                                                                    ${startTime}
                                                                                                                                    ${location}
                                                                                                                                    ${team1} ${score1}
                                                                                                                                    ${team2} ${score2}
                                                                                                                                    `); const matchContainer = $("
                                                                                                                                    ").addClass("match-container"); matchContainer.append(matchDiv);match.serial = serial; serialMap[`${group}-${serial}`] = { ...match, group, column: match.column_number, serial };if (i === 0) roundDiv1.append(matchContainer); else if (i === 1 || i === 2) roundDiv2.append(matchContainer); else if (i === 3) roundDiv3.append(matchContainer); });columnsContainer.append(roundDiv1); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv2); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv3);groupDiv.append(columnsContainer); groupScrollWrapper.append(groupDiv);const groupNumbers = Object.keys(groups); // make sure 'groups' is defined and validconst importantMatchExists = Object.values(groupMatches) .flat() .some(m => m.is_importantlast === "1");setTimeout(() => { if (importantMatchExists) { const currentGroupNumber = group; const currentIndex = groupNumbers.indexOf(currentGroupNumber); const prevGroupNumber = currentIndex > 0 ? groupNumbers[currentIndex - 1] : null; const lastChecked = true;positionMatcheslast(groupMatches, currentGroupNumber, prevGroupNumber, lastChecked); } positionMatches(groupMatches, group); waitForLayoutAndDraw(serialMap, 20); }, 100);continue; }if (isSevenTeam) { allMatches.sort((a, b) => parseInt(a.name) - parseInt(b.name));const displayOrder = [ allMatches[0], // Match 1 allMatches[1], // Match 2 allMatches[2], // Match 3 allMatches[3], // Match 4 allMatches[4], // Match 5 allMatches[5] // Match 6 ];// Use only the first 3 columns for layout let roundDiv1 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[0]); let roundDiv2 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[1]); let roundDiv3 = $("
                                                                                                                                    ").addClass("round").attr("data-column", columns[2]);displayOrder.forEach((match, i) => { const serial = groupSerialCounter++; const matchId = `match-serial-${group}-${serial}`;let matchDiv = $("
                                                                                                                                    ") .addClass("match") .attr("id", matchId) .attr("data-match-index", match.name);let score1 = match.team1_score ?? "-"; let score2 = match.team2_score ?? "-"; //let team1 = match.team_name1 ?? "Team 1"; //let team2 = match.team_name2 ?? "Team 2"; let team1 = match.source_label_team1 && match.source_label_team1.trim() !== "" ? match.source_label_team1 : (match.team_name1 ?? "Team 1"); let team2 = match.source_label_team2 && match.source_label_team2.trim() !== "" ? match.source_label_team2 : (match.team_name2 ?? "Team 2");let startTime = formatStartDateTime(match.start_date, match.start_time); let location = match.location || "";matchDiv.html(`
                                                                                                                                    ${match.name}
                                                                                                                                    ${startTime}
                                                                                                                                    ${location}
                                                                                                                                    ${team1} ${score1}
                                                                                                                                    ${team2} ${score2}
                                                                                                                                    `);const matchContainer = $("
                                                                                                                                    ").addClass("match-container"); matchContainer.append(matchDiv);match.serial = serial; if (!groupMatches["1"]) groupMatches["1"] = []; groupMatches["1"].push(match); serialMap[`${group}-${serial}`] = { ...match, group, column: match.column_number, serial };if (i < 3) { roundDiv1.append(matchContainer); // Matches 0,1,2 } else if (i < 5) { roundDiv2.append(matchContainer); // Matches 3,4 } else { roundDiv3.append(matchContainer); // Match 5 }});columnsContainer.append(roundDiv1); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv2); columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); columnsContainer.append(roundDiv3);groupDiv.append(columnsContainer); groupScrollWrapper.append(groupDiv);const groupNumbers = Object.keys(groups); // make sure 'groups' is defined and validconst importantMatchExists = Object.values(groupMatches) .flat() .some(m => m.is_importantlast === "1");setTimeout(() => { if (importantMatchExists) { const currentGroupNumber = group; const currentIndex = groupNumbers.indexOf(currentGroupNumber); const prevGroupNumber = currentIndex > 0 ? groupNumbers[currentIndex - 1] : null; const lastChecked = true;positionMatcheslast(groupMatches, currentGroupNumber, prevGroupNumber, lastChecked); } positionMatches(groupMatches, group); waitForLayoutAndDraw(serialMap, 20); }, 100);continue; } columns.forEach((column, columnIndex) => { groups[group][column].sort((a, b) => parseInt(a.name) - parseInt(b.name)); let roundDiv = $("
                                                                                                                                    ").addClass("round").attr("data-column", column); groupMatches[column] = [];groups[group][column].forEach(match => { const serial = groupSerialCounter++; const matchId = `match-serial-${group}-${serial}`;let matchDiv = $("
                                                                                                                                    ") .addClass("match") .attr("id", matchId) .attr("data-match-index", match.name);let score1 = match.team1_score ?? "-"; let score2 = match.team2_score ?? "-"; //let team1 = match.team_name1 ?? "Team 1"; //let team2 = match.team_name2 ?? "Team 2"; let team1 = match.source_label_team1 && match.source_label_team1.trim() !== "" ? match.source_label_team1 : (match.team_name1 ?? "Team 1"); let team2 = match.source_label_team2 && match.source_label_team2.trim() !== "" ? match.source_label_team2 : (match.team_name2 ?? "Team 2"); let startTime = formatStartDateTime(match.start_date, match.start_time); let location = match.location || "";matchDiv.html(`
                                                                                                                                    ${match.name}
                                                                                                                                    ${startTime}
                                                                                                                                    ${location}
                                                                                                                                    ${team1} ${score1}
                                                                                                                                    ${team2} ${score2}
                                                                                                                                    `);const matchContainer = $("
                                                                                                                                    ").addClass("match-container"); matchContainer.append(matchDiv); roundDiv.append(matchContainer);match.serial = serial; serialMap[`${group}-${serial}`] = { ...match, group, column, serial };groupMatches[column].push(match); });columnsContainer.append(roundDiv); if (columnIndex < columns.length - 1) { columnsContainer.append($("
                                                                                                                                    ").addClass("connector-column")); } });groupDiv.append(columnsContainer); groupScrollWrapper.append(groupDiv);const groupNumbers = Object.keys(groups); // make sure 'groups' is defined and validconst importantMatchExists = Object.values(groupMatches) .flat() .some(m => m.is_importantlast === "1");setTimeout(() => { if (importantMatchExists) { const currentGroupNumber = group; const currentIndex = groupNumbers.indexOf(currentGroupNumber); const prevGroupNumber = currentIndex > 0 ? groupNumbers[currentIndex - 1] : null; const lastChecked = true;positionMatcheslast(groupMatches, currentGroupNumber, prevGroupNumber, lastChecked); }positionMatches(groupMatches, group); waitForLayoutAndDraw(serialMap, 20); }, 100);}bracketDiv.append(groupScrollWrapper);const observer = new MutationObserver(() => { const visible = $(".bracket_wrapper:visible").length > 0; if (visible) { setTimeout(() => { waitForLayoutAndDraw(window._lastSerialMap || {}, 20); }, 100); } });observer.observe(document.body, { childList: true, subtree: true }); window.globalSerialMap = serialMap; } function isElementVisible(el) { if (!el) return false; const style = window.getComputedStyle(el); const rect = el.getBoundingClientRect();return ( style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0' && rect.width > 0 && rect.height > 0 && document.body.contains(el) ); }function positionMatcheslast(groupMatches, group, prevGroupNumber, isLastCheckboxChecked = false) { if (!isLastCheckboxChecked) { // If checkbox not checked, hide and clear SVG just in case const existingSvg = document.getElementById('global-connector-svg'); if (existingSvg) { existingSvg.style.display = 'none'; while (existingSvg.firstChild) existingSvg.removeChild(existingSvg.firstChild); console.log("❌ Checkbox not checked — hiding SVG and clearing lines."); } return; }const prevGroup = document.querySelector(`.group[data-group="${prevGroupNumber}"]`); const currGroup = document.querySelector(`.group[data-group="${group}"]`);let svg = document.getElementById('global-connector-svg'); if (!svg) { svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svg.id = 'global-connector-svg'; svg.style.position = 'absolute'; svg.style.top = '0'; svg.style.left = '0'; svg.style.zIndex = '9999'; svg.style.pointerEvents = 'none'; document.body.appendChild(svg); console.log("📦 Created global SVG container with id='global-connector-svg'"); }// Always update size svg.style.width = document.documentElement.scrollWidth + 'px'; svg.style.height = document.documentElement.scrollHeight + 'px';if (isElementVisible(prevGroup) && isElementVisible(currGroup)) { const prevRect = prevGroup.getBoundingClientRect(); const currRect = currGroup.getBoundingClientRect();const prevPos = { x: prevRect.left + window.scrollX + prevRect.width, y: prevRect.top + window.scrollY + prevRect.height / 2 };const currPos = { x: currRect.left + window.scrollX, y: currRect.top + window.scrollY + currRect.height / 2 };// Clear old lines while (svg.firstChild) { svg.removeChild(svg.firstChild); }// Draw new line const line = document.createElementNS("http://www.w3.org/2000/svg", "line"); line.setAttribute("x1", prevPos.x); line.setAttribute("y1", prevPos.y); line.setAttribute("x2", currPos.x); line.setAttribute("y2", currPos.y); line.setAttribute("stroke", "#999"); line.setAttribute("stroke-width", "2");svg.appendChild(line);svg.style.display = 'block'; // show SVG console.log("✅ Line appended to global SVG and SVG shown"); } else { // No visible groups → clear and hide SVG while (svg.firstChild) { svg.removeChild(svg.firstChild); } svg.style.display = 'none'; console.warn("⚠️ One or both group elements are hidden or missing — hiding SVG"); } }function formatStartDateTime(start_date, start_time) { // Check for null, undefined, or empty values if (!start_date || !start_time || typeof start_time !== 'string' || !start_time.includes(' ')) { return ""; }const timePart = start_time.split(' ')[1]; if (!timePart) return "";const timeObj = new Date(`1970-01-01T${timePart}`); if (isNaN(timeObj.getTime())) { return ""; }// Convert start_date from "YYYY-MM-DD" to "MM/DD/YYYY" const [year, month, day] = start_date.split('-'); if (!year || !month || !day) return "";const formattedDate = `${month}/${day}/${year}`;const timeFormatted = timeObj.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: true, // 24-hour format });return `${formattedDate} ${timeFormatted} EST`; }function positionMatches(groupMatches, group) { const levels = Object.keys(groupMatches).sort((a, b) => +a - +b); const matchCenters = {}; const spacing = 200; let bottomMost = 0; const totalMatches = Object.values(groupMatches).flat().length; const isFiveTeamLayout = totalMatches === 4; const isSixTeamLayout = totalMatches === 5; const isSevenTeamLayout = totalMatches === 6; const isTenTeamLayout = totalMatches === 9; const isNineTeamLayout = totalMatches === 8; const isTwelveTeamLayout = totalMatches === 11;if (isTwelveTeamLayout) { const serialPositions = { 1: 200, // Round 1 2: 400, 3: 600, 4: 800, 5: 100, 6: 300, // Quarterfinals 7: 500, 8: 700, 9: 200, 10: 600, // Semifinal 1 11: 400 // Final };// Position matches Object.keys(serialPositions).forEach((serialStr) => { const serial = parseInt(serialStr); const $match = $(`#match-serial-${group}-${serial}`).closest(".match-container"); if ($match.length) { const y = serialPositions[serial]; $match.css({ position: "absolute", top: `${y}px` }); matchCenters[serial] = y + $match.outerHeight() / 2; bottomMost = Math.max(bottomMost, y + $match.outerHeight()); } });// Draw connector lines (you may need to tweak based on actual match setup) drawConnectorLine(group, 1, 5, 'left', 'bottom'); drawConnectorLine(group, 2, 6, 'left', 'bottom'); drawConnectorLine(group, 3, 7, 'left', 'bottom'); drawConnectorLine(group, 4, 8, 'left', 'bottom'); drawConnectorLine(group, 5, 9, 'right', 'top'); drawConnectorLine(group, 6, 9, 'right', 'bottom'); drawConnectorLine(group, 7, 10, 'right', 'top'); drawConnectorLine(group, 8, 10, 'right', 'bottom'); drawConnectorLine(group, 9, 11, 'right', 'top'); drawConnectorLine(group, 10, 11, 'right', 'bottom'); drawChampionLine(group, 11);$(`.group[data-group="${group}"]`).css("height", `${bottomMost + 250}px`); return; }if (isNineTeamLayout) { const serialPositions = { 1: 200, // Game 1 (Round 1) 2: 100, // Game 2 (Round 2) 3: 300, // Game 3 4: 500, // Game 4 5: 700, // Game 5 6: 200, // Game 6 (Round 3) 7: 600, // Game 7 8: 400 // Game 8 (Final) };[1, 2, 3, 4, 5, 6, 7, 8].forEach((serial) => { const $match = $(`#match-serial-${group}-${serial}`).closest(".match-container"); if ($match.length) { const y = serialPositions[serial]; $match.css({ position: "absolute", top: `${y}px` }); matchCenters[serial] = y + $match.outerHeight() / 2; bottomMost = Math.max(bottomMost, y + $match.outerHeight()); } }); // Draw connector lines based on logical flow drawConnectorLine(group, 1, 2); // Game 1 → Game 2 drawConnectorLine(group, 2, 6); // Game 2 → Game 6 drawConnectorLine(group, 3, 6); // Game 3 → Game 6 drawConnectorLine(group, 4, 7); // Game 4 → Game 7 drawConnectorLine(group, 5, 7); // Game 5 → Game 7 drawConnectorLine(group, 6, 8); // Game 6 → Game 8 drawConnectorLine(group, 7, 8); // Game 7 → Game 8 drawChampionLine(group, 8);bottomMost = 0; [1, 2, 3, 4, 5, 6, 7, 8].forEach((serial) => { const $match = $(`#match-serial-${group}-${serial}`).closest(".match-container"); if ($match.length) { const y = serialPositions[serial]; $match.css({ position: "absolute", top: `${y}px` }); matchCenters[serial] = y + $match.outerHeight() / 2; bottomMost = Math.max(bottomMost, y + $match.outerHeight()); } });// Apply accurate height to container $(`.group[data-group="${group}"]`).css("height", `${bottomMost + 250}px`); return; }// Ten Team Layout if (isTenTeamLayout) { const serialPositions = { 1: 200, 2: 600, 3: 100, 4: 300, 5: 500, 6: 700, 7: 200, 8: 600, 9: 400 };// Loop through matches 1 to 9 to set positions [1, 2, 3, 4, 5, 6, 7, 8, 9].forEach((serial) => { const $match = $(`#match-serial-${group}-${serial}`).closest(".match-container"); if ($match.length) { const y = serialPositions[serial]; $match.css({ position: "absolute", top: `${y}px` }); matchCenters[serial] = y + $match.outerHeight() / 2; bottomMost = Math.max(bottomMost, y + $match.outerHeight()); } });// Draw connector lines for Round 1, 2, and 3 drawConnectorLine(group, 1, 3, 'left', 'bottom'); drawConnectorLine(group, 2, 5, 'left', 'bottom'); drawConnectorLine(group, 3, 7, 'right', 'top'); drawConnectorLine(group, 4, 7, 'right', 'bottom'); drawConnectorLine(group, 5, 8, 'right', 'top'); drawConnectorLine(group, 6, 8, 'right', 'bottom'); drawConnectorLine(group, 7, 9, 'right', 'top'); drawConnectorLine(group, 8, 9, 'right', 'bottom'); drawChampionLine(group, 9);bottomMost = 0; [1, 2, 3, 4, 5, 6, 7, 8, 9].forEach((serial) => { const $match = $(`#match-serial-${group}-${serial}`).closest(".match-container"); if ($match.length) { const y = serialPositions[serial]; $match.css({ position: "absolute", top: `${y}px` }); matchCenters[serial] = y + $match.outerHeight() / 2; bottomMost = Math.max(bottomMost, y + $match.outerHeight()); } }); $(`.group[data-group="${group}"]`).css("height", `${bottomMost + 250}px`); return; } if (isSevenTeamLayout) { const matchCenters = {}; let bottomMost = 0;// More generous vertical spacing between 1 → 2 → 3 (adjusted for more matches) const serialPositions = { 1: 0, // Match 1 at the top 2: 180, // Match 2 below Match 1 3: 400, // Match 3 below Match 2 4: 620, // Match 4 below Match 3 (between 1 & 2) 5: 840, // Match 5 below Match 4 (between 2 & 3) 6: 1060, // Match 6 below Match 5 (between 4 & 5) 7: 1280 // Match 7 at the bottom (below Match 6) };// Position Matches 1–7 (Play-ins) [1, 2, 3, 4, 5, 6, 7].forEach((serial) => { const $match = $(`#match-serial-${group}-${serial}`).closest(".match-container"); if ($match.length) { const y = serialPositions[serial]; $match.css({ position: "absolute", top: `${y}px` }); matchCenters[serial] = y + $match.outerHeight() / 2; bottomMost = Math.max(bottomMost, y + $match.outerHeight()); } }); console.log('Height1'+bottomMost); // Adjust positions for the additional matches if necessary: // Match 4: between 1 & 2 (Positioned earlier in `serialPositions`) const $match4 = $(`#match-serial-${group}-4`).closest(".match-container"); if ($match4.length) { const centerY = (matchCenters[1] + matchCenters[2]) / 2 - $match4.outerHeight() / 2; $match4.css({ position: "absolute", top: `${centerY}px` }); matchCenters[4] = centerY + $match4.outerHeight() / 2; bottomMost = Math.max(bottomMost, centerY + $match4.outerHeight()); }// Match 5: between 2 and 3 — center with slight right offset const $match5 = $(`#match-serial-${group}-5`).closest(".match-container"); if ($match5.length && matchCenters[2] && matchCenters[3]) { const centerY = (matchCenters[2] + matchCenters[3]) / 2 - $match5.outerHeight() / 2; const rightOffset = 40; // slight offset to center horizontally $match5.css({ position: "absolute", top: `${centerY}px` }); matchCenters[5] = centerY + $match5.outerHeight() / 2; bottomMost = Math.max(bottomMost, centerY + $match5.outerHeight()); }// Match 6: between match 4 and 5, centered to the right const $match6 = $(`#match-serial-${group}-6`).closest(".match-container"); if ($match6.length && matchCenters[4] && matchCenters[5]) { const centerY = (matchCenters[4] + matchCenters[5]) / 2 - $match6.outerHeight() / 2; const rightOffset = 60; // adjust as needed for proper placement $match6.css({ position: "absolute", top: `${centerY}px` }); matchCenters[6] = centerY + $match6.outerHeight() / 2; bottomMost = Math.max(bottomMost, centerY + $match6.outerHeight()); }// Match 7: below match 6, at the bottom-most position const $match7 = $(`#match-serial-${group}-7`).closest(".match-container"); if ($match7.length && matchCenters[6]) { const centerY = matchCenters[6] + 180; // 180px down from match 6 $match7.css({ position: "absolute", top: `${centerY}px` }); matchCenters[7] = centerY + $match7.outerHeight() / 2; bottomMost = Math.max(bottomMost, centerY + $match7.outerHeight()); }// Draw connector lines between matches drawConnectorLine(group, 1, 4); drawConnectorLine(group, 2, 5); drawConnectorLine(group, 3, 5); drawConnectorLine(group, 4, 6); drawConnectorLine(group, 5, 6); drawConnectorLine(group, 6, 7); // Adding connector line for Match 7 drawChampionLine(group, 7);// Set container height based on the bottom-most position // Recalculate actual bottom-most point after all matches are positioned bottomMost = 0; [1, 2, 3, 4, 5, 6, 7].forEach((serial) => { const $match = $(`#match-serial-${group}-${serial}`).closest(".match-container"); if ($match.length) { const top = parseFloat($match.css("top")) || 0; const height = $match.outerHeight() || 0; bottomMost = Math.max(bottomMost, top + height); } }); // Apply accurate height to container $(`.group[data-group="${group}"]`).css("height", `${bottomMost + 250}px`); return; } if (isSixTeamLayout) { const serialPositions = { 1: 225, // Game 1 2: 400, // Game 2 3: 100, // Game 3 (Winner G1 vs Team 5) 4: 525, // Game 4 (Winner G2 vs Team 6) 5: 300 // Game 5 (Final) };[1, 2, 3, 4, 5].forEach((serial) => { const $match = $(`#match-serial-${group}-${serial}`).closest(".match-container"); if ($match.length) { const y = serialPositions[serial]; $match.css({ position: "absolute", top: `${y}px` }); matchCenters[serial] = y + $match.outerHeight() / 2; bottomMost = Math.max(bottomMost, y + $match.outerHeight()); } });// Draw correct connector lines //drawConnectorLine(group, 1, 3, 'right', 'top'); //drawConnectorLine(group, 2, 4, 'right', 'bottom'); //drawConnectorLine(group, 3, 5, 'right', 'top'); //drawConnectorLine(group, 4, 5, 'right', 'bottom');// Adjust container height bottomMost = 0; [1, 2, 3, 4, 5].forEach((serial) => { const $match = $(`#match-serial-${group}-${serial}`).closest(".match-container"); if ($match.length) { const top = parseFloat($match.css("top")) || 0; const height = $match.outerHeight() || 0; bottomMost = Math.max(bottomMost, top + height); } }); drawChampionLine(group, 5); $(`.group[data-group="${group}"]`).css("height", `${bottomMost + 250}px`); return; }// Helper function function drawConnectorLine(group, fromSerial, toSerial) { const fromEl = $(`#match-serial-${group}-${fromSerial}`).closest(".match-container"); const toEl = $(`#match-serial-${group}-${toSerial}`).closest(".match-container");if (!fromEl.length || !toEl.length) { console.warn(`Cannot draw line: from ${fromSerial} or to ${toSerial} not found.`); return; }const $group = $(`.group[data-group="${group}"]`); const $svg = $group.find("svg.connector-layer");if (!$svg.length) { console.warn(`Missing SVG layer in group ${group}`); return; }const fromOffset = fromEl.position(); const toOffset = toEl.position();const fromX = fromEl.position().left + fromEl.outerWidth(); const fromY = fromOffset.top + fromEl.outerHeight() / 2; const toX = toEl.position().left; const toY = toOffset.top + toEl.outerHeight() / 2;const line = document.createElementNS("http://www.w3.org/2000/svg", "line"); line.setAttribute("x1", fromX); line.setAttribute("y1", fromY); line.setAttribute("x2", toX); line.setAttribute("y2", toY); line.setAttribute("stroke", "#333"); line.setAttribute("stroke-width", "2");$svg.append(line); }// Positioning for 5-team layout if (isFiveTeamLayout) { const serialPositions = { 1: 200, // First round (Play-in) 3: 80, // Semifinal 1 (top) 2: 320, // Semifinal 2 (bottom) 4: 200 // Final (centered between semi 1 and 2) };Object.entries(groupMatches).forEach(([level, matches]) => { matches.forEach((match) => { const matchId = `match-serial-${group}-${match.serial}`; const $el = $(`#${matchId}`).closest(".match-container");if (!$el.length) return;const y = serialPositions[match.serial] ?? 0; $el.css({ position: "absolute", top: `${y}px` });matchCenters[match.serial] = y + $el.outerHeight() / 2; bottomMost = Math.max(bottomMost, y + $el.outerHeight()); }); }); drawChampionLine(group, 4); $(`.group[data-group="${group}"]`).css("height", bottomMost + 160); return; }// Default layout for other brackets levels.forEach((level, levelIndex) => { const matches = groupMatches[level];matches.forEach((match, i) => { const matchId = `match-serial-${group}-${match.serial}`; const $el = $(`#${matchId}`).closest(".match-container");if (!$el.length) return;if (levelIndex === 0) { const pairIndex = Math.floor(i / 2); const y = i * spacing + pairIndex * 40; $el.css({ position: "absolute", top: `${y}px` }); matchCenters[match.serial] = y + $el.outerHeight() / 2; bottomMost = Math.max(bottomMost, y + $el.outerHeight()); } else { const prevLevel = levels[levelIndex - 1]; const prevMatches = groupMatches[prevLevel]; const prev1 = prevMatches[i * 2]; const prev2 = prevMatches[i * 2 + 1];if (prev1 && prev2) { const center1 = matchCenters[prev1.serial]; const center2 = matchCenters[prev2.serial]; const centerY = (center1 + center2) / 2; const topOffset = centerY - $el.outerHeight() / 2; $el.css({ position: "absolute", top: `${topOffset}px` }); matchCenters[match.serial] = centerY; bottomMost = Math.max(bottomMost, topOffset + $el.outerHeight()); } } }); });$(`.group[data-group="${group}"]`).css("height", bottomMost + 180); const lastLevel = levels[levels.length - 1]; const lastMatch = groupMatches[lastLevel]?.[0]; if (lastMatch) drawChampionLine(group, lastMatch.serial);} function drawChampionLine(group, finalMatchSerial) { console.log(`drawChampionLine called with group=${group}, finalMatchSerial=${finalMatchSerial}`);const finalMatch = $(`#match-serial-${group}-${finalMatchSerial}`).closest(".match-container"); if (!finalMatch.length) { console.warn("Final match element not found"); return; }const $group = $(`.group[data-group="${group}"]`); let $svg = $group.find("svg.connector-layer");if (!$svg.length) { console.warn(`Missing SVG layer in group ${group}, creating one.`); $svg = $(``); $group.append($svg); }const matchOffset = finalMatch.offset(); const svgOffset = $svg.offset();const matchRightX = matchOffset.left - svgOffset.left + finalMatch.outerWidth(); const matchCenterY = matchOffset.top - svgOffset.top + finalMatch.outerHeight() / 2;const $teams = finalMatch.find(".team-row"); let championName = ""; let highScore = -1;$teams.each(function () { const teamName = $(this).find(".team-name").text().trim(); const score = parseInt($(this).find(".score").text().trim(), 10); if (!isNaN(score) && score > highScore) { highScore = score; championName = teamName; } });if (!championName) { console.warn("Could not determine champion team"); return; }const lowerChampionName = championName.toLowerCase(); const skipKeywords = ["winner", "winner of game"]; const shouldSkip = skipKeywords.some(keyword => lowerChampionName.includes(keyword));if (shouldSkip) { console.log(`Skipping champion line: name "${championName}" includes skip keyword.`); return; }console.log(`Champion team: ${championName} with score ${highScore}`);const svgNS = "http://www.w3.org/2000/svg"; const lineLength = 180; const offsetY = 29; // how much to move everything down from matchCenterYconst lineY = matchCenterY + offsetY;// Draw line const line = document.createElementNS(svgNS, "line"); line.setAttribute("x1", matchRightX); line.setAttribute("y1", lineY); line.setAttribute("x2", matchRightX + lineLength); line.setAttribute("y2", lineY); line.setAttribute("stroke", "#ccc"); line.setAttribute("stroke-width", "2"); $svg.append(line);const centerX = matchRightX + lineLength / 2; // Champion name (above the line) const nameText = document.createElementNS(svgNS, "text"); nameText.setAttribute("x", centerX); nameText.setAttribute("y", lineY - 16); // slightly above the line nameText.setAttribute("text-anchor", "middle"); nameText.setAttribute("font-size", "15px"); nameText.setAttribute("font-weight", "bold"); nameText.setAttribute("fill", "#000"); nameText.setAttribute("style", "text-shadow: 1px 1px 2px #ccc;"); nameText.textContent = `🏆 ${championName}`; $svg.append(nameText);// "Champion" label (below the line) const championText = document.createElementNS(svgNS, "text"); championText.setAttribute("x", centerX); championText.setAttribute("y", lineY + 26); // slightly below the line championText.setAttribute("text-anchor", "middle"); championText.setAttribute("font-size", "14px"); championText.setAttribute("font-style", "italic"); championText.setAttribute("fill", "#000"); championText.setAttribute("style", "text-shadow: 1px 1px 1px #eee;"); championText.textContent = "Champion"; $svg.append(championText);console.log("Champion line and labels drawn."); }function debounce(func, delay) { let timeout; return function (...args) { clearTimeout(timeout); timeout = setTimeout(() => func.apply(this, args), delay); }; } function waitForLayoutAndDraw(serialMap, maxTries = 10) { if (window._isDrawingScheduled) return;window._isDrawingScheduled = true; window._lastSerialMap = serialMap;let tries = 0;function tryDraw() { const wrapper = document.querySelector(".bracket_wrapper");if (!wrapper) { if (tries < maxTries) { tries++; requestAnimationFrame(tryDraw); } else { window._isDrawingScheduled = false; // Reset if failed after all tries } return; }const rect = wrapper.getBoundingClientRect(); if (rect.width < 100 || rect.height < 100) { if (tries < maxTries) { tries++; requestAnimationFrame(tryDraw); } else { window._isDrawingScheduled = false; } return; }// ✅ Only draw once per layout session if (!wrapper.dataset.hasDrawn) { drawBracketConnectors(serialMap, true); wrapper.dataset.hasDrawn = "true"; }// 🟢 Reset the flag after a short time (if needed later) setTimeout(() => { window._isDrawingScheduled = false; wrapper.dataset.hasDrawn = ""; // Allow future redraws if needed }, 1000);// 🟢 Add scroll listener once if (!wrapper.dataset.scrollListenerAdded) { console.log("Ketan testing"); wrapper.addEventListener( "scroll", debounce(() => drawBracketConnectors(window._lastSerialMap, true), 100) ); wrapper.dataset.scrollListenerAdded = "true"; } }requestAnimationFrame(tryDraw); }function drawBracketConnectors(serialMap, forceRedraw = false) { console.log("Ketan test"); const svgNS = "http://www.w3.org/2000/svg"; let svg = document.getElementById("bracket-connector-svg"); const wrapper = document.querySelector(".bracket_wrapper");const wrapperRect = wrapper.getBoundingClientRect(); const scrollLeft = wrapper.scrollLeft; const scrollTop = wrapper.scrollTop;if (!svg) { svg = document.createElementNS(svgNS, "svg"); svg.setAttribute("id", "bracket-connector-svg"); svg.style.position = "absolute"; svg.style.top = "0"; svg.style.left = "0"; svg.style.pointerEvents = "none"; wrapper.appendChild(svg); }svg.style.width = wrapper.scrollWidth + "px"; svg.style.height = wrapper.scrollHeight + "px";const layoutHash = JSON.stringify( Object.values(serialMap).map(m => { const el = document.getElementById(`match-serial-${m.group}-${m.serial}`); const rect = el?.getBoundingClientRect(); return { serial: m.serial, group: m.group, column: m.column, rect: rect ? { top: rect.top, left: rect.left, width: rect.width, height: rect.height } : null }; }) );if (!forceRedraw && window._lastLayoutHash === layoutHash) return; window._lastLayoutHash = layoutHash;while (svg.firstChild) svg.removeChild(svg.firstChild);const groupMap = {}; for (const serial in serialMap) { const match = serialMap[serial]; if (!groupMap[match.group]) groupMap[match.group] = []; groupMap[match.group].push(match); }for (const group in groupMap) { const matches = groupMap[group].sort((a, b) => +a.serial - +b.serial); const matchMap = {};matches.forEach(match => { matchMap[match.serial] = match; match.el = document.getElementById(`match-serial-${group}-${match.serial}`); match.rect = match.el?.getBoundingClientRect(); });const isFiveMatch = matches.length === 4; const isThreeTeam = matches.length === 2 && matchMap["1"] && matchMap["2"]; if ( matches.length === 11 && matchMap["1"] && matchMap["2"] && matchMap["3"] && matchMap["4"] && matchMap["5"] && matchMap["6"] && matchMap["7"] && matchMap["8"] && matchMap["9"] && matchMap["10"] && matchMap["11"] ) { const m = matchMap;// Round 1 → Round 2 drawLConnectorCustom(m[1].rect, m[5].rect, "bottom", 40); drawLConnectorCustom(m[2].rect, m[6].rect, "bottom", 40);drawLConnectorCustom(m[3].rect, m[7].rect, "bottom", 40); drawLConnectorCustom(m[4].rect, m[8].rect, "bottom", 40);// Seeds 1-4 with byes go directly to M7–M10 // Assume M5 feeds M7, M6 feeds M8, and so ondrawLConnectorCustom(m[5].rect, m[9].rect, "top", 40); drawLConnectorCustom(m[6].rect, m[9].rect, "bottom", 40);drawLConnectorCustom(m[7].rect, m[10].rect, "top", 40); // adjust if seed logic differs drawLConnectorCustom(m[8].rect, m[10].rect, "bottom", 40);// Round 2 → Semifinal drawLConnectorCustom(m[9].rect, m[11].rect, "top", 40); drawLConnectorCustom(m[10].rect, m[11].rect, "bottom", 40);continue; }if ( matches.length === 9 && matchMap["1"] && matchMap["2"] && matchMap["3"] && matchMap["4"] && matchMap["5"] && matchMap["6"] && matchMap["7"] && matchMap["8"] && matchMap["9"] ) { const m1 = matchMap[1]; const m2 = matchMap[2]; const m3 = matchMap[3]; const m4 = matchMap[4]; const m5 = matchMap[5]; const m6 = matchMap[6]; const m7 = matchMap[7]; const m8 = matchMap[8]; const m9 = matchMap[9];// Round 1 if (m1?.rect && m5?.rect) drawLConnectorCustom(m1.rect, m3.rect, "bottom", 40); if (m2?.rect && m6?.rect) drawLConnectorCustom(m2.rect, m5.rect, "bottom", 40);// Round 2 if (m3?.rect && m7?.rect) drawLConnectorCustom(m3.rect, m7.rect, "top", 40); if (m4?.rect && m7?.rect) drawLConnectorCustom(m4.rect, m7.rect, "bottom", 40); if (m5?.rect && m8?.rect) drawLConnectorCustom(m5.rect, m8.rect, "top", 40); if (m6?.rect && m8?.rect) drawLConnectorCustom(m6.rect, m8.rect, "bottom", 40);// Round 3 (Final) if (m7?.rect && m9?.rect) drawLConnectorCustom(m7.rect, m9.rect, "top", 40); if (m8?.rect && m9?.rect) drawLConnectorCustom(m8.rect, m9.rect, "bottom", 40);continue; } if (matches.length === 5) { // Adjusted for 5 matches console.log("matches.length === 5", matches); // log matches array console.log("matchMap:", matchMap); // log matchMap objectconst m1 = matchMap[1]; const m2 = matchMap[2]; const m3 = matchMap[3]; const m4 = matchMap[4]; const m5 = matchMap[5]; // Remove m6 because it's not available// Round 1 → Round 2 // M1 → M4 (top) if (m1?.rect && m3?.rect) { console.log("Drawing connector for M1 to M3"); drawLConnectorCustom(m1.rect, m3.rect, "top", 40); }// M2 → M5 (top) if (m2?.rect && m4?.rect) { console.log("Drawing connector for M2 to M4"); drawLConnectorCustom(m2.rect, m4.rect, "top", 40); }// M3 → M5 (bottom) if (m3?.rect && m5?.rect) { console.log("Drawing connector for M3 to M5"); drawLConnectorCustom(m3.rect, m5.rect, "bottom", 40); }// Round 2 → Final // M4 → (no M6, adjust logic based on match availability) if (m4?.rect && m5?.rect) { console.log("Drawing connector for M4 to the final match"); // Draw a connector to the final match (if you have a final setup) // You might have a fallback if there's no M6 drawLConnectorCustom(m4.rect,m5.rect, "top", 40); }continue; // use continue, not return — don't break whole function }if (matches.length === 6 && matchMap["1"] && matchMap["2"] && matchMap["3"] && matchMap["4"] && matchMap["5"] && matchMap["6"]) {const m1 = matchMap[1]; const m2 = matchMap[2]; const m3 = matchMap[3]; const m4 = matchMap[4]; const m5 = matchMap[5]; const m6 = matchMap[6];// Round 1 → Round 2 // M1 → M4 (top) if (m1?.rect && m4?.rect) drawLConnectorCustom(m1.rect, m4.rect, "top", 40);// M2 → M5 (top) if (m2?.rect && m5?.rect) drawLConnectorCustom(m2.rect, m5.rect, "top", 40);// M3 → M5 (bottom) if (m3?.rect && m5?.rect) drawLConnectorCustom(m3.rect, m5.rect, "bottom", 40);// Round 2 → Final // M4 → M6 (top) if (m4?.rect && m6?.rect) drawLConnectorCustom(m4.rect, m6.rect, "top", 40);// M5 → M6 (bottom) if (m5?.rect && m6?.rect) drawLConnectorCustom(m5.rect, m6.rect, "bottom", 40);continue; }if (isThreeTeam) { console.log("This is a testing"); const fromMatch = matchMap[1]; const toMatch = matchMap[2];if (fromMatch?.rect && toMatch?.rect) { drawLConnectorCustom(fromMatch.rect, toMatch.rect, "right", 40); }continue; // only skip current group } /*if (matches.length === 5) { const m1 = matchMap[1], m2 = matchMap[2]; const m3 = matchMap[3], m4 = matchMap[4], m5 = matchMap[5];if (m1?.rect && m4?.rect) drawLConnectorCustom(m1.rect, m4.rect, "top", 40); if (m2?.rect && m4?.rect) drawLConnectorCustom(m2.rect, m4.rect, "bottom", 40); if (m3?.rect && m5?.rect) drawLConnectorCustom(m3.rect, m5.rect, "top", 40); if (m4?.rect && m5?.rect) drawLConnectorCustom(m4.rect, m5.rect, "bottom", 40); }*/if (isFiveMatch) { const s1 = matchMap[1], s2 = matchMap[2], s3 = matchMap[3], s4 = matchMap[4];if (s1?.rect && s3?.rect) drawLConnectorCustom(s1.rect, s2.rect, "top"); if (s2?.rect && s4?.rect) drawLConnectorCustom(s2.rect, s4.rect, "top", 40); if (s3?.rect && s4?.rect) drawLConnectorCustom(s3.rect, s4.rect, "bottom", 80);continue; // use continue, not return — don't break whole function }const columns = [...new Set(matches.map(m => +m.column))].sort((a, b) => a - b);for (let colIndex = 1; colIndex < columns.length; colIndex++) { const currentCol = columns[colIndex]; const prevCol = columns[colIndex - 1];const currentMatches = matches.filter(m => +m.column === currentCol); const prevMatches = matches.filter(m => +m.column === prevCol);for (let i = 0; i < currentMatches.length; i++) { const targetMatch = currentMatches[i]; const input1 = prevMatches[i * 2]; const input2 = prevMatches[i * 2 + 1];if (input1?.rect && input2?.rect && targetMatch?.rect) { drawLConnectorCustom(input1.rect, targetMatch.rect, "top", 40); drawLConnectorCustom(input2.rect, targetMatch.rect, "bottom", 40); } else if ((input1?.rect || input2?.rect) && targetMatch?.rect) { const fromRect = input1?.rect || input2?.rect; const direction = input1?.rect ? "top" : "bottom"; drawLConnectorCustom(fromRect, targetMatch.rect, direction, 40); } } }function drawLConnectorCustom(fromRect, toRect, toPoint = "center", elbowOffset = 40) { const startX = fromRect.right - wrapperRect.left + scrollLeft; const startY = fromRect.top + fromRect.height / 2 - wrapperRect.top + scrollTop;let toY; const headerOffset = 48;if (toPoint === "top") { toY = toRect.top + headerOffset + 10 - wrapperRect.top + scrollTop; } else if (toPoint === "bottom") { toY = toRect.bottom - 10 - wrapperRect.top + scrollTop; } else { toY = toRect.top + toRect.height / 2 - wrapperRect.top + scrollTop; }const endX = toRect.left - wrapperRect.left + scrollLeft + 5;const path = document.createElementNS(svgNS, "path"); path.setAttribute("stroke", "#999"); path.setAttribute("stroke-width", "1.5"); path.setAttribute("fill", "none"); path.setAttribute("stroke-linecap", "round");const d = ` M ${startX},${startY} H ${endX} V ${toY} `;path.setAttribute("d", d.trim().replace(/\s+/g, " ")); svg.appendChild(path); }function drawTConnector(fromRect, toRect) { const startX = fromRect.right - wrapperRect.left + scrollLeft; const startY = fromRect.top + fromRect.height / 2 - wrapperRect.top + scrollTop;const endX = toRect.left - wrapperRect.left + scrollLeft; const endY = toRect.top + toRect.height / 2 - wrapperRect.top + scrollTop; const midX = (startX + endX) / 2;const path1 = document.createElementNS(svgNS, "path"); path1.setAttribute("stroke", "#999"); path1.setAttribute("stroke-width", "1.5"); path1.setAttribute("fill", "none"); path1.setAttribute("stroke-linecap", "round"); path1.setAttribute("d", `M ${startX},${startY} H ${midX}`); svg.appendChild(path1);const path2 = document.createElementNS(svgNS, "path"); path2.setAttribute("stroke", "#999"); path2.setAttribute("stroke-width", "1.5"); path2.setAttribute("fill", "none"); path2.setAttribute("stroke-linecap", "round"); path2.setAttribute("d", `M ${endX},${endY} H ${midX}`); svg.appendChild(path2);const verticalLine = document.createElementNS(svgNS, "path"); verticalLine.setAttribute("stroke", "#999"); verticalLine.setAttribute("stroke-width", "1.5"); verticalLine.setAttribute("fill", "none"); verticalLine.setAttribute("stroke-linecap", "round"); verticalLine.setAttribute("d", `M ${midX},${startY} V ${endY}`); svg.appendChild(verticalLine); }function drawHorizontalConnector(fromRect, toRect) { const startX = fromRect.right - wrapperRect.left + scrollLeft; const startY = fromRect.top + fromRect.height / 2 - wrapperRect.top + scrollTop;const endX = toRect.left - wrapperRect.left + scrollLeft;const path = document.createElementNS(svgNS, "path"); path.setAttribute("stroke", "#999"); path.setAttribute("stroke-width", "1.5"); path.setAttribute("fill", "none"); path.setAttribute("stroke-linecap", "round");const d = `M ${startX},${startY} H ${endX}`; path.setAttribute("d", d.trim().replace(/\s+/g, " ")); svg.appendChild(path); }function drawRightThenVertical(fromRect, toRect, align = "top") { const startX = fromRect.right - wrapperRect.left + scrollLeft; const startY = fromRect.top + fromRect.height / 2 - wrapperRect.top + scrollTop; const elbowX = startX + 40;const toY = align === "top" ? toRect.top - wrapperRect.top + scrollTop : toRect.bottom - wrapperRect.top + scrollTop;const toX = toRect.left - wrapperRect.left + scrollLeft;const path = document.createElementNS(svgNS, "path"); path.setAttribute("stroke", "#888"); path.setAttribute("stroke-width", "4"); path.setAttribute("fill", "none"); path.setAttribute("stroke-linejoin", "round"); path.setAttribute("stroke-linecap", "round");const d = ` M ${startX},${startY} H ${elbowX} V ${toY} H ${toX} `; path.setAttribute("d", d.trim().replace(/\s+/g, " ")); svg.appendChild(path); }function drawLine(from, to) { if (!from?.rect || !to?.rect) return;const x1 = from.rect.right + scrollLeft - wrapperRect.left; const y1 = from.rect.top + from.rect.height / 2 + scrollTop - wrapperRect.top;const x2 = to.rect.left + scrollLeft - wrapperRect.left; const y2 = to.rect.top + to.rect.height / 2 + scrollTop - wrapperRect.top;const midX = (x1 + x2) / 2;const path = document.createElementNS(svgNS, "path"); path.setAttribute("stroke", "#999"); path.setAttribute("stroke-width", "2"); path.setAttribute("fill", "none"); path.setAttribute("d", `M ${x1},${y1} H ${midX} V ${y2} H ${x2}`); svg.appendChild(path); }function drawDefaultConnect(input1, input2, targetMatch) { if (!input1?.rect || !input2?.rect || !targetMatch?.rect) return;const x1 = input1.rect.right + scrollLeft - wrapperRect.left; const y1 = input1.rect.top + input1.rect.height / 2 + scrollTop - wrapperRect.top;const x2 = input2.rect.right + scrollLeft - wrapperRect.left; const y2 = input2.rect.top + input2.rect.height / 2 + scrollTop - wrapperRect.top;const toX = targetMatch.rect.left + scrollLeft - wrapperRect.left; const toY = targetMatch.rect.top + targetMatch.rect.height / 2 + scrollTop - wrapperRect.top;const midX = (x1 + toX) / 2; const midY = (y1 + y2) / 2;const path = document.createElementNS(svgNS, "path"); path.setAttribute("stroke", "#999"); path.setAttribute("stroke-width", "2"); path.setAttribute("fill", "none");const d = ` M ${x1},${y1} H ${midX} M ${x2},${y2} H ${midX} M ${midX},${y1} V ${y2} M ${midX},${midY} H ${toX} `; path.setAttribute("d", d.trim().replace(/\s+/g, ' ')); svg.appendChild(path); } } }
                                                                                                                                    ×

                                                                                                                                    Request for More Info