TM Opponent Scouting

Trophy Manager: Show match events for the last 5 games of next opponent. with adaptations from TMVN Match Event (Xpand Club_Id: 4423730) and TM League Match History (Irreal Madrid FC. Club ID: 4402745)

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         TM Opponent Scouting
// @version      2.0
// @description  Trophy Manager: Show match events for the last 5 games of next opponent. with adaptations from TMVN Match Event (Xpand Club_Id: 4423730) and TM League Match History (Irreal Madrid FC. Club ID: 4402745)
// @author       Scunny Club ID: 4464490
// @namespace    https://trophymanager.com
// @include      https://trophymanager.com/home/
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    console.log('TM Last Five Match Reports Enhanced script starting...');

    // Configuration
    const LAST_MATCHES = 5;
    const REFRESH_INTERVAL = 2000;

    // Constants
    const LEAGUE = 1;
    const COUNTRY = 2;
    const DIVISION = 3;
    const GROUP = 4;
    const FIXTURES = '/ajax/fixtures.ajax.php';

    // Event types and mappings
    const MENTALITY_MAP = new Map()
        .set("1", "Very Defensive")
        .set("2", "Defensive")
        .set("3", "Slightly Defensive")
        .set("4", "Normal")
        .set("5", "Slightly Attacking")
        .set("6", "Attacking")
        .set("7", "Very Attacking");

    const STYLE_MAP = new Map()
        .set("1", "Balanced")
        .set("2", "Direct")
        .set("3", "Wings")
        .set("4", "Shortpassing")
        .set("5", "Long Balls")
        .set("6", "Through Balls");

    const GOAL_STYLE_MAP = new Map()
        .set("p_s", "Penalty")
        .set("kco", "GK Counter")
        .set("klo", "GK Kick")
        .set("doe", "Corner")
        .set("cou", "Counter/Direct")
        .set("dir", "Freekick")
        .set("win", "Wing Attack")
        .set("sho", "Short Pass")
        .set("lon", "Long Ball")
        .set("thr", "Through Ball");

    const FOCUS_MAP = new Map()
        .set("1", "Balanced")
        .set("2", "Left")
        .set("3", "Center")
        .set("4", "Right");

    const EVENT_TYPE = {
        GOAL: 'goal',
        YELLOW_CARD: 'yellow',
        RED_CARD: 'red',
        MENTALITY: 'mentality',
        STYLE: 'style',
        POSITION: 'position',
        SUBSTITUTION: 'substitution',
        INJURY: 'injury'
    };

    let matchReports = [];
    let processedMatches = 0;
    let totalMatches = 0;

    // Add status indicator
    function addStatusIndicator(message) {
        let statusDiv = document.getElementById('tm-reports-status');
        if (!statusDiv) {
            statusDiv = document.createElement('div');
            statusDiv.id = 'tm-reports-status';
            statusDiv.style.cssText = 'position: fixed; top: 10px; right: 10px; background: #333; color: white; padding: 10px; border-radius: 5px; z-index: 9999; font-size: 12px;';
            document.body.appendChild(statusDiv);
        }
        statusDiv.textContent = message;
        console.log('Status: ' + message);
    }

    // Get current team info from SESSION data
    function getCurrentTeamInfo() {
        try {
            // SESSION data is available globally on Trophy Manager pages
            if (typeof SESSION !== 'undefined') {
                return {
                    id: SESSION.id || SESSION.main_id,
                    name: SESSION.clubname
                };
            }
        } catch (e) {
            console.error('Error accessing SESSION data:', e);
        }
        return null;
    }

    // Search for fixture/opponent and return OPPONENT team name (excluding current team)
    function getOpponentId() {
        const currentTeam = getCurrentTeamInfo();
        if (!currentTeam) {
            console.error('Could not identify current team from SESSION data');
            return null;
        }

        console.log('Current team:', currentTeam.name, '(ID:', currentTeam.id + ')');

        const fixtureElements = document.querySelectorAll('[class*="fixture"], [class*="opponent"], [class*="match"], [class*="next"]');

        for (let el of fixtureElements) {
            const clubLinks = el.querySelectorAll('a[href*="/club/"]');
            for (let clubLink of clubLinks) {
                const match = clubLink.href.match(/\/club\/(\d+)/);
                if (match) {
                    const teamId = match[1];
                    const teamName = clubLink.textContent.trim();

                    // Skip if this is the current team
                    if (teamId === currentTeam.id.toString() || teamName === currentTeam.name) {
                        console.log('Skipping current team:', teamName);
                        continue;
                    }

                    // This must be the opponent
                    console.log('Found opponent Club ID:', teamId, 'Name:', teamName);
                    return teamName;
                }
            }
        }

        console.error('Could not find opponent team name');
        return null;
    }

    // Get league fixtures URL. fetches league URL from fixtures page.
    async function getLeagueUrlFromAnotherPage() {
        // Try to automatically find the league URL from the current page
        let targetUrl = null;

        // Look for the league link in the event div
        const leagueLink = document.querySelector('.event a[href*="/league/"]');
        if (leagueLink) {
            const leaguePath = leagueLink.getAttribute('href');
            // Convert /league/en/3/12/ to /fixtures/league/en/3/12/
            targetUrl = 'https://trophymanager.com/fixtures' + leaguePath;
            console.log('Found league URL automatically:', targetUrl);
        } else {
            // Fallback to hardcoded URL if not found
            targetUrl = 'https://trophymanager.com/fixtures/league/en/3/12/'; // edit this league link if not auto found.
            console.log('Could not find league link, using fallback URL:', targetUrl);
        }

        try {
            const response = await fetch(targetUrl);
            if (!response.ok) {
                console.error('Failed to fetch target page:', response.statusText);
                return null;
            }
            const html = await response.text();

            // Create a temporary DOM element to parse the HTML
            const tempDiv = document.createElement('div');
            tempDiv.innerHTML = html;

            // Find the calendar link within the fetched HTML
            const calendarLink = tempDiv.querySelector('.content_menu .calendar');

            if (calendarLink) {
                const href = calendarLink.getAttribute('href');
                if (href) {
                    // Now you have the href, split and process it as before
                    let urlParts = href.split('/').filter(el => el.length > 0);
                    console.log('Extracted URL parts from fetched page:', urlParts);
                    return urlParts;
                } else {
                    console.error('Calendar link found, but href attribute is missing.');
                    return null;
                }
            } else {
                console.error('Could not find .content_menu .calendar element on the fetched page.');
                return null;
            }

        } catch (error) {
            console.error('Error fetching or processing target page:', error);
            return null;
        }
    }

    // Example of how you might use this
    (async function() {
        const UrlParts = await getLeagueUrlFromAnotherPage();
        if (UrlParts) {
            // Proceed with your logic using leagueUrlParts
            var postobj = {
                'type': UrlParts[LEAGUE],
                'var1': UrlParts[COUNTRY],
                'var2': UrlParts.length > (DIVISION) ? UrlParts[DIVISION] : '',
                'var3': UrlParts.length > (GROUP) ? UrlParts[GROUP] : ''
            };
            console.log('Post object:', postobj);

            // Make your $.post request here using postobj
            $.post(FIXTURES, postobj, function(data) {
                if (data != null) {
                    applyResults(data);
                }
            }, 'json');

        } else {
            console.error('Could not get league URL. Cannot fetch fixtures.');
        }
    })();

    function applyResults(data) {
        let fixtures = filterFixtures(data);
    }

    // Filter fixtures to get completed matches only
    function filterFixtures(data) {
        let months = [];
        let matches = [];
        for (const key in data) {
            if (data.hasOwnProperty(key)) {
                months.push(data[key]);
            }
        }
        for (let index = 0; index < months.length; index++) {
            const thisMonth = months[index];
            matches = matches.concat(thisMonth.matches.filter(function testUnPlayed(match) {
                return match.result != null;
            }));
        }
        return matches;
    }

    // Get team's last matches
    function getTeamMatches(matches, teamName) {
        console.log('Looking for matches for team: ' + teamName);
        let teamMatches = [];

        for (let index = matches.length - 1; index >= 0 && teamMatches.length < LAST_MATCHES; index--) {
            const match = matches[index];

            // Handle both exact match and partial match (in case team name format differs)(partial removed.040925)
            const homeMatch = match.hometeam_name === teamName; //|| match.hometeam_name.includes(teamName.split(' ')[0]);
            const awayMatch = match.awayteam_name === teamName; //|| match.awayteam_name.includes(teamName.split(' ')[0]);

            if (homeMatch || awayMatch) {
                let matchLink = '';
                try {
                    if (typeof $ !== 'undefined') {
                        matchLink = $(match.match_link).attr('href') || match.match_link;
                    } else {
                        // Parse match link without jQuery
                        const tempDiv = document.createElement('div');
                        tempDiv.innerHTML = match.match_link;
                        const linkElement = tempDiv.querySelector('a');
                        matchLink = linkElement ? linkElement.href : match.match_link;
                    }
                } catch (e) {
                    console.error('Error getting match link:', e);
                    continue;
                }

                let matchData = {
                    date: match.date,
                    homeTeam: match.hometeam_name,
                    awayTeam: match.awayteam_name,
                    result: match.result,
                    matchLink: matchLink
                };
                teamMatches.unshift(matchData);
                console.log('Added match: ' + match.hometeam_name + ' vs ' + match.awayteam_name);
            }
        }
        console.log('Found ' + teamMatches.length + ' team matches');
        return teamMatches;
    }

    // Process match events and return filtered events for a specific team
    function processMatchEvents(matchData, targetTeamName) {
        const report = matchData.report;
        if (Object.keys(report).length <= 3) {
            return []; // No match data available
        }

        const homeClubName = matchData.club.home.club_name;
        const awayClubName = matchData.club.away.club_name;
        const homeClubId = matchData.club.home.id;
        const awayClubId = matchData.club.away.id;

        // Determine if target team is home or away - with debugging
        console.log('Team comparison - Target:', targetTeamName);
        console.log('Home club name:', homeClubName);
        console.log('Away club name:', awayClubName);
        
        const isTargetHome = homeClubName === targetTeamName;
        const isTargetAway = awayClubName === targetTeamName;
        
        console.log('Is target home?', isTargetHome, 'Is target away?', isTargetAway);
        
        if (!isTargetHome && !isTargetAway) {
            console.log('Target team not found in match:', targetTeamName, 'vs', homeClubName, '&', awayClubName);
            return [];
        }

        const homeLineup = matchData.lineup.home;
        const awayLineup = matchData.lineup.away;
        const homePlayerIds = Object.getOwnPropertyNames(homeLineup);
        const awayPlayerIds = Object.getOwnPropertyNames(awayLineup);
        
        const homePlayer = new Map();
        const awayPlayer = new Map();
        
        homePlayerIds.forEach((playerId) => {
            homePlayer.set(playerId, homeLineup[playerId].name);
        });
        awayPlayerIds.forEach((playerId) => {
            awayPlayer.set(playerId, awayLineup[playerId].name);
        });

        let eventReport = [];
        
        // Add starting tactics info for target team only
        if (isTargetHome) {
            const homeStartStyle = matchData.match_data.attacking_style.home === "0" ? "1" : matchData.match_data.attacking_style.home;
            const homeStartMentality = matchData.match_data.mentality.home.toString();
            const homeFocus = matchData.match_data.focus_side.home;
            
            eventReport.push({
                minute: "0",
                type: "tactics",
                content: `Starting - Mentality: ${MENTALITY_MAP.get(homeStartMentality)}, Style: ${STYLE_MAP.get(homeStartStyle)}, Focus: ${FOCUS_MAP.get(homeFocus)}`
            });
        } else if (isTargetAway) {
            const awayStartStyle = matchData.match_data.attacking_style.away === "0" ? "1" : matchData.match_data.attacking_style.away;
            const awayStartMentality = matchData.match_data.mentality.away.toString();
            const awayFocus = matchData.match_data.focus_side.away;
            
            eventReport.push({
                minute: "0",
                type: "tactics",
                content: `Starting - Mentality: ${MENTALITY_MAP.get(awayStartMentality)}, Style: ${STYLE_MAP.get(awayStartStyle)}, Focus: ${FOCUS_MAP.get(awayFocus)}`
            });
        }

        // Process all match events
        Object.keys(report).forEach(function (minute) {
            const minuteArr = report[minute];
            for (let i = 0; i < minuteArr.length; i++) {
                const paramArr = minuteArr[i].parameters;
                if (paramArr) {
                    for (let j = 0; j < paramArr.length; j++) {
                        const paramObj = paramArr[j];
                        
                        // Goals
                        if (paramObj.goal) {
                            const isTargetTeamGoal = (isTargetHome && homePlayer.has(paramObj.goal.player)) || 
                                                     (isTargetAway && awayPlayer.has(paramObj.goal.player));
                            
                            if (isTargetTeamGoal) {
                                let goalStyle = "";
                                let chanceType = minuteArr[i].type;
                                if (chanceType) {
                                    chanceType = chanceType.substring(0, 3);
                                    if (GOAL_STYLE_MAP.has(chanceType)) {
                                        goalStyle = GOAL_STYLE_MAP.get(chanceType);
                                    }
                                }
                                
                                const playerMap = isTargetHome ? homePlayer : awayPlayer;
                                const scorer = playerMap.get(paramObj.goal.player);
                                const assister = paramObj.goal.assist ? playerMap.get(paramObj.goal.assist) : null;
                                
                                eventReport.push({
                                    minute: minute,
                                    type: "goal",
                                    content: `[Goal] ${scorer}${assister ? ` (${assister})` : ""} ${goalStyle ? `[${goalStyle}]` : ""} ${paramObj.goal.score[0]} - ${paramObj.goal.score[1]}`
                                });
                            }
                        }
                        
                        // Yellow cards
                        else if (paramObj.yellow) {
                            const isTargetTeamCard = (isTargetHome && homePlayer.has(paramObj.yellow)) || 
                                                     (isTargetAway && awayPlayer.has(paramObj.yellow));
                            
                            if (isTargetTeamCard) {
                                const playerMap = isTargetHome ? homePlayer : awayPlayer;
                                eventReport.push({
                                    minute: minute,
                                    type: "yellow",
                                    content: `[Yellow card] ${playerMap.get(paramObj.yellow)}`
                                });
                            }
                        }
                        
                        // Red cards
                        else if (paramObj.red) {
                            const isTargetTeamCard = (isTargetHome && homePlayer.has(paramObj.red)) || 
                                                     (isTargetAway && awayPlayer.has(paramObj.red));
                            
                            if (isTargetTeamCard) {
                                const playerMap = isTargetHome ? homePlayer : awayPlayer;
                                eventReport.push({
                                    minute: minute,
                                    type: "red",
                                    content: `[Red card] ${playerMap.get(paramObj.red)}`
                                });
                            }
                        }
                        
                        // Double yellow = red
                        else if (paramObj.yellow_red) {
                            const isTargetTeamCard = (isTargetHome && homePlayer.has(paramObj.yellow_red)) || 
                                                     (isTargetAway && awayPlayer.has(paramObj.yellow_red));
                            
                            if (isTargetTeamCard) {
                                const playerMap = isTargetHome ? homePlayer : awayPlayer;
                                eventReport.push({
                                    minute: minute,
                                    type: "red",
                                    content: `[Red card] (2 yellow cards) ${playerMap.get(paramObj.yellow_red)}`
                                });
                            }
                        }
                        
                        // Tactical changes
                        else if (paramObj.mentality_change) {
                            const targetClubId = isTargetHome ? homeClubId : awayClubId;
                            
                            if (paramObj.mentality_change.team == targetClubId) {
                                if (paramObj.mentality_change.mentality) {
                                    eventReport.push({
                                        minute: minute,
                                        type: "mentality",
                                        content: `[Tactics] Mentality change to ${MENTALITY_MAP.get(paramObj.mentality_change.mentality)}`
                                    });
                                } else if (paramObj.mentality_change.style) {
                                    eventReport.push({
                                        minute: minute,
                                        type: "style",
                                        content: `[Tactics] Attacking style change to ${STYLE_MAP.get(paramObj.mentality_change.style)}`
                                    });
                                }
                            }
                        }
                        
                        // Position changes
                        else if (paramObj.player_change) {
                            const isTargetTeamChange = (isTargetHome && homePlayer.has(paramObj.player_change.player)) || 
                                                       (isTargetAway && awayPlayer.has(paramObj.player_change.player));
                            
                            if (isTargetTeamChange) {
                                const playerMap = isTargetHome ? homePlayer : awayPlayer;
                                eventReport.push({
                                    minute: minute,
                                    type: "position",
                                    content: `[Position] ${playerMap.get(paramObj.player_change.player)} change to ${paramObj.player_change.position ? paramObj.player_change.position.toUpperCase() : ""}`
                                });
                            }
                        }
                        
                        // Substitutions
                        else if (paramObj.sub && paramObj.sub.player_in && paramObj.sub.player_out) {
                            const isTargetTeamSub = (isTargetHome && homePlayer.has(paramObj.sub.player_in)) || 
                                                    (isTargetAway && awayPlayer.has(paramObj.sub.player_in));
                            
                            if (isTargetTeamSub) {
                                const playerMap = isTargetHome ? homePlayer : awayPlayer;
                                eventReport.push({
                                    minute: minute,
                                    type: "substitution",
                                    content: `[Substitution] ${playerMap.get(paramObj.sub.player_in)} replace ${playerMap.get(paramObj.sub.player_out)}${paramObj.sub.player_position ? ` and play ${paramObj.sub.player_position.toUpperCase()}` : ""}`
                                });
                            }
                        }
                        
                        // Injuries
                        else if (paramObj.injury) {
                            const isTargetTeamInjury = (isTargetHome && homePlayer.has(paramObj.injury)) || 
                                                       (isTargetAway && awayPlayer.has(paramObj.injury));
                            
                            if (isTargetTeamInjury) {
                                const playerMap = isTargetHome ? homePlayer : awayPlayer;
                                eventReport.push({
                                    minute: minute,
                                    type: "injury",
                                    content: `[Injury] ${playerMap.get(paramObj.injury)}`
                                });
                            }
                        }
                    }
                }
            }
        });

        return eventReport;
    }

    // Enhanced display function with dropdown functionality
    function displayEnhancedMatchList(matches, opponentTeamName) {
        let html = '<div id="tm-match-reports" style="margin: 1px 0; padding: 1px; border: 2px solid #333; background: #333333;">';
        html += '<h2 style="text-align: center; color: #ffffff; margin: 5px; margin-bottom: 8px; font-size: 16px;">Next Opponent Last ' + matches.length + ' Matches</h2>';

        matches.forEach((match, index) => {
            const matchId = `match-${index}`;
            const dropdownId = `dropdown-${index}`;
            
            html += '<div style="margin: 2px 0; padding: 1px; border: 1px solid #ccc; background: #008000; border-radius: 1px; font-size: 14px; line-height: 14px;">';
            
            // Match header with dropdown button
            html += '<div style="display: flex; justify-content: space-between; align-items: center; padding: 5px;">';
            html += '<div>';
            html += '<p style="margin: 0; padding-bottom: 5px;">M ' + (index + 1) + ': ' + match.homeTeam + ' ' + match.result + ' ' + match.awayTeam + '</p>';
            html += '<p style="margin: 0; padding-bottom: 5px; font-size: 12px;">Date: ' + match.date + ' | <a href="' + match.matchLink + '" target="_blank">View Match</a></p>';
            html += '</div>';
            
        // Dropdown toggle button
        html += '<button onclick="toggleMatchEvents(\'' + matchId + '\', \'' + dropdownId + '\', \'' + match.matchLink + '\', \'' + opponentTeamName.replace(/'/g, "\\'") + '\')" ';
        html += 'style="background: #006600; color: white; border: 1px solid #004400; padding: 8px 12px; border-radius: 3px; cursor: pointer; font-size: 11px; line-height: 1.2; text-align: center; min-width: 50px;">';
        html += '<div>Show</div><div>Events</div></button>';
            html += '</div>';
            
            // Dropdown content area (initially hidden)
            html += '<div id="' + dropdownId + '" style="display: none; padding: 10px; background: #004d00; border-top: 1px solid #ccc; margin-top: 5px;">';
            html += '<div id="' + dropdownId + '-content">Click "Show Events" to load match details...</div>';
            html += '</div>';
            
            html += '</div>';
        });

        html += '</div>';

        // Insert the enhanced HTML
        const targetElement = document.querySelector('.column2_a .box_footer');
        if (targetElement) {
            targetElement.insertAdjacentHTML('beforebegin', html);
            console.log('Inserted enhanced match list with dropdowns');
        } else {
            console.error('Could not find the target element to insert before');
        }
    }

    // Function to toggle dropdown and load match events
    function toggleMatchEvents(matchId, dropdownId, matchUrl, opponentTeamName) {
        const dropdown = document.getElementById(dropdownId);
        const button = event.target.closest('button'); // Get the button element even if clicked on inner div
        
        if (dropdown.style.display === 'none') {
            // Show dropdown and load events
            dropdown.style.display = 'block';
            button.innerHTML = '<div>Hide</div><div>Events</div>';
            
            const contentDiv = document.getElementById(dropdownId + '-content');
            contentDiv.innerHTML = '<div style="color: yellow;">Loading match events...</div>';
            
            // Load match events
            loadMatchEvents(matchUrl, opponentTeamName, contentDiv);
            
        } else {
            // Hide dropdown
            dropdown.style.display = 'none';
            button.innerHTML = '<div>Show</div><div>Events</div>';
        }
    }

    // Function to load and display match events
    function loadMatchEvents(matchUrl, opponentTeamName, contentDiv) {
        // Extract match ID from URL - fix the extraction logic
        const urlParts = matchUrl.split('/');
        let matchId = '';
        
        // Handle different URL formats
        if (matchUrl.includes('/nt/')) {
            // National team match format
            matchId = 'nt' + urlParts[urlParts.length - 2];
        } else {
            // Regular match format: https://trophymanager.com/matches/170827356/
            for (let i = urlParts.length - 1; i >= 0; i--) {
                if (urlParts[i] && !isNaN(urlParts[i])) {
                    matchId = urlParts[i];
                    break;
                }
            }
        }
        
        console.log('Extracted match ID:', matchId, 'from URL:', matchUrl);
        const ajaxUrl = 'https://trophymanager.com/ajax/match.ajax.php?id=' + matchId;
        
        const xhr = new XMLHttpRequest();
        xhr.open('GET', ajaxUrl, true);
        xhr.onreadystatechange = function () {
            if (this.readyState == 4 && this.status == 200) {
                try {
                    const data = JSON.parse(this.responseText);
                    const events = processMatchEvents(data, opponentTeamName);
                    displayMatchEvents(events, contentDiv);
                } catch (e) {
                    console.error('Error parsing match data:', e);
                    contentDiv.innerHTML = '<div style="color: red;">Error loading match data</div>';
                }
            } else if (this.readyState == 4) {
                contentDiv.innerHTML = '<div style="color: red;">Failed to load match data (Status: ' + this.status + ')</div>';
            }
        };
        xhr.send();
    }

    // Function to display formatted match events
    function displayMatchEvents(events, contentDiv) {
        if (events.length === 0) {
            contentDiv.innerHTML = '<div style="color: #cccccc;">No events found for this team in this match.</div>';
            return;
        }
        
        let html = '<div style="color: white; font-size: 13px;">';
        
        events.forEach((event, index) => {
            let color = '#ffffff';
            switch (event.type) {
                case 'goal':
                    color = '#00ffff'; // Cyan
                    break;
                case 'yellow':
                    color = '#ffff00'; // Yellow
                    break;
                case 'red':
                    color = '#ff4444'; // Red
                    break;
                case 'mentality':
                    color = '#ff9900'; // Orange
                    break;
                case 'style':
                    color = '#6666ff'; // Blue
                    break;
                case 'position':
                    color = '#99ff99'; // Light green
                    break;
                case 'substitution':
                    color = '#ff99ff'; // Pink
                    break;
                case 'injury':
                    color = '#996633'; // Brown
                    break;
                case 'tactics':
                    color = '#ffcc99'; // Light orange
                    break;
            }
            
            html += '<div style="color: ' + color + '; margin: 3px 0; padding: 2px;">';
            html += event.minute + "': " + event.content;
            html += '</div>';
        });
        
        html += '</div>';
        contentDiv.innerHTML = html;
    }

    // Make functions available globally
    window.toggleMatchEvents = toggleMatchEvents;
    window.loadMatchEvents = loadMatchEvents;
    window.displayMatchEvents = displayMatchEvents;

    // Main function to get match history
    async function generateMatchReports() {
        addStatusIndicator('Starting match report generation...');

        const currentTeam = getOpponentId();
        if (!currentTeam) {
            addStatusIndicator('Error: Could not find team name');
            return;
        }

        addStatusIndicator('Found team: ' + currentTeam);

        const url = await getLeagueUrlFromAnotherPage();
        if (!url) {
            addStatusIndicator('Error: Could not find league URL');
            return;
        }

        if (url.length < 3) {
            console.error('Invalid league URL structure');
            addStatusIndicator('Error: Invalid league URL');
            return;
        }

        addStatusIndicator('Fetching fixtures...');

        // Use jQuery if available, otherwise use vanilla JS
        const requestData = {
            'type': url[LEAGUE],
            'var1': url[COUNTRY],
            'var2': url.length > DIVISION ? url[DIVISION] : '',
            'var3': url.length > GROUP ? url[GROUP] : ''
        };

        if (typeof $ !== 'undefined') {
            // Use jQuery
            $.post(FIXTURES, requestData, function(data) {
                handleFixturesResponse(data, currentTeam);
            }, 'json').fail(function(xhr, status, error) {
                console.error('AJAX request failed:', status, error);
                addStatusIndicator('Error: Failed to fetch fixtures');
            });
        } else {
            // Use vanilla JS
            const xhr = new XMLHttpRequest();
            xhr.open('POST', FIXTURES, true);
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

            const formData = Object.keys(requestData)
                .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(requestData[key]))
                .join('&');

            xhr.onreadystatechange = function() {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        try {
                            const data = JSON.parse(xhr.responseText);
                            handleFixturesResponse(data, currentTeam);
                        } catch (e) {
                            console.error('Error parsing JSON:', e);
                            addStatusIndicator('Error: Invalid response data');
                        }
                    } else {
                        console.error('Request failed with status:', xhr.status);
                        addStatusIndicator('Error: Failed to fetch fixtures');
                    }
                }
            };

            xhr.send(formData);
        }
    }

    function handleFixturesResponse(data, currentTeam) {
        console.log('Fixtures data received:', data);

        if (data != null) {
            addStatusIndicator('Processing fixtures...');
            const fixtures = filterFixtures(data);
            const teamMatches = getTeamMatches(fixtures, currentTeam);

            if (teamMatches.length === 0) {
                addStatusIndicator('No matches found for ' + currentTeam);
                console.log('No completed matches found for team:', currentTeam);
                return;
            }

            addStatusIndicator('Found ' + teamMatches.length + ' matches. Displaying...');
            displayEnhancedMatchList(teamMatches, currentTeam);
            addStatusIndicator('Complete! Found ' + teamMatches.length + ' matches with events');

            // Remove status after 5 seconds
            setTimeout(() => {
                const statusDiv = document.getElementById('tm-reports-status');
                if (statusDiv) statusDiv.remove();
            }, 5000);
        } else {
            console.error('No fixtures data received');
            addStatusIndicator('Error: No fixtures data');
        }
    }

    // Wait for page to load
    function waitForReady() {
        console.log('Waiting for page to be ready...');
        addStatusIndicator('Page loading, please wait...');

        // Give the page more time to fully load
        setTimeout(generateMatchReports, 3000);
    }

    // Start the script
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', waitForReady);
    } else {
        waitForReady();
    }

    console.log('TM Last Five Match Reports Enhanced script initialized');
})();