Friday, June 13th through Saturday, June 14th, 2025
Price:
9U - $94910U - $94911U - $94912U - $949
Playoffs/Championships:
Sunday, June 15th, 2025
3 Game guarantee, weather permitting.
9U - 12U - First 8 teams registered will gain entry into this tournament.
13U & 14U - First 10 teams registered will gain entry into this tournament.
We will have a waitlist for this tournament but we will have a firm 8 or 10 team division tournament due to the logistics of advancing all teams into a playoff format.
All teams will play two games on Saturday and then are seeded into a playoff format starting on Sunday giving all teams a 3 game minimum. Winners of the playoff games will continue to advance throughout the day Sunday. The final top 2 teams in each division will play for the championship on Sunday evening. Some teams may not qualify for playoffs and will be placed into a consolation bracket for their 3rd game.
9U - 12U Registration Fee: $949.00.
13U & 14U Registration Fee: $1,099.00
Bats: 9U - 14U “Metal Bat” *Please view our tournament rules for age specific bat rules*
Baseballs and lineup cards are included for each team for this event.
Two (2) High School board certified Umpires are supplied for every game.
Preliminary round games will take place at area town, high school and collegiate fields (if available during their season).
Above and Beyond our Competition...Expanded Social Media Coverage included during the entirety of this event. Our digital content team promotes players and teams on our various social media platforms, conducts pre and post game interviews with players and coaches, captures photographs and videos during the event and reports the days activity all on our website! Also included are live in game scores, stats and standings for everyone to follow along on our website and app!
NO GATE FEES EVER! (Savings of $250.00 per team based on competitor's prices)
All teams are subject to play at any time at tournament director's request
Full payment is due on February 1, 2025. Your registration into this tournament is not guaranteed or secured until full payment is received. Teams who have registered and have not paid by February 1, 2025 are subject to being replaced by another fully paid registrant.
To Book Using your Team Block or to Book as an Individual, Not Within a Team Block: Click Here!
Our Hotel Policies
ALL TRAVELING TEAM MANAGERS/CLUB ADMINISTRATORS MUST REVIEW OUR HOTEL POLICY & RULES PRESENTED BELOW. FAILURE TO KNOW OUR POLICY COULD SUBJECT YOUR TEAM TO NON-ACCEPTANCE OR REMOVAL FROM THE TOURNAMENT
To insure the quality of service provided during a Firecracker Sports event this organization has put in a Hotel Obligation Policy.
WHAT IS A “HOTEL OBLIGATION” TOURNAMENT?
Simply stated, if your team requires hotel accommodations (team traveling 75 miles or more to the event’s destination city) your team MUST stay at one of the approved participating tournament partner hotels. Teams are required to designate a representative to block off rooms for the entire team through our hotel portal or staff. These participating hotels are reviewable by clicking on the “hotel” links on the tournament event page or on the main page of Firecracker Sports. We do not have a full “stay to play” policy but we do require 75% of your team/coaches to stay with one of our partner hotels through our website. Reservations should be made ASAP as the hotels fill up quick.
We do have a waiver policy, if teams do NOT want to book through us, but want to participate in our events. Please see below.
WHY DOES THIS TOURNAMENT HAVE A “HOTEL OBLIGATION?”
We work very hard to keep our costs down and also balance the economic impact a tournament like ours can have towards the communities and programs we serve. The approved hotels on this website assist with both concerns and the following are the benefits to our programs:
We only require 75% of your team to stay with one of our hotels. This allows 25% of your team to use points for their stay at another hotel, use Air BNB or camp sites for their travel preferences.
To make it manageable we have room nights “blocked” for our out-of-town teams from our participating tournament partner hotels.
Because we do not use a Third Party Housing Group and we negotiate large blocks of rooms with the hotels directly, you’ll find a wide variety of best pricing and amenities from our hotels.
Care in selecting location and proximity to our playing field. See our “fields/facilities” tab to find out where your team most likely will be playing so you can lock down hotels near your fields.
All of our tournament hotels have been approved due to their quality and desire to give our guests the best event experience.
Room inventory which is shared with the tournament to ensure that room demands can be met from year to year.
SCHEDULES & STANDINGS
June 4 | 12:50pm
Schedules have been posted for this event, and can be found below. At the conclusion of pool play games on Saturday the 14th, all teams will be seeded according to our tiebreakers. Bracket play for Sunday the 15th will be posted early next week if not sooner.
Standings
Team
W
L
T
RA
RS
RD
W%
Date
Time
Game
Division
Location
Team
Score
Team
Notes
Brackets
TOP PERFORMERS
RULES
There is no rules.
WEATHER
Venue Location
`);printWindow.document.close();
});
/*
function gpe_get_schedules_list() {
const event_id = '42114';
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 = '42114';
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);
waitForLayoutAndDrawStable(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 = '42114';// 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 = $("
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");
//window.teamSeedMap = window.teamSeedMap || {};
for (let group of sortedGroups) {
let teamSeedMap = {};
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("match")
.attr("id", matchId)
.attr("data-match-index", match.name);let score1 = match.team1_score ?? "-";
let score2 = match.team2_score ?? "-";
// Seed cache to store first valid seed for each team
//window.teamSeedMap = window.teamSeedMap || {};// Inside your rendering function (e.g. inside a loop for each match)
if (match.team_id1 && !teamSeedMap[match.team_id1] && match.seed1 && match.seed1 !== "0") {
window.teamSeedMap[match.team_id1] = match.seed1;
}
if (match.team_id2 && !teamSeedMap[match.team_id2] && match.seed2 && match.seed2 !== "0") {
teamSeedMap[match.team_id2] = match.seed2;
}// Use stored seed if available; fallback to current if it's valid (not "0")
let seed1 = "";
if (match.team_id1) {
const storedSeed1 = teamSeedMap[match.team_id1];
seed1 = storedSeed1 ? `(${storedSeed1}) ` : (match.seed1 && match.seed1 !== "0" ? `(${match.seed1}) ` : "");
}let seed2 = "";
if (match.team_id2) {
const storedSeed2 = teamSeedMap[match.team_id2];
seed2 = storedSeed2 ? `(${storedSeed2}) ` : (match.seed2 && match.seed2 !== "0" ? `(${match.seed2}) ` : "");
}let team1 = match.team_name1 ?? "Team 1";
let team2 = match.team_name2 ?? "Team 2";// Combine seed and name for display
let displayTeam1 = `${seed1}${team1}`;
let displayTeam2 = `${seed2}${team2}`;let startTime = formatStartDateTime(match.start_date, match.start_time);
let location = match.location || "";matchDiv.html(`
${match.name}
${startTime}
${location}
${displayTeam1}${score1}
${displayTeam2}${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("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 ?? "-";
// Seed cache to store first valid seed for each team
//window.teamSeedMap = window.teamSeedMap || {};// Inside your rendering function (e.g. inside a loop for each match)
if (match.team_id1 && !teamSeedMap[match.team_id1] && match.seed1 && match.seed1 !== "0") {
teamSeedMap[match.team_id1] = match.seed1;
}
if (match.team_id2 && !teamSeedMap[match.team_id2] && match.seed2 && match.seed2 !== "0") {
teamSeedMap[match.team_id2] = match.seed2;
}// Use stored seed if available; fallback to current if it's valid (not "0")
let seed1 = "";
if (match.team_id1) {
const storedSeed1 = teamSeedMap[match.team_id1];
seed1 = storedSeed1 ? `(${storedSeed1}) ` : (match.seed1 && match.seed1 !== "0" ? `(${match.seed1}) ` : "");
}let seed2 = "";
if (match.team_id2) {
const storedSeed2 = teamSeedMap[match.team_id2];
seed2 = storedSeed2 ? `(${storedSeed2}) ` : (match.seed2 && match.seed2 !== "0" ? `(${match.seed2}) ` : "");
}let team1 = match.team_name1 ?? "Team 1";
let team2 = match.team_name2 ?? "Team 2";// Combine seed and name for display
let displayTeam1 = `${seed1}${team1}`;
let displayTeam2 = `${seed2}${team2}`;let startTime = formatStartDateTime(match.start_date, match.start_time);
let location = match.location || "";matchDiv.html(`
${match.name}
${startTime}
${location}
${displayTeam1}${score1}
${displayTeam2}${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($("