get_col("SELECT DISTINCT season FROM otg_rangers_games ORDER BY season DESC"); // Find the season of the most recently played game $most_recent_season = $wpdb->get_var("SELECT season FROM otg_rangers_games ORDER BY game_date DESC LIMIT 1"); // Fallback if no games are found, though unlikely $default_season = !empty($most_recent_season) ? $most_recent_season : (!empty($available_seasons) ? reset($available_seasons) : ''); $view_side = isset($_GET['view_side']) ? sanitize_text_field($_GET['view_side']) : 'nyr'; $opponent_abbr = isset($_GET['opponent_abbr']) ? sanitize_text_field($_GET['opponent_abbr']) : 'ALL'; $game_type = isset($_GET['game_type']) ? sanitize_text_field($_GET['game_type']) : '2'; // Set both default start and end to the most recent season $season_start = isset($_GET['season_start']) ? sanitize_text_field($_GET['season_start']) : $default_season; $season_end = isset($_GET['season_end']) ? sanitize_text_field($_GET['season_end']) : $default_season; $exclude_empty_net = isset($_GET['exclude_empty_net']) ? (int)$_GET['exclude_empty_net'] : 0; // Modal drill-down parameters $selected_minute = isset($_GET['modal_min']) ? $_GET['modal_min'] : ''; $selected_type = isset($_GET['modal_type']) ? sanitize_text_field($_GET['modal_type']) : ''; // 'normal' or 'en' // Smart Year Validation / Auto-Correction Logic if (!empty($season_start) && !empty($season_end)) { if ($season_start > $season_end) { if (isset($_GET['season_start']) && !isset($_GET['season_end'])) { $season_end = $season_start; } else { $season_start = $season_end; } } } // Fetch Opponent teams active for the selected start season $season_teams_query = $wpdb->prepare(" SELECT DISTINCT st.abbreviation, st.team FROM otg_standings_nhl st JOIN otg_rangers_games g ON st.abbreviation = g.opponent_abbr AND st.season = g.season WHERE g.season = %s ORDER BY st.team ASC ", $season_start); $season_teams = $wpdb->get_results($season_teams_query); // Fetch all teams for the remainder section $all_teams_query = "SELECT DISTINCT abbreviation, team FROM otg_standings_nhl ORDER BY team ASC"; $all_teams = $wpdb->get_results($all_teams_query); if (empty($all_teams)) return 'No standings/team data available.'; $season_team_abbrs = []; foreach ($season_teams as $st) { $season_team_abbrs[] = $st->abbreviation; } // 2. Build Query Conditions for Standard vs Response Views $season_where = ""; if (!empty($season_start) && !empty($season_end)) { $season_where = $wpdb->prepare("AND g.season BETWEEN %s AND %s", $season_start, $season_end); } $response_modes = ['response_for', 'response_against', 'rangers_response', 'opponent_response']; $is_response_mode = in_array($view_side, $response_modes, true); $is_player_period_mode = ($view_side === 'player_period_breakdown'); $game_filter = ""; if ($opponent_abbr !== 'ALL') { $game_filter = $wpdb->prepare("AND g.opponent_abbr = %s", $opponent_abbr); } $goals_query = $wpdb->prepare(" SELECT s.game_id, s.period, s.time_elapsed, s.team_abbr, g.opponent_abbr, s.goal_modifier, g.season, g.game_date FROM otg_rangers_scoring s JOIN otg_rangers_games g ON s.game_id = g.game_id WHERE s.time_elapsed != '00:00' AND g.game_type = %s $season_where $game_filter ORDER BY s.game_id ASC, s.period ASC, CAST(SUBSTRING_INDEX(s.time_elapsed, ':', 1) AS UNSIGNED) ASC, CAST(SUBSTRING_INDEX(s.time_elapsed, ':', -1) AS UNSIGNED) ASC ", $game_type); $all_game_goals = $wpdb->get_results($goals_query); // Group goals by game_id and calculate breakdown arrays (Expanded to 65 buckets to include OT minutes 60-64 for standard view) $max_buckets = $is_response_mode ? 60 : 65; $breakdown_normal = array_fill(0, $max_buckets, 0); $breakdown_en = array_fill(0, $max_buckets, 0); $total_goals_counted = 0; // Track matching items per minute for the modal drill-down popup view $matching_games_by_minute = []; for ($m = 0; $m < $max_buckets; $m++) { $matching_games_by_minute[$m] = ['normal' => [], 'en' => []]; } if ($is_response_mode) { $games_grouped = []; foreach ($all_game_goals as $g_item) { $games_grouped[$g_item->game_id][] = $g_item; } foreach ($games_grouped as $g_id => $g_list) { $count_goals = count($g_list); for ($i = 0; $i < $count_goals - 1; $i++) { $curr = $g_list[$i]; $next = $g_list[$i + 1]; $is_valid_trigger = false; if ($view_side === 'response_for') { if ($curr->team_abbr === 'NYR' && $next->team_abbr === 'NYR') { $is_valid_trigger = true; } } elseif ($view_side === 'response_against') { $is_curr_opp = ($curr->team_abbr !== 'NYR' && ($opponent_abbr === 'ALL' || $curr->team_abbr === $opponent_abbr)); if ($is_curr_opp && $next->team_abbr === $curr->team_abbr) { $is_valid_trigger = true; } } elseif ($view_side === 'rangers_response') { $is_curr_opp = ($curr->team_abbr !== 'NYR' && ($opponent_abbr === 'ALL' || $curr->team_abbr === $opponent_abbr)); if ($is_curr_opp && $next->team_abbr === 'NYR') { $is_valid_trigger = true; } } elseif ($view_side === 'opponent_response') { $is_next_opp = ($next->team_abbr !== 'NYR' && ($opponent_abbr === 'ALL' || $next->team_abbr === $opponent_abbr)); if ($curr->team_abbr === 'NYR' && $is_next_opp) { $is_valid_trigger = true; } } if ($is_valid_trigger) { $next_is_en = isset($next->goal_modifier) && strtolower($next->goal_modifier) === 'empty-net'; if ($exclude_empty_net && $next_is_en) { continue; } $curr_sec = helper_convert_to_seconds($curr->period, $curr->time_elapsed); $next_sec = helper_convert_to_seconds($next->period, $next->time_elapsed); $diff_sec = $next_sec - $curr_sec; if ($diff_sec > 0) { $diff_minutes = floor($diff_sec / 60); if ($diff_minutes >= 0 && $diff_minutes < 60) { $m_idx = (int)$diff_minutes; $type_key = $next_is_en ? 'en' : 'normal'; if ($next_is_en) { $breakdown_en[$m_idx]++; } else { $breakdown_normal[$m_idx]++; } $total_goals_counted++; // Store game meta for modal breakdown $matching_games_by_minute[$m_idx][$type_key][] = [ 'game_id' => $next->game_id, 'season' => $next->season, 'game_date' => $next->game_date, 'opponent_abbr' => $next->opponent_abbr, 'period' => $next->period, 'time_elapsed' => $next->time_elapsed, 'desc' => 'Follow-up goal at P' . $next->period . ' ' . $next->time_elapsed . ' (' . floor($diff_sec / 60) . 'm ' . ($diff_sec % 60) . 's after prior goal)' ]; } } } } } } else { // Standard Minute-by-Minute Mode (Up to 65 Buckets covering Regulation + OT) foreach ($all_game_goals as $goal) { if ($view_side === 'nyr' && $goal->team_abbr !== 'NYR') continue; if ($view_side === 'opp') { if ($opponent_abbr === 'ALL' && $goal->team_abbr === 'NYR') continue; if ($opponent_abbr !== 'ALL' && $goal->team_abbr !== $opponent_abbr) continue; } $goal_is_en = isset($goal->goal_modifier) && strtolower($goal->goal_modifier) === 'empty-net'; if ($exclude_empty_net && $goal_is_en) { continue; } // Calculate absolute minute bucket across periods (Regulations P1-P3 = 0-59, OT P4+ = 60+) $p = (int)$goal->period; $parts = explode(':', $goal->time_elapsed); $min_in_period = isset($parts[0]) ? (int)$parts[0] : 0; $m = -1; if ($p >= 1 && $p <= 3) { $m = (($p - 1) * 20) + $min_in_period; } elseif ($p >= 4) { // Overtime periods (P4 is minute 60+, P5 is 65+, etc.) $m = 60 + (($p - 4) * 5) + min($min_in_period, 4); } if ($m >= 0 && $m < $max_buckets) { $type_key = $goal_is_en ? 'en' : 'normal'; if ($goal_is_en) { $breakdown_en[$m]++; } else { $breakdown_normal[$m]++; } $total_goals_counted++; $matching_games_by_minute[$m][$type_key][] = [ 'game_id' => $goal->game_id, 'season' => $goal->season, 'game_date' => $goal->game_date, 'opponent_abbr' => $goal->opponent_abbr, 'period' => $goal->period, 'time_elapsed' => $goal->time_elapsed, 'desc' => $goal->team_abbr . ' goal at P' . $goal->period . ' ' . $goal->time_elapsed ]; } } } // Combine breakdowns for total scale calculation $breakdown_combined = []; for ($m = 0; $m < $max_buckets; $m++) { $breakdown_combined[$m] = $breakdown_normal[$m] + $breakdown_en[$m]; } $raw_max_goal_count = max($breakdown_combined); if ($raw_max_goal_count < 1) $raw_max_goal_count = 1; $allowed_multiples = [1, 2, 5, 10, 25, 50, 100]; $scale_max = 1; $found_scale = false; $magnitude = 1; while (!$found_scale) { foreach ($allowed_multiples as $mult) { $step = $mult * $magnitude; if ($step * 4 >= $raw_max_goal_count) { $scale_max = $step * 4; $found_scale = true; break; } } $magnitude *= 10; if ($magnitude > 10000) { $scale_max = ceil($raw_max_goal_count / 4) * 4; break; } } $input_style = 'width: 100%; height: 38px; padding: 0 10px; background: #222; border: 1px solid #444; color: #fff; border-radius: 4px; box-sizing: border-box; font-size: 0.9em; line-height: normal;'; // Build base URL query for preserving filters when reopening or passing state $base_query_params = $_GET; unset($base_query_params['modal_min'], $base_query_params['modal_type']); $current_url_clean = strtok($_SERVER["URI"] ?? $_SERVER['REQUEST_URI'], '?'); // 5. Output Layout Wrapper $output = '
'; $header_titles = [ 'nyr' => 'Rangers Goal Timing Breakdown (Minute-by-Minute)', 'opp' => 'Opponent Goal Timing vs Rangers (Minute-by-Minute)', 'response_for' => 'Follow-up Goal: Goals Scored by Rangers Following a Rangers Goal', 'response_against' => 'Follow-up Goal: Goals Scored by Opponents Following an Opponent Goal', 'rangers_response' => 'Rangers Response Goal: Rangers Goal Following an Opponent Goal', 'opponent_response' => 'Opponent Response Goal: Opponent Goal Following a Rangers Goal', 'player_period_breakdown' => 'Rangers Player Scoring Breakdown by Period' ]; $current_title = $header_titles[$view_side] ?? 'Goal Timing Breakdown'; $output .= '
'; $output .= '
' . $current_title . '
'; $query_params_base = '&opponent_abbr='.urlencode($opponent_abbr).'&view_side='.urlencode($view_side).'&season_start='.urlencode($season_start).'&season_end='.urlencode($season_end).'&exclude_empty_net='.$exclude_empty_net; $output .= '
'; $output .= 'Regular Season'; $output .= 'Playoffs'; $output .= '
'; $output .= '
'; // 6. Filter Form $output .= '
'; foreach ($base_query_params as $bk => $bv) { if (!in_array($bk, ['game_type', 'view_side', 'opponent_abbr', 'season_start', 'season_end', 'exclude_empty_net'])) { if (is_array($bv)) { foreach($bv as $bvk => $bvv) { $output .= ''; } } else { $output .= ''; } } } $output .= ''; $output .= ''; $output .= '
'; // View Side Toggle Selector $output .= '
'; $output .= ''; $output .= ''; $output .= '
'; // Opponent Filter $output .= '
'; $output .= ''; $output .= ''; $output .= '
'; // Season Start Filter $output .= '
'; $output .= ''; $output .= ''; $output .= '
'; // Season End Filter $output .= '
'; $output .= ''; $output .= ''; $output .= '
'; // Empty Net Exclusion Toggle Dropdown (Hidden for player breakdown view) if (!$is_player_period_mode) { $output .= '
'; $output .= ''; $output .= ''; $output .= '
'; } // Action Buttons $output .= '
'; $output .= ''; $output .= 'Clear'; $output .= '
'; $output .= '
'; $output .= '
'; // 7. Render Conditional Branch: Player Period Breakdown Report vs Charts if ($is_player_period_mode) { // Query goals specifically for Rangers, mapping player info, grouping by period $player_goals_query = $wpdb->prepare(" SELECT p.id as player_id, s.scorer_name, s.period, COUNT(*) as goal_count FROM otg_rangers_scoring s JOIN otg_rangers_games g ON s.game_id = g.game_id LEFT JOIN otg_players p ON s.scorer_name = p.Name WHERE s.team_abbr = 'NYR' AND s.time_elapsed != '00:00' AND g.game_type = %s $season_where $game_filter GROUP BY s.scorer_name, s.period ORDER BY s.scorer_name ASC, s.period ASC ", $game_type); $raw_player_data = $wpdb->get_results($player_goals_query); // Organize into a structured matrix: player => [period => count] $player_matrix = []; $totals_by_period = [1 => 0, 2 => 0, 3 => 0, 'ot' => 0]; foreach ($raw_player_data as $row) { $name = !empty($row->scorer_name) ? $row->scorer_name : 'Unknown / Unattributed'; $p_id = !empty($row->player_id) ? $row->player_id : ''; $p = (int)$row->period; $p_key = ($p >= 4) ? 'ot' : $p; if (!isset($player_matrix[$name])) { $player_matrix[$name] = [ 'player_id' => $p_id, 1 => 0, 2 => 0, 3 => 0, 'ot' => 0, 'total' => 0 ]; } $player_matrix[$name][$p_key] += (int)$row->goal_count; $player_matrix[$name]['total'] += (int)$row->goal_count; if (empty($player_matrix[$name]['player_id']) && !empty($p_id)) { $player_matrix[$name]['player_id'] = $p_id; } if (isset($totals_by_period[$p_key])) { $totals_by_period[$p_key] += (int)$row->goal_count; } } // Parse sorting parameters for player breakdown table (default to total goals descending) $sort_input = isset($_GET['sort']) ? sanitize_text_field($_GET['sort']) : 'total:desc'; $active_sorts = []; foreach (explode(',', $sort_input) as $sort_pair) { $parts = explode(':', trim($sort_pair)); if (!empty($parts[0])) { $active_sorts[] = [ 'col' => trim($parts[0]), 'dir' => (isset($parts[1]) && strtolower($parts[1]) === 'asc') ? 'asc' : 'desc' ]; } } if (empty($active_sorts)) { $active_sorts[] = ['col' => 'total', 'dir' => 'desc']; } $active_sort_map = []; foreach ($active_sorts as $index => $s_item) { $active_sort_map[$s_item['col']] = [ 'dir' => $s_item['dir'], 'priority' => count($active_sorts) > 1 ? ($index + 1) : null ]; } // Apply Multi-column Sorting to Player Matrix uasort($player_matrix, function($a, $b) use ($active_sorts) { foreach ($active_sorts as $sort) { $col = $sort['col']; $dir = $sort['dir']; $valA = $a[$col] ?? 0; $valB = $b[$col] ?? 0; if ($col === 'player_name') { $cmp = strcasecmp($a['player_name'] ?? '', $b['player_name'] ?? ''); } else { $cmp = ($valA == $valB) ? 0 : (($valA < $valB) ? -1 : 1); } if ($cmp !== 0) { return ($dir === 'asc') ? $cmp : -$cmp; } } return 0; }); $output .= ''; // Hidden sort input to support column clicking for player breakdown report $output .= ''; $output .= '
'; $output .= '
Rangers Player Scoring Breakdown by Period
'; $output .= '
'; $output .= ''; $output .= ''; $output .= ''; $headers_map = [ 'player_name' => 'Player Name', '1' => 'Period 1', '2' => 'Period 2', '3' => 'Period 3', 'ot' => 'Overtime (OT+)', 'total' => 'Total Goals' ]; foreach ($headers_map as $col_key => $col_label) { $is_sorted = isset($active_sort_map[$col_key]); $arrow = ''; $priority_badge = ''; if ($is_sorted) { $arrow = ($active_sort_map[$col_key]['dir'] === 'asc') ? ' ' : ' '; if ($active_sort_map[$col_key]['priority'] !== null) { $priority_badge = ' ' . $active_sort_map[$col_key]['priority'] . ''; } } $th_class = $is_sorted ? 'highlight-col' : ''; $align_style = ($col_key === 'player_name') ? 'text-align: left;' : 'text-align: center;'; $output .= ''; } $output .= ''; $output .= ''; $output .= ''; if (!empty($player_matrix)) { $grand_total = 0; foreach ($player_matrix as $p_name => $counts) { $grand_total += $counts['total']; $output .= ''; // Player Name column with profile link $name_display = esc_html($p_name); if (!empty($counts['player_id'])) { $profile_url = home_url('/profile/?player_id=' . $counts['player_id']); $name_display = '' . esc_html($p_name) . ''; } $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; } // Totals Row $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; } else { $output .= ''; } $output .= ''; $output .= '
'.$col_label.$arrow.$priority_badge.'
' . $name_display . '' . ($counts[1] > 0 ? $counts[1] : '-') . '' . ($counts[2] > 0 ? $counts[2] : '-') . '' . ($counts[3] > 0 ? $counts[3] : '-') . '' . ($counts['ot'] > 0 ? $counts['ot'] : '-') . '' . $counts['total'] . '
Team Totals' . $totals_by_period[1] . '' . $totals_by_period[2] . '' . $totals_by_period[3] . '' . $totals_by_period['ot'] . '' . $grand_total . '
No player scoring records found for the selected filters.
'; $output .= '
'; $output .= '
'; $js_player_sorts = json_encode($active_sorts); $output .= ''; } else { // Summary Count Note for Visual Chart Card $note_label = $is_response_mode ? 'Total Follow-up Goal Intervals Analyzed: ' : 'Total Goals Analyzed (time elapsed > 00:00): '; $output .= '
' . $note_label . '' . $total_goals_counted . ' (Tip: Click any bar or segment to inspect game boxscores)
'; // 8. Render Visual Chart Card $card_title = $is_response_mode ? 'Time Elapsed Following Prior Goal' : 'Minute-by-Minute Period Breakdown'; $output .= ''; $output .= '
'; $output .= '
' . $card_title . ' (Total Count: ' . $total_goals_counted . ')
'; $max_val = (int)$scale_max; $three_quarter_val = (int)round($max_val * 0.75); $mid_val = (int)round($max_val * 0.5); $quarter_val = (int)round($max_val * 0.25); $output .= '
'; // Left Scale Axis $output .= '
'; $output .= '' . $max_val . ''; $output .= '' . $three_quarter_val . ''; $output .= '' . $mid_val . ''; $output .= '' . $quarter_val . ''; $output .= '0'; $output .= '
'; // Main Bar Grid Area $output .= '
'; if (!$is_response_mode) { $p1_pct = (20 / $max_buckets) * 100; $p2_pct = (40 / $max_buckets) * 100; $p3_pct = (60 / $max_buckets) * 100; $output .= '
'; $output .= '
'; if ($max_buckets > 60) { $output .= '
'; } } for ($m = 0; $m < $max_buckets; $m++) { $count_norm = $breakdown_normal[$m]; $count_en = $breakdown_en[$m]; $total_count = $count_norm + $count_en; $height_pct = ($scale_max > 0) ? max(4, round(($total_count / $scale_max) * 100)) : 4; if ($total_count == 0) $height_pct = 3; if (!$is_response_mode && $m >= 60) { $ot_min_num = $m - 60; $time_range_label = sprintf('Overtime (OT %d:%02d-%d:%02d)', $ot_min_num, 0, $ot_min_num, 59); } else { $time_range_label = $is_response_mode ? sprintf('%d-%d min elapsed after goal', $m, $m + 1) : sprintf('%02d:00-%02d:59', $m, $m); } $col_label = ''; if ($is_response_mode) { $col_label = ($m % 5 == 0) ? ($m + 1) : ''; } else { if ($m < 60) { $col_label = $m + 1; } else { $col_label = $m - 60; } } $title_tooltip = $time_range_label . ': ' . $total_count . ' occurrences (Click bar segments to view games)'; if ($count_en > 0) { $title_tooltip .= ' (' . $count_norm . ' regular, ' . $count_en . ' empty-net)'; } $output .= '
'; $output .= '
'; if ($total_count > 0) { $output .= '
' . $total_count . '
'; } else { $output .= '
0
'; } $output .= '
'; if ($count_en > 0) { $en_pct = ($total_count > 0) ? ($count_en / $total_count) * 100 : 0; $en_click_url = add_query_arg(array_merge($base_query_params, [ 'game_type' => $game_type, 'view_side' => $view_side, 'opponent_abbr' => $opponent_abbr, 'season_start' => $season_start, 'season_end' => $season_end, 'exclude_empty_net' => $exclude_empty_net, 'modal_min' => $m, 'modal_type' => 'en' ]), $current_url_clean); $output .= '
'; } if ($count_norm > 0) { $norm_pct = ($total_count > 0) ? ($count_norm / $total_count) * 100 : 0; $norm_click_url = add_query_arg(array_merge($base_query_params, [ 'game_type' => $game_type, 'view_side' => $view_side, 'opponent_abbr' => $opponent_abbr, 'season_start' => $season_start, 'season_end' => $season_end, 'exclude_empty_net' => $exclude_empty_net, 'modal_min' => $m, 'modal_type' => 'normal' ]), $current_url_clean); $output .= '
'; } if ($total_count == 0) { $output .= '
'; } $output .= '
'; $output .= '
'; $output .= '
'; $output .= '' . $col_label . ''; $output .= '
'; $output .= '
'; } $output .= '
'; // Right Scale Axis $output .= '
'; $output .= '' . $max_val . ''; $output .= '' . $three_quarter_val . ''; $output .= '' . $mid_val . ''; $output .= '' . $quarter_val . ''; $output .= '0'; $output .= '
'; $output .= '
'; $output .= '
'; } // 9. Render Modal Popup if selected_minute is active if ($selected_minute !== '' && $selected_type !== '') { $m_idx = (int)$selected_minute; $t_key = ($selected_type === 'en') ? 'en' : 'normal'; $games_in_modal = $matching_games_by_minute[$m_idx][$t_key] ?? []; if (!$is_response_mode && $m_idx >= 60) { $time_title_label = sprintf('Overtime Minute %d', $m_idx - 60); } else { $time_title_label = $is_response_mode ? sprintf('%d-%d Minutes After Prior Goal', $m_idx, $m_idx + 1) : sprintf('%02d:00-%02d:59 Elapsed', $m_idx, $m_idx); } $type_title_label = ($t_key === 'en') ? 'Empty-Net Goals' : 'Regular Goals'; $close_modal_url = add_query_arg($base_query_params, $current_url_clean); $close_modal_url = add_query_arg([ 'game_type' => $game_type, 'view_side' => $view_side, 'opponent_abbr' => $opponent_abbr, 'season_start' => $season_start, 'season_end' => $season_end, 'exclude_empty_net' => $exclude_empty_net ], $close_modal_url); $output .= '
'; $output .= '
'; $output .= '
'; $output .= '
' . $time_title_label . ' (' . $type_title_label . ') - ' . count($games_in_modal) . ' Games Found
'; $output .= '×'; $output .= '
'; $output .= '
'; if (!empty($games_in_modal)) { $output .= ''; $output .= ''; $output .= ''; foreach ($games_in_modal as $gm) { $boxscore_url = home_url('/box/?game_id=' . $gm['game_id']); $date_disp = !empty($gm['game_date']) ? $gm['game_date'] : $gm['season']; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; $output .= ''; } $output .= ''; $output .= '
Season / DateOpponentMatch DetailsAction
' . esc_html($date_disp) . 'vs ' . esc_html($gm['opponent_abbr']) . '' . esc_html($gm['desc']) . 'View Box →
'; } else { $output .= '

No specific games found for this segment.

'; } $output .= '
'; $output .= '
'; $output .= 'Close Window'; $output .= '
'; $output .= '
'; $output .= '
'; $output .= ''; } // JavaScript for View Switching & Smart Year Auto-Correction $output .= ''; $output .= '
'; return $output; } // Helper utility to convert period and MM:SS into absolute elapsed seconds for delta calculation function helper_convert_to_seconds($period, $time_elapsed) { $parts = explode(':', $time_elapsed); $min = isset($parts[0]) ? (int)$parts[0] : 0; $sec = isset($parts[1]) ? (int)$parts[1] : 0; $period_offset_seconds = 0; $p = (int)$period; if ($p === 2) { $period_offset_seconds = 1200; } elseif ($p === 3) { $period_offset_seconds = 2400; } elseif ($p > 3) { $period_offset_seconds = 3600 + (($p - 4) * 300); } return $period_offset_seconds + ($min * 60) + $sec; } GAME 48 PHL @ NYR 7:00 PM MSG/ESPN+ – Where Smit Hits The Fan – OutsideTheGarden Boards
JULY
«
Tue
30
Prospect Camp
Wed
1
Free Agency
Thu
2
Fri
3
Sat
4
Sun
5
Mon
6
»
GAME 48 PHL @ NYR 7...
 
Notifications
Clear all

GAME 48 PHL @ NYR 7:00 PM MSG/ESPN+

Page 1 / 6
 
Doug Glatt
(@pierre_pdare)
Legend

By this time tomorrow we might have two lousy Millers

 

https://stories.nhl.com/games/6791e984f974b47932a99fed.html

 


If they need me to bleed, then I'll bleed for my team

Quote
Topic starter Posted : 23/01/2025 6:55 pm
Rangerjunkiekimmie
(@rangerjunkie)
NHL All Star

That made me throw up a little bit


De Oppresso Liber..
from the left elites

ReplyQuote
Posted : 23/01/2025 7:02 pm
x10003q
(@x10003q)
Legend

Nice start as the Rangers forget about the Flyer speed 0-1


1 Cup in 86 years
2048

ReplyQuote
Posted : 23/01/2025 7:11 pm
Rangerjunkiekimmie
(@rangerjunkie)
NHL All Star

1:21 in down 0-1

It's Miller time


De Oppresso Liber..
from the left elites

ReplyQuote
Posted : 23/01/2025 7:11 pm
Doug Glatt
(@pierre_pdare)
Legend

So the dman plays the pass and does it poorly.. Tippet gets the tip in off his skate


If they need me to bleed, then I'll bleed for my team

ReplyQuote
Topic starter Posted : 23/01/2025 7:12 pm
Doug Glatt
(@pierre_pdare)
Legend

Posted by: @rangerjunkie

1:21 in down 0-1

It's Miller time

Back to business as usual

 


If they need me to bleed, then I'll bleed for my team

ReplyQuote
Topic starter Posted : 23/01/2025 7:12 pm
Doug Glatt
(@pierre_pdare)
Legend

Can we trade for a coach?

 


If they need me to bleed, then I'll bleed for my team

ReplyQuote
Topic starter Posted : 23/01/2025 7:13 pm
x10003q
(@x10003q)
Legend

Igor again holding the puck too long behind the net as the Flyers close in


1 Cup in 86 years
2048

ReplyQuote
Posted : 23/01/2025 7:14 pm
Doug Glatt
(@pierre_pdare)
Legend

Kreider offside again


If they need me to bleed, then I'll bleed for my team

ReplyQuote
Topic starter Posted : 23/01/2025 7:14 pm
Rangerjunkiekimmie
(@rangerjunkie)
NHL All Star

Konechny showing Zib what heart and hustle look like


De Oppresso Liber..
from the left elites

ReplyQuote
Posted : 23/01/2025 7:14 pm
Doug Glatt
(@pierre_pdare)
Legend

Somebody should tell the Rangers that the game started at 7


If they need me to bleed, then I'll bleed for my team

ReplyQuote
Topic starter Posted : 23/01/2025 7:15 pm
Doug Glatt
(@pierre_pdare)
Legend

Geez another defensive fook up


If they need me to bleed, then I'll bleed for my team

ReplyQuote
Topic starter Posted : 23/01/2025 7:16 pm
Doug Glatt
(@pierre_pdare)
Legend

Sam "Rangers doing a good job" WTF is he watching?

 

Lindgren takes a penalty and almost kills Igor


If they need me to bleed, then I'll bleed for my team

ReplyQuote
Topic starter Posted : 23/01/2025 7:18 pm
Rangerjunkiekimmie
(@rangerjunkie)
NHL All Star

Same ol same ol

#Dumpthiscore 


De Oppresso Liber..
from the left elites

ReplyQuote
Posted : 23/01/2025 7:18 pm
Doug Glatt
(@pierre_pdare)
Legend

That was a 3 on 1 Sam


If they need me to bleed, then I'll bleed for my team

ReplyQuote
Topic starter Posted : 23/01/2025 7:19 pm
Page 1 / 6
Share: