PageSourceSearch

https://jalalivescore.com/wp-content/themes/cls_ayegsxfb/assets/js/data.js?ver=1.2.0

js jalalivescore.com collected 2026-10-02 21:24:56 UTC 89,018 bytes, 1,789 lines download raw bytes

1// 全局变量声明
2const apiUrl = {
3    'football': 'https://score.falou.net',
4    'basketball': 'https://bb.falou.net'
5};
6var intervalScoreObj = null;
7var intervalLiveObj = null;
8
9function loadHtml(object) {
10    // 清除定时器
11    clearInterval(intervalScoreObj);
12
13    jQuery(object).html(`
14        <div class="ajax-loading">
15            <div class="loading-line" style="width: 50%;"></div>
16            <div class="loading-line" style="width: 70%;"></div>
17            <div class="loading-line" style="width: 100%;"></div>
18        </div>
19    `);
20}
21
22// 获取开始时间
23function getStartTime(match_time) {
24    return Math.ceil((Date.now() / 1000 - match_time) / 60);
25}
26
27function get_country_list(sportType) {
28    loadHtml('#category-left-menu .country_list');
29
30    jQuery.ajax({
31        url: `${apiUrl[sportType]}/country/list`,
32        type: 'GET',
33        dataType: 'json',
34        success: function (res) {
35             // 处理数据
36            let html = countryListHtml(sportType,res.data);
37            jQuery('#category-left-menu .country_list').html(html);
38
39            // 添加"Show more"按钮的点击事件
40            jQuery('.lmc__itemMore').on('click', function() {
41                jQuery('#category-left-menu .country_list .lmc__block.hidden').removeClass('hidden');
42                jQuery(this).hide(); // 隐藏"Show more"按钮
43            });
44        }
45    });
46}
47
48function get_category_list(sportType) {
49    loadHtml('#category-left-menu .category_list');
50
51    jQuery.ajax({
52        url: `${apiUrl[sportType]}/category/list`,
53        type: 'GET',
54        dataType: 'json',
55        success: function (res) {
56             // 处理数据
57            let html = categoryListHtml(sportType,res.data);
58            jQuery('#category-left-menu .category_list').html(html);
59        }
60    });
61}
62
63function countryListHtml(sportType,data){
64    let countryListHtml = '';
65    let showMoreHtml = '';
66
67    data.forEach((country, index) => {
68        let displayClass = index >= 15 ? 'lmc__block hidden' : 'lmc__block';
69        countryListHtml += `
70            <div class="${displayClass}">
71                <a id="lmenu_${country.id}" class="lmc__element lmc__item " href="javascript:void(0);" data-ctype="${sportType}" data-id="${country.id}" >
72                    <span class="lmc__elementName"><img class="country_logo lazyload" src="${country.logo}">${country.name}</span>
73                    <svg class="lmc__sortIcon lmc__sortIcon--desktop"><use xlink:href="${theme_uri}/assets/img/icons/incident.v4.svg#arrow-bold"></use></svg>
74                    <svg class="lmc__sortIcon lmc__sortIcon--mobile"><use xlink:href="${theme_uri}/assets/img/icons/action.svg#arrow"></use></svg>
75                </a>
76            </div>
77        `;
78    });
79
80    // 如果国家数量超过25个,添加"Show more"按钮
81    if (data.length > 25) {
82        showMoreHtml = `
83            <span class="lmc__itemMore">${language.more}<svg class="leftMenu__icon leftMenu__icon--arrow"><use xlink:href="${theme_uri}/assets/img/icons/action.svg#arrow"></use></svg></span>
84        `;
85    }
86
87    return countryListHtml + showMoreHtml;
88}
89
90function categoryListHtml(sportType,data){
91    let categoryListHtml = '';
92
93    data.forEach((category, index) => {
94        let displayClass = index >= 15 ? 'lmc__block hidden' : 'lmc__block';
95        categoryListHtml += `
96            <div class="${displayClass}">
97                <a id="lmenu_${category.id}" class="lmc__element lmc__item " href="javascript:void(0);" data-ctype="${sportType}" data-id="${category.id}" >
98                    <span class="lmc__elementName"><img class="country_logo lazyload" src="${theme_uri}/assets/img/international.png">${category.name}</span>
99                    <svg class="lmc__sortIcon lmc__sortIcon--desktop"><use xlink:href="${theme_uri}/assets/img/icons/incident.v4.svg#arrow-bold"></use></svg>
100                    <svg class="lmc__sortIcon lmc__sortIcon--mobile"><use xlink:href="${theme_uri}/assets/img/icons/action.svg#arrow"></use></svg>
101                </a>
102            </div>
103        `;
104    });
105
106    return categoryListHtml;
107}
108
109function competitionListHtml(sportType,data){
110    let competitionListHtml = '';
111
112    data.forEach(competition => {
113        competitionListHtml += `<span class="lmc__template "><span></span><a href="${league_page[sportType]}${competition.id}" class="lmc__templateHref" title="${competition.name}"><img class="country_logo lazyload" src="${competition.logo}">${competition.name}</a></span>`
114    });
115
116    return competitionListHtml;
117}
118
119function locadMatchLists(selector = '.match-lists') {
120    jQuery(selector).html(`
121        <div class="ajax-loading">
122            <div class="loading-line" style="width: 100%;"></div>
123            <div style="display:grid; gap: 5px;grid-template-columns: 1fr 9fr 2fr;">
124                <div class="loading-line" style="width: 100%;"></div>
125                <div class="loading-line" style="width: 100%;"></div>
126                <div class="loading-line" style="width: 100%;"></div>
127            </div>
128            <div style="display:grid; gap: 5px;grid-template-columns: 1fr 9fr 2fr;">
129                <div class="loading-line" style="width: 100%;"></div>
130                <div class="loading-line" style="width: 100%;"></div>
131                <div class="loading-line" style="width: 100%;"></div>
132            </div>
133            <div style="display:grid; gap: 5px;grid-template-columns: 1fr 9fr 2fr;">
134                <div class="loading-line" style="width: 100%;"></div>
135                <div class="loading-line" style="width: 100%;"></div>
136                <div class="loading-line" style="width: 100%;"></div>
137            </div>
138            <div style="height:20px;width:100%;"></div>
139            <div class="loading-line" style="width: 100%;"></div>
140            <div style="display:grid; gap: 5px;grid-template-columns: 1fr 9fr 2fr;">
141                <div class="loading-line" style="width: 100%;"></div>
142                <div class="loading-line" style="width: 100%;"></div>
143                <div class="loading-line" style="width: 100%;"></div>
144            </div>
145            <div style="display:grid; gap: 5px;grid-template-columns: 1fr 9fr 2fr;">
146                <div class="loading-line" style="width: 100%;"></div>
147                <div class="loading-line" style="width: 100%;"></div>
148                <div class="loading-line" style="width: 100%;"></div>
149            </div>
150        </div>
151    `);
152}
153
154// 获取赛程赛果数据
155function get_match_result(sportType,type, date,callback) {
156    locadMatchLists();
157
158    // 清除定时器
159    clearInterval(intervalScoreObj);
160
161    jQuery.ajax({
162        url: `${apiUrl[sportType]}/match/result?type=${type}&date=${date}&status=1`,
163        type: 'GET',
164        dataType: 'json',
165        success: function (res) {
166             // 处理数据
167            let html;
168            if (sportType === 'basketball') {
169                html = bb_matchResultHtml(res.data);
170            } else {
171                html = matchResultHtml(res.data);
172            }
173            jQuery('.match-lists').html(html);
174
175            if( date == formatDate('Ymd', new Date().getTime()) ){
176                // 执行实时更新
177                intervalLive(sportType);
178            }
179
180            if (callback) {
181                callback();
182            }
183        }
184    });
185}
186
187function bb_matchResultHtml(data){
188    let html = '';
189
190    data.forEach(league => {
191        // 添加联赛标题
192        html += `
193            <div class="headerLeague__wrapper" id="league_${league.id}">
194                <div class="wcl-header_HrElx wcl-pinned_dRFvU headerLeague headerLeague--has-star">
195                    <div class="headerLeague__body">
196                        <div class="headerLeague__titleWrapper">
197                            <a title="${league.name}" href="${league_page[sportType]}${league.id}" class="headerLeague__title">
198                                <strong class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-bold_MMDhq headerLeague__title-text">${league.name}</strong>
199                            </a>
200                        </div>
201                    </div>
202                    <div class="headerLeague__actions headerLeague__actions--no-spacing-mobile headerLeague__actions--no-spacing-desktop">
203                        <div class="wclIcon__leagueShowMoreCont">
204                            <div class="wcl-trigger_CGiIV">
205                                <button type="button" class="wcl-accordion_7Fi80">
206                                    <span class="wcl-icon_WJBei">
207                                        <svg fill="currentColor" viewBox="0 0 20 20" class="wcl-icon_WGKvC" width="14" height="14"><path fill-rule="evenodd" class="action-navigation-arrow-up" d="M.98 15 10 5.97 19.02 15l.98-.98-10-10-10 10 .98.98Z"></path></svg>
208                                    </span>
209                                </button>
210                            </div>
211                        </div>
212                    </div>
213                </div>
214            </div>
215        `;
216
217        // 添加比赛列表
218        league.list.forEach((match, index) => {
219            // 确定比赛状态类
220            let statusClass = 'event__match--scheduled';
221            if (match.status >= 2 && match.status <= 9) statusClass = 'event__match--live';
222            else if (match.status === 10) statusClass = 'event__match--finished';
223
224            // 确定是否是最后一场比赛
225            let isLastClass = index === league.list.length - 1 ? 'event__match--last' : '';
226
227            // 格式化比赛时间
228            const matchTime = new Date(match.match_time * 1000);
229            const formattedTime = matchTime.getHours().toString().padStart(2, '0') + ':' + matchTime.getMinutes().toString().padStart(2, '0');
230
231            // 获取比分 - 总分为四节相加
232            const homeScore = (match.home_score[0] || 0) + (match.home_score[1] || 0) + (match.home_score[2] || 0) + (match.home_score[3] || 0);
233            const awayScore = (match.away_score[0] || 0) + (match.away_score[1] || 0) + (match.away_score[2] || 0) + (match.away_score[3] || 0);
234
235            // 根据状态生成不同的内容
236            let statusContent = '';
237            let timeOrScore = '';
238
239            if (match.status === 1) {
240                // 未开赛 - 显示状态文本
241                statusContent = `<a class="icon--preview"><em class="wcl-badgePreview_cjWs9">${bb_language.status_1}</em></a>`;
242                timeOrScore = `<div class="event__time">${formattedTime}</div>`;
243            } else if (match.status >= 2 && match.status <= 9) {
244                // 进行中 - 显示比分和时间
245                statusContent = '';
246                timeOrScore = `
247                    <div class="event__time">${getStartTime(match.match_time)}</div>
248                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home">${homeScore}</span>
249                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away">${awayScore}</span>
250                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home1">${match.home_score[0]}</span>
251                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away1">${match.home_score[0]}</span>
252                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home2">${match.home_score[1]}</span>
253                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away2">${match.home_score[1]}</span>
254                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home3">${match.home_score[2]}</span>
255                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away3">${match.home_score[2]}</span>
256                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home4">${match.home_score[3]}</span>
257                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away4">${match.home_score[3]}</span>
258                `;
259            } else if (match.status === 10) {
260                // 已结束 - 显示比分
261                statusContent = '';
262                timeOrScore = `
263                    <div class="event__time">${bb_language.status_10}</div>
264                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home">${homeScore}</span>
265                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away">${awayScore}</span>
266                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home1">${match.home_score[0] || 0}</span>
267                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away1">${match.home_score[0] || 0}</span>
268                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home2">${match.home_score[1] || 0}</span>
269                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away2">${match.home_score[1] || 0}</span>
270                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home3">${match.home_score[2] || 0}</span>
271                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away3">${match.home_score[2] || 0}</span>
272                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home4">${match.home_score[3] || 0}</span>
273                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away4">${match.home_score[3] || 0}</span>
274                `;
275            }
276
277            html += `
278                <div class="event__match bb league_${league.id} event__match--withRowLink ${statusClass} ${isLastClass} event__match--twoLine">
279                    <a href="${matchinfo_page[sportType]}${match.match_id}" target="_self" title="${language.look_match_info}" class="eventRowLink"></a>
280                    ${timeOrScore}
281                    <div class="wcl-participant_bctDY event__homeParticipant">
282                        <img class="wcl-assetContainer_KJQf9 wcl-logo_UrSpU wcl-sizeXXS_CNb8a" alt="${match.home_name}" loading="lazy" src="${match.home_logo}">
283                        <span class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-name_jjfMf">${match.home_name}</span>
284                    </div>
285                    <div class="wcl-participant_bctDY event__awayParticipant">
286                        <img class="wcl-assetContainer_KJQf9 wcl-logo_UrSpU wcl-sizeXXS_CNb8a" alt="${match.away_name}" loading="lazy" src="${match.away_logo}">
287                        <span class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-name_jjfMf">${match.away_name}</span>
288                    </div>
289                    ${statusContent}
290                </div>
291            `;
292        });
293    });
294
295    return html;
296}
297
298function matchResultHtml(data){
299    let html = '';
300
301    data.forEach(league => {
302        // 添加联赛标题
303        html += `
304            <div class="headerLeague__wrapper" id="league_${league.id}">
305                <div class="wcl-header_HrElx wcl-pinned_dRFvU headerLeague headerLeague--has-star">
306                    <div class="headerLeague__body">
307                        <div class="headerLeague__titleWrapper">
308                            <a title="${league.name}" href="${league_page[sportType]}${league.id}" class="headerLeague__title">
309                                <strong class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-bold_MMDhq headerLeague__title-text">${league.name}</strong>
310                            </a>
311                        </div>
312                    </div>
313                    <div class="headerLeague__actions headerLeague__actions--no-spacing-mobile headerLeague__actions--no-spacing-desktop">
314                        <div class="wclIcon__leagueShowMoreCont">
315                            <div class="wcl-trigger_CGiIV">
316                                <button type="button" class="wcl-accordion_7Fi80">
317                                    <span class="wcl-icon_WJBei">
318                                        <svg fill="currentColor" viewBox="0 0 20 20" class="wcl-icon_WGKvC" width="14" height="14"><path fill-rule="evenodd" class="action-navigation-arrow-up" d="M.98 15 10 5.97 19.02 15l.98-.98-10-10-10 10 .98.98Z"></path></svg>
319                                    </span>
320                                </button>
321                            </div>
322                        </div>
323                    </div>
324                </div>
325            </div>
326        `;
327
328        // 添加比赛列表
329        league.list.forEach((match, index) => {
330            // 确定比赛状态类
331            let statusClass = 'event__match--scheduled';
332            if (match.status >= 2 && match.status < 8 ) statusClass = 'event__match--live';
333            else if (match.status === 8) statusClass = 'event__match--finished';
334
335            // 确定是否是最后一场比赛
336            let isLastClass = index === league.list.length - 1 ? 'event__match--last' : '';
337
338            // 格式化比赛时间
339            const matchTime = new Date(match.match_time * 1000);
340            const formattedTime = matchTime.getHours().toString().padStart(2, '0') + ':' + matchTime.getMinutes().toString().padStart(2, '0');
341
342            // 获取比分
343            const homeScore = match.home_score[0] || 0;
344            const awayScore = match.away_score[0] || 0;
345
346            // 根据状态生成不同的内容
347            let statusContent = '';
348            let timeOrScore = '';
349
350            if (match.status === 1) {
351                // 未开赛 - 显示状态文本
352                statusContent = `<a class="icon--preview"><em class="wcl-badgePreview_cjWs9">${language.status_1}</em></a>`;
353                timeOrScore = `<div class="event__time">${formattedTime}</div>`;
354            } else if (match.status === 2 || match.status === 3 || match.status === 4) {
355                // 上半场、中场休息、下半场 - 显示比分和时间
356                statusContent = '';
357                timeOrScore = `
358                    <div class="event__time">${getStartTime(match.match_time)}</div>
359                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home">${homeScore}</span>
360                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away">${awayScore}</span>
361                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__part--home event__part--1"><img src="${theme_uri}/assets/img/corner.png">${match.home_score[4] > 0 ? match.home_score[4] : '-' }</span>
362                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__part--away event__part--1"><img src="${theme_uri}/assets/img/corner.png">${match.away_score[4] > 0 ? match.away_score[4] : '-'}</span>
363                `;
364            } else if (match.status === 8) {
365                // 已结束 - 显示比分
366                statusContent = '';
367                timeOrScore = `
368                    <div class="event__time">${language.status_8}</div>
369                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home">${homeScore}</span>
370                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away">${awayScore}</span>
371                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__part--home event__part--1"><img src="${theme_uri}/assets/img/corner.png">${match.home_score[4] > 0 ? match.home_score[4] : '-' }</span>
372                    <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__part--away event__part--1"><img src="${theme_uri}/assets/img/corner.png">${match.away_score[4] > 0 ? match.away_score[4] : '-'}</span>
373                `;
374            }
375
376            html += `
377                <div class="event__match league_${league.id} event__match--withRowLink ${statusClass} ${isLastClass} event__match--twoLine">
378                    <a href="${matchinfo_page[sportType]}${match.match_id}" target="_self" title="${language.look_match_info}" class="eventRowLink"></a>
379                    ${timeOrScore}
380                    <div class="wcl-participant_bctDY event__homeParticipant">
381                        <img class="wcl-assetContainer_KJQf9 wcl-logo_UrSpU wcl-sizeXXS_CNb8a" alt="${match.home_name}" loading="lazy" src="${match.home_logo}">
382                        <span class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-name_jjfMf">${match.home_name}</span>
383                    </div>
384                    <div class="wcl-participant_bctDY event__awayParticipant">
385                        <img class="wcl-assetContainer_KJQf9 wcl-logo_UrSpU wcl-sizeXXS_CNb8a" alt="${match.away_name}" loading="lazy" src="${match.away_logo}">
386                        <span class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-name_jjfMf">${match.away_name}</span>
387                    </div>
388                    ${statusContent}
389                </div>
390            `;
391        });
392    });
393
394    return html;
395}
396
397// 实时更新比分
398function intervalLive(sportType) {
399    var liveStatus = 0;
400    intervalScoreObj = setInterval(function () {
401        if (liveStatus == 0) {
402            liveStatus = 1;
403            let ajaxUrl = `${apiUrl[sportType]}/live`;
404            jQuery.get(ajaxUrl, function (res) {
405                if (res.code == 200) {
406                    liveStatus = 0;
407                    jQuery.each(res.data, function (index, item) {
408                        var matchObj = jQuery(`#g_1_${item.id}`);
409                        if (matchObj.length) {
410                            // 更新状态类
411                            matchObj.removeClass('event__match--scheduled event__match--live event__match--finished');
412
413                            let statusClass = 'event__match--live';
414                            let finishedStatus = sportType === 'basketball' ? 10 : 8;
415                            if (item.status_id === finishedStatus) statusClass = 'event__match--finished';
416
417                            matchObj.addClass(statusClass);
418
419                            // 获取比分 - 使用正确的字段名
420                            const homeScore = (item.home_scores[0] || 0) + (item.home_scores[1] || 0) + (item.home_scores[2] || 0) + (item.home_scores[3] || 0);
421                            const awayScore = (item.away_scores[0] || 0) + (item.away_scores[1] || 0) + (item.away_scores[2] || 0) + (item.away_scores[3] || 0);
422
423                            // 根据状态更新内容
424                            if (sportType === 'basketball') {
425                                // 篮球状态处理
426                                if (item.status_id >= 2 && item.status_id <= 9) {
427                                    // 进行中 - 显示比分和时间
428                                    const startTime = getStartTime(item.match_time);
429                                    matchObj.find('.event__time').html(startTime);
430                                    matchObj.find('.event__score--home').html(homeScore);
431                                    matchObj.find('.event__score--away').html(awayScore);
432                                    // 更新各节分数
433                                    matchObj.find('.event__score--home1').html(item.home_scores[0] || 0);
434                                    matchObj.find('.event__score--away1').html(item.away_scores[0] || 0);
435                                    matchObj.find('.event__score--home2').html(item.home_scores[1] || 0);
436                                    matchObj.find('.event__score--away2').html(item.away_scores[1] || 0);
437                                    matchObj.find('.event__score--home3').html(item.home_scores[2] || 0);
438                                    matchObj.find('.event__score--away3').html(item.away_scores[2] || 0);
439                                    matchObj.find('.event__score--home4').html(item.home_scores[3] || 0);
440                                    matchObj.find('.event__score--away4').html(item.away_scores[3] || 0);
441                                    matchObj.find('.event__score, .event__part--1').show();
442                                    matchObj.find('.icon--preview').remove();
443                                } else if (item.status_id === 10) {
444                                    // 已结束 - 显示比分
445                                    matchObj.find('.event__time').html(bb_language.status_10);
446                                    matchObj.find('.event__score--home').html(homeScore);
447                                    matchObj.find('.event__score--away').html(awayScore);
448                                    // 更新各节分数
449                                    matchObj.find('.event__score--home1').html(item.home_scores[0] || 0);
450                                    matchObj.find('.event__score--away1').html(item.away_scores[0] || 0);
451                                    matchObj.find('.event__score--home2').html(item.home_scores[1] || 0);
452                                    matchObj.find('.event__score--away2').html(item.away_scores[1] || 0);
453                                    matchObj.find('.event__score--home3').html(item.home_scores[2] || 0);
454                                    matchObj.find('.event__score--away3').html(item.away_scores[2] || 0);
455                                    matchObj.find('.event__score--home4').html(item.home_scores[3] || 0);
456                                    matchObj.find('.event__score--away4').html(item.away_scores[3] || 0);
457                                    matchObj.find('.event__score, .event__part--1').show();
458                                    matchObj.find('.icon--preview').remove();
459                                } else {
460                                    let statusLang = `status_${item.status_id}`;
461                                    matchObj.find('.icon--preview').html(`<em class="wcl-badgePreview_cjWs9">${bb_language[statusLang]}</em>`);
462                                }
463                            } else {
464                                // 足球状态处理
465                                if (item.status_id === 2 || item.status_id === 3 || item.status_id === 4 || item.status_id === 5 || item.status_id === 7) {
466                                    // 进行中 - 显示比分和时间
467                                    const startTime = getStartTime(item.match_time);
468                                    matchObj.find('.event__time').html(startTime);
469                                    matchObj.find('.event__score--home').html(homeScore);
470                                    matchObj.find('.event__score--away').html(awayScore);
471                                    matchObj.find('.event__part--home').html(`<img src="${theme_uri}/assets/img/corner.png">${item.home_scores[4] > 0 ? item.home_scores[4] : '-'}`);
472                                    matchObj.find('.event__part--away').html(`<img src="${theme_uri}/assets/img/corner.png">${item.away_scores[4] > 0 ? item.away_scores[4] : '-'}`);
473                                    matchObj.find('.event__score, .event__part--1').show();
474                                    matchObj.find('.icon--preview').remove();
475                                } else if (item.status_id === 8) {
476                                    // 已结束 - 显示比分
477                                    matchObj.find('.event__time').html(language.status_8);
478                                    matchObj.find('.event__score--home').html(homeScore);
479                                    matchObj.find('.event__score--away').html(awayScore);
480                                    matchObj.find('.event__part--home').html(`<img src="${theme_uri}/assets/img/corner.png">${item.home_scores[4] > 0 ? item.home_scores[4] : '-'}`);
481                                    matchObj.find('.event__part--away').html(`<img src="${theme_uri}/assets/img/corner.png">${item.away_scores[4] > 0 ? item.away_scores[4] : '-'}`);
482                                    matchObj.find('.event__score, .event__part--1').show();
483                                    matchObj.find('.icon--preview').remove();
484                                } else {
485                                    let statusLang = `status_${item.status_id}`;
486                                    matchObj.find('.icon--preview').html(`<em class="wcl-badgePreview_cjWs9">${language[statusLang]}</em>`);
487                                }
488                            }
489                        }
490                    });
491                }
492            }).fail(function(xhr, status, error) {
493                liveStatus = 0;
494            });
495        }
496    }, ajaxSecond * 1000);
497}
498
499// 检查并隐藏没有可见比赛的联赛标题
500function checkAndHideEmptyLeagues() {
501    jQuery('.headerLeague__wrapper').each(function() {
502        var leagueId = jQuery(this).attr('id');
503        if (leagueId && leagueId.startsWith('league_')) {
504            var leagueNum = leagueId.replace('league_', '');
505            var visibleMatches = jQuery(`.league_${leagueNum}:visible`).length;
506
507            if (visibleMatches === 0) {
508                jQuery(this).hide();
509            } else {
510                jQuery(this).show();
511            }
512        }
513    });
514}
515
516function get_league_info(sportType,leagueId) {
517    // 修改右侧主内容
518    get_competition_info(sportType, leagueId, function (data) {
519        jQuery('.league_name').text(data.name);
520        jQuery('.league_logo').attr('src', data.logo);
521    });
522
523    // 获取联赛的今日赛事、赛程、赛果、排行榜数据
524    get_league_summary(sportType, leagueId);
525    get_league_schedule(sportType, leagueId);
526    get_league_result(sportType, leagueId);
527    get_intergal_data(sportType, leagueId, 0, function (html) {
528        jQuery(`.event.league_table .match-lists`).html(html);
529    });
530}
531
532// 获取联赛信息
533function get_competition_info(sportType, id, afterFunc) {
534    let ajaxUrl = `${apiUrl[sportType]}
534/competition/info?id=${id}`;
535    jQuery.get(ajaxUrl, function (res) {
536        if (res.code == 200) {
537            afterFunc(res.data);
538        }
539    });
540}
541
542// 获取今日赛事
543function get_league_summary(sportType, id) {
544    // 先显示加载状态
545    locadMatchLists('.event.league_summary .match-lists');
546
547    let ajaxUrl = `${apiUrl[sportType]}/competition/result?type=1&id=${id}&date=${formatDate('Ymd', new Date().getTime())}`;
548
549    jQuery.ajax({
550        url: ajaxUrl,
551        type: 'GET',
552        dataType: 'json',
553        success: function (res) {
554            // 处理数据
555            let html = insertLeagueResultHtml(sportType, res.data);
556            jQuery(`.event.league_summary .match-lists`).html(html);
557        },
558        error: function() {
559            // 请求失败时显示空数据提示
560            jQuery(`.event.league_summary .match-lists`).html(`<div class="empty_data">${language.empty}</div>`);
561        }
562    });
563}
564
565// 获取赛程
566function get_league_schedule(sportType, id) {
567    // 先显示加载状态
568    locadMatchLists('.event.league_schedule .match-lists');
569
570    jQuery.ajax({
571        url: `${apiUrl[sportType]}/competition/result?type=1&id=${id}`,
572        type: 'GET',
573        dataType: 'json',
574        success: function (res) {
575            // 处理数据
576            let html = insertLeagueResultHtml(sportType, res.data);
577            jQuery(`.event.league_schedule .match-lists`).html(html);
578        },
579        error: function() {
580            // 请求失败时显示空数据提示
581            jQuery(`.event.league_schedule .match-lists`).html(`<div class="empty_data">${language.empty}</div>`);
582        }
583    });
584}
585
586// 获取赛果
587function get_league_result(sportType, id) {
588    // 先显示加载状态
589    locadMatchLists('.event.league_result .match-lists');
590
591    jQuery.ajax({
592        url: `${apiUrl[sportType]}/competition/result?type=0&id=${id}`,
593        type: 'GET',
594        dataType: 'json',
595        success: function (res) {
596            // 处理数据
597            let html = insertLeagueResultHtml(sportType, res.data);
598            jQuery(`.event.league_result .match-lists`).html(html);
599        },
600        error: function() {
601            // 请求失败时显示空数据提示
602            jQuery(`.event.league_result .match-lists`).html(`<div class="empty_data">${language.empty}</div>`);
603        }
604    });
605}
606
607// 获取排行榜
608function get_intergal_data(sportType, competition_id, season_id, afterFunc) {
609    // 先显示加载状态
610    locadMatchLists(`.event.league_table .match-lists`);
611
612    let ajaxUrl = `${apiUrl[sportType]}/competition/table?id=${competition_id}&sid=${season_id}`;
613    jQuery.get(ajaxUrl, function (res) {
614        if (res.code == 200) {
615            let html = insertIntergalHtml(res.data, sportType);
616            afterFunc(html);
617        } else {
618            // 请求失败时显示空数据提示
619            afterFunc(`<div class="empty_data">${language.empty}</div>`);
620        }
621    }).fail(function() {
622        // 请求失败时显示空数据提示
623        afterFunc(`<div class="empty_data">${language.empty}</div>`);
624    });
625}
626
627// 联赛页面赛程赛果数据
628function insertLeagueResultHtml(sportType, data) {
629    let html = '';
630
631    if (!Array.isArray(data) || data.length === 0) {
632        return `<div class="empty_data">${language.empty}</div>`;
633    }
634
635    // 直接处理扁平的比赛数组,不需要联赛标题
636    data.forEach((match, index) => {
637        if (sportType === 'basketball') {
638            html += bb_leagueMatchHtml(match, index === data.length - 1);
639        } else {
640            html += leagueMatchHtml(match, index === data.length - 1);
641        }
642    });
643
644    return html;
645}
646
647// 生成联赛页面篮球比赛HTML
648function bb_leagueMatchHtml(match, isLast) {
649    // 确定比赛状态类
650    let statusClass = 'event__match--scheduled';
651    if (match.status >= 2 && match.status <= 9) statusClass = 'event__match--live';
652    else if (match.status === 10) statusClass = 'event__match--finished';
653
654    // 确定是否是最后一场比赛
655    let isLastClass = isLast ? 'event__match--last' : '';
656
657    // 格式化比赛时间和日期
658    const formattedDate = formatDate('d-m', match.match_time);
659    const formattedTime = formatDate('H:i', match.match_time);
660
661    // 获取比分 - 总分为四节相加
662    const homeScore = (match.home_score[0] || 0) + (match.home_score[1] || 0) + (match.home_score[2] || 0) + (match.home_score[3] || 0);
663    const awayScore = (match.away_score[0] || 0) + (match.away_score[1] || 0) + (match.away_score[2] || 0) + (match.away_score[3] || 0);
664
665    // 根据状态生成不同的内容
666    let statusContent = '';
667    let timeOrScore = '';
668
669    if (match.status === 1) {
670        // 未开赛 - 显示状态文本
671        statusContent = `<a class="icon--preview"><em class="wcl-badgePreview_cjWs9">${bb_language.status_1}</em></a>`;
672        timeOrScore = `<div class="event__time">${formattedDate} ${formattedTime}</div>`;
673    } else if (match.status >= 2 && match.status <= 9) {
674        // 进行中 - 显示比分和时间
675        statusContent = '';
676        timeOrScore = `
677            <div class="event__time">${formattedDate} ${getStartTime(match.match_time)}</div>
678            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home">${homeScore}</span>
679            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away">${awayScore}</span>
680            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home1">${match.home_score[0]}</span>
681            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away1">${match.away_score[0]}</span>
682            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home2">${match.home_score[1]}</span>
683            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away2">${match.away_score[1]}</span>
684            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home3">${match.home_score[2]}</span>
685            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away3">${match.away_score[2]}</span>
686            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home4">${match.home_score[3]}</span>
687            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away4">${match.away_score[3]}</span>
688        `;
689    } else if (match.status === 10) {
690        // 已结束 - 显示比分
691        statusContent = '';
692        timeOrScore = `
693            <div class="event__time">${formattedDate} ${formattedTime}</div>
694            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home">${homeScore}</span>
695            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away">${awayScore}</span>
696            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home1">${match.home_score[0] || 0}</span>
697            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away1">${match.away_score[0] || 0}</span>
698            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home2">${match.home_score[1] || 0}</span>
699            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away2">${match.away_score[1] || 0}</span>
700            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home3">${match.home_score[2] || 0}</span>
701            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away3">${match.away_score[2] || 0}</span>
702            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home4">${match.home_score[3] || 0}</span>
703            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away4">${match.away_score[3] || 0}</span>
704        `;
705    }
706
707    return `
708        <div class="event__match bb event__match--withRowLink ${statusClass} ${isLastClass} event__match--twoLine" id="g_1_${match.match_id}">
709            <a href="${matchinfo_page[sportType]}${match.match_id}" target="_self" title="${language.look_match_info}" class="eventRowLink"></a>
710            ${timeOrScore}
711            <div class="wcl-participant_bctDY event__homeParticipant">
712                <img class="wcl-assetContainer_KJQf9 wcl-logo_UrSpU wcl-sizeXXS_CNb8a" alt="${match.home_name}" loading="lazy" src="${match.home_logo}">
713                <span class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-name_jjfMf">${match.home_name}</span>
714            </div>
715            <div class="wcl-participant_bctDY event__awayParticipant">
716                <img class="wcl-assetContainer_KJQf9 wcl-logo_UrSpU wcl-sizeXXS_CNb8a" alt="${match.away_name}" loading="lazy" src="${match.away_logo}">
717                <span class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-name_jjfMf">${match.away_name}</span>
718            </div>
719            ${statusContent}
720        </div>
721    `;
722}
723
724// 生成联赛页面足球比赛HTML
725function leagueMatchHtml(match, isLast) {
726    // 确定比赛状态类
727    let statusClass = 'event__match--scheduled';
728    if (match.status >= 2 && match.status < 8) statusClass = 'event__match--live';
729    else if (match.status === 8) statusClass = 'event__match--finished';
730
731    // 确定是否是最后一场比赛
732    let isLastClass = isLast ? 'event__match--last' : '';
733
734    // 格式化比赛时间和日期
735    const formattedDate = formatDate('d-m', match.match_time);
736    const formattedTime = formatDate('H:i', match.match_time);
737
738    // 获取比分
739    const homeScore = match.home_score[0] || 0;
740    const awayScore = match.away_score[0] || 0;
741
742    // 根据状态生成不同的内容
743    let statusContent = '';
744    let timeOrScore = '';
745
746    if (match.status === 1) {
747        // 未开赛 - 显示状态文本
748        statusContent = `<a class="icon--preview"><em class="wcl-badgePreview_cjWs9">${language.status_1}</em></a>`;
749        timeOrScore = `<div class="event__time">${formattedDate} ${formattedTime}</div>`;
750    } else if (match.status === 2 || match.status === 3 || match.status === 4) {
751        // 上半场、中场休息、下半场 - 显示比分和时间
752        statusContent = '';
753        timeOrScore = `
754            <div class="event__time">${formattedDate} ${getStartTime(match.match_time)}</div>
755            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home">${homeScore}</span>
756            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away">${awayScore}</span>
757            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__part--home event__part--1"><img src="${theme_uri}/assets/img/corner.png">${match.home_score[4] > 0 ? match.home_score[4] : '-' }</span>
758            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__part--away event__part--1"><img src="${theme_uri}/assets/img/corner.png">${match.away_score[4] > 0 ? match.away_score[4] : '-'}</span>
759        `;
760    } else if (match.status === 8) {
761        // 已结束 - 显示比分
762        statusContent = '';
763        timeOrScore = `
764            <div class="event__time">${formattedDate} ${formattedTime}</div>
765            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home">${homeScore}</span>
766            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away">${awayScore}</span>
767            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__part--home event__part--1"><img src="${theme_uri}/assets/img/corner.png">${match.home_score[4] > 0 ? match.home_score[4] : '-' }</span>
768            <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__part--away event__part--1"><img src="${theme_uri}/assets/img/corner.png">${match.away_score[4] > 0 ? match.away_score[4] : '-'}</span>
769        `;
770    }
771
772    return `
773        <div class="event__match event__match--withRowLink ${statusClass} ${isLastClass} event__match--twoLine" id="g_1_${match.match_id}">
774            <a href="${matchinfo_page[sportType]}${match.match_id}" target="_self" title="${language.look_match_info}" class="eventRowLink"></a>
775            ${timeOrScore}
776            <div class="wcl-participant_bctDY event__homeParticipant">
777                <img class="wcl-assetContainer_KJQf9 wcl-logo_UrSpU wcl-sizeXXS_CNb8a" alt="${match.home_name}" loading="lazy" src="${match.home_logo}">
778                <span class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-name_jjfMf">${match.home_name}</span>
779            </div>
780            <div class="wcl-participant_bctDY event__awayParticipant">
781                <img class="wcl-assetContainer_KJQf9 wcl-logo_UrSpU wcl-sizeXXS_CNb8a" alt="${match.away_name}" loading="lazy" src="${match.away_logo}">
782                <span class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-name_jjfMf">${match.away_name}</span>
783            </div>
784            ${statusContent}
785        </div>
786    `;
787}
788
789
790function insertIntergalHtml(data, sportType) {
791    if (!data.list || data.list.length === 0) {
792        return `<div class="empty_data">${language.empty}</div>`;
793    }
794
795    var lang = sportType === 'basketball' ? bb_language['intergal'] : language['intergal'];
796    var html = '';
797    var promotions_html = '';
798
799    // 生成 promotions HTML
800    if (data.promotions && Object.keys(data.promotions).length > 0) {
801        promotions_html = '<div class="tableLegend"><div class="tableLegend__rank">';
802        Object.values(data.promotions).forEach(promo => {
803            promotions_html += `
804                <div class="tableLegend__row">
805                    <div class="tableLegend__coloredSquare" style="background-color: ${promo.color};"></div>
806                    <span>${promo.name_en}</span>
807                </div>
808            `;
809        });
810        promotions_html += '</div></div>';
811    }
812
813    // 生成排行榜 HTML
814    html = '<div id="tournament-table" class="tournament-table-standings">';
815    html += '<div id="tournament-table-tabs-and-content">';
816    html += '<div class="tableWrapper">';
817    html += '<div class="ui-table">';
818
819    // 生成表格内容
820    html += '<div class="ui-table__body">';
821
822    data.list.forEach(function(group) {
823        // 为每个组生成表头
824        html += '<div class="ui-table__header">';
825        if (data.list.length > 1) {
826            // 多个组时,排名列显示组名
827            html += '<div class="ui-table__headerCell table__headerCell--rank ui-table__headerCell--sortable ui-table__headerCell--sorted" role="button" tabindex="0">' + group.group + '</div>';
828        } else {
829            // 单个组时,显示#
830            html += '<div class="ui-table__headerCell table__headerCell--rank ui-table__headerCell--sortable ui-table__headerCell--sorted" role="button" tabindex="0">#</div>';
831        }
832        html += '<div class="ui-table__headerCell table__headerCell--participant ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[0] + '</div>';
833        html += '<div class="ui-table__headerCell ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[1] + '</div>';
834
835        // 根据运动类型显示不同的列
836        if (sportType === 'basketball') {
837            // 篮球没有平局,只显示胜场和负场
838            html += '<div class="ui-table__headerCell ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[2] + '</div>';
839            html += '<div class="ui-table__headerCell ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[4] + '</div>';
840        } else {
841            // 足球显示胜、平、负
842            html += '<div class="ui-table__headerCell ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[2] + '</div>';
843            html += '<div class="ui-table__headerCell ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[3] + '</div>';
844            html += '<div class="ui-table__headerCell ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[4] + '</div>';
845        }
846
847        html += '<div class="ui-table__headerCell table__cell--score ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[5] + '</div>';
848
849        // 只有足球显示净胜球
850        if (sportType !== 'basketball') {
851            html += '<div class="ui-table__headerCell table__cell--goalsForAgainstDiff ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[7] + '</div>';
852        }
853
854        html += '<div class="ui-table__headerCell table__cell--points ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[8] + '</div>';
855        html += '<div class="ui-table__headerCell table__headerCell--form" role="button" tabindex="0">' + lang[9] + '</div>';
856        html += '</div>';
857
858        group.list.forEach(function(team, index) {
859            var promotionColor = team.promotion_id > 0 && data.promotions[team.promotion_id] ? data.promotions[team.promotion_id].c
859olor : '';
860            var rankStyle = promotionColor ? `style="--color: ${promotionColor}"` : '';
861
862            html += '<div class="ui-table__row" ' + rankStyle + '>';
863            html += '<div class="table__cell table__cell--rank table__cell--sorted">';
864            html += '<div class="tableCellRank" title="">' + (index + 1) + '.</div>';
865            html += '</div>';
866
867            html += '<div class="table__cell table__cell--participant">';
868            html += '<div class="tableCellParticipant">';
869            html += '<div class="tableCellParticipant__block">';
870            html += '<a class="tableCellParticipant__image" href="' + team_page[sportType] + (team.team_id ?? team.id) + '" target="_self" title="' + team.name + '">';
871            html += '<img class="participant__image" loading="lazy" alt="' + team.name + '" src="' + team.logo + '" onerror="this.src=\'' + theme_uri + '/assets/img/team_default.png\'">';
872            html += '</a>';
873            html += '<a href="' + team_page[sportType] + (team.team_id ?? team.id) + '" target="_self" class="tableCellParticipant__name">' + team.name + '</a>';
874            html += '</div>';
875            html += '</div>';
876            html += '</div>';
877
878            html += '<span class="table__cell table__cell--value">' + team.total + '</span>';
879
880            // 根据运动类型显示不同的数据
881            if (sportType === 'basketball') {
882                // 篮球:只显示胜场和负场
883                html += '<span class="table__cell table__cell--value">' + team.won + '</span>';
884                html += '<span class="table__cell table__cell--value">' + team.loss + '</span>';
885            } else {
886                // 足球:显示胜、平、负
887                html += '<span class="table__cell table__cell--value">' + team.won + '</span>';
888                html += '<span class="table__cell table__cell--value">' + (team.draw || 0) + '</span>';
889                html += '<span class="table__cell table__cell--value">' + team.loss + '</span>';
890            }
891
892            html += '<span class="table__cell table__cell--value table__cell--score">' + team.goals + ':' + team.goals_against + '</span>';
893
894            // 只有足球显示净胜球
895            if (sportType !== 'basketball') {
896                html += '<span class="table__cell table__cell--value table__cell--goalsForAgainstDiff">' + team.goal_diff + '</span>';
897            }
898
899            html += '<span class="table__cell table__cell--value table__cell--points">' + team.points + '</span>';
900
901            // Form 字段 - 显示最近比赛的状态
902            html += '<div class="table__cell table__cell--form">';
903            if (team.recent && Array.isArray(team.recent) && team.recent.length > 0) {
904                // 只显示最近5场比赛状态
905                team.recent.slice(0, 5).forEach(function(result) {
906                    let formClass = '';
907                    let formText = '';
908
909                    switch(result) {
910                        case 'win':
911                            formClass = 'wcl-win_8x-jp';
912                            formText = 'W';
913                            break;
914                        case 'lose':
915                            formClass = 'wcl-lose_9xj6q';
916                            formText = 'L';
917                            break;
918                        case 'draw':
919                            formClass = 'wcl-draw_bAS0n';
920                            formText = 'D';
921                            break;
922                        default:
923                            formClass = '';
924                            formText = '-';
925                    }
926
927                    html += `
928                        <a href="javascript:void(0);" target="_blank" rel="noreferrer" class="tableCellFormIcon">
929                            <div class="wcl-trigger_CGiIV">
930                                <div class="wcl-badgeform_AKaAR ${formClass}">
931                                    <span class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp">${formText}</span>
932                                </div>
933                            </div>
934                        </a>
935                    `;
936                });
937            }
938            html += '</div>';
939
940            html += '</div>';
941        });
942    });
943
944    html += '</div>';
945    html += '</div>';
946    html += '</div>';
947    html += promotions_html;
948    html += '</div>';
949    html += '</div>';
950
951    return html;
952}
953
954function get_team_info(sportType,teamId) {
955    // 修改右侧主内容
956    get_team_data(sportType, teamId, function (data) {
957        jQuery('.team_name').text(data.name);
958        jQuery('.team_logo').attr('src', data.logo);
959
960        // 排行榜
961        locadMatchLists('.event.team_table .match-lists');
962        get_intergal_data(sportType, data.competition_id, 0, function (html) {
963            jQuery(`.event.team_table .match-lists`).html(html);
964        });
965    });
966
967    // 获取球队的今日赛事、赛程、赛果数据
968    get_team_summary(sportType, teamId);
969    get_team_schedule(sportType, teamId);
970    get_team_result(sportType, teamId);
971}
972
973
974// 获取球队信息
975function get_team_data(sportType, id, afterFunc) {
976    let ajaxUrl = `${apiUrl[sportType]}/team/info?id=${id}`;
977    jQuery.get(ajaxUrl, function (res) {
978        if (res.code == 200) {
979            afterFunc(res.data);
980        }
981    });
982}
983
984// 获取球队今日赛事
985function get_team_summary(sportType, id) {
986    // 先显示加载状态
987    locadMatchLists('.event.team_summary .match-lists');
988
989    let ajaxUrl = `${apiUrl[sportType]}/team/result?type=1&id=${id}&date=${formatDate('Ymd', new Date().getTime())}`;
990
991    jQuery.ajax({
992        url: ajaxUrl,
993        type: 'GET',
994        dataType: 'json',
995        success: function (res) {
996            // 处理数据
997            let html = insertLeagueResultHtml(sportType, res.data);
998            jQuery(`.event.team_summary .match-lists`).html(html);
999        },
1000        error: function() {
1001            // 请求失败时显示空数据提示
1002            jQuery(`.event.team_summary .match-lists`).html(`<div class="empty_data">${language.empty}</div>`);
1003        }
1004    });
1005}
1006
1007// 获取球队赛程
1008function get_team_schedule(sportType, id) {
1009    // 先显示加载状态
1010    locadMatchLists('.event.team_schedule .match-lists');
1011
1012    jQuery.ajax({
1013        url: `${apiUrl[sportType]}/team/result?type=1&id=${id}`,
1014        type: 'GET',
1015        dataType: 'json',
1016        success: function (res) {
1017            // 处理数据
1018            let html = insertLeagueResultHtml(sportType, res.data);
1019            jQuery(`.event.team_schedule .match-lists`).html(html);
1020        },
1021        error: function() {
1022            // 请求失败时显示空数据提示
1023            jQuery(`.event.team_schedule .match-lists`).html(`<div class="empty_data">${language.empty}</div>`);
1024        }
1025    });
1026}
1027
1028// 获取球队赛果
1029function get_team_result(sportType, id) {
1030    // 先显示加载状态
1031    locadMatchLists('.event.team_result .match-lists');
1032
1033    jQuery.ajax({
1034        url: `${apiUrl[sportType]}/team/result?type=0&id=${id}`,
1035        type: 'GET',
1036        dataType: 'json',
1037        success: function (res) {
1038            // 处理数据
1039            let html = insertLeagueResultHtml(sportType, res.data);
1040            jQuery(`.event.team_result .match-lists`).html(html);
1041        },
1042        error: function() {
1043            // 请求失败时显示空数据提示
1044            jQuery(`.event.team_result .match-lists`).html(`<div class="empty_data">${language.empty}</div>`);
1045        }
1046    });
1047}
1048
1049
1050// 获取赛程赛果数据
1051function get_match_info(sportType,matchId) {
1052    if (sportType === 'basketball') {
1053        jQuery('.match_stats').hide();
1054        jQuery('.match_lineup').hide();
1055    }
1056
1057    locadMatchLists('.event.event--results .match-lists');
1058
1059    jQuery.ajax({
1060        url: `${apiUrl[sportType]}/match/info?match_id=${matchId}`,
1061        type: 'GET',
1062        dataType: 'json',
1063        success: function (res) {
1064            // 处理数据
1065            insertMatchInfoHtml(res.data);
1066
1067            // 检查是否需要启动实时更新
1068            if (res.data && res.data.info) {
1069                var statusId = res.data.info.status_id;
1070                var isLive = false;
1071
1072                if (sportType === 'football') {
1073                    // 足球:status_id 2-7 为比赛中状态
1074                    isLive = statusId > 1 && statusId < 8;
1075                } else if (sportType === 'basketball') {
1076                    // 篮球:status_id 2-9 为比赛中状态(包括节间休息)
1077                    isLive = statusId > 1 && statusId < 10;
1078                }
1079
1080                if (isLive) {
1081                    startMatchInfoLiveUpdate(sportType, matchId);
1082                }
1083            }
1084        }
1085    });
1086}
1087
1088// 比赛信息页面实时更新
1089function startMatchInfoLiveUpdate(sportType, matchId) {
1090    // 清除之前的定时器
1091    if (intervalScoreObj) {
1092        clearInterval(intervalScoreObj);
1093    }
1094
1095    intervalScoreObj = setInterval(function () {
1096        // 使用专门的比分更新API
1097        let ajaxUrl = `${apiUrl[sportType]}/match/score/${matchId}`;
1098
1099        jQuery.get(ajaxUrl, function (res) {
1100            if (res.code == 200 && res.data) {
1101                var matchInfo = res.data;
1102                var statusId = matchInfo.status_id;
1103                var isStillLive = false;
1104
1105                if (sportType === 'football') {
1106                    isStillLive = statusId > 1 && statusId < 8;
1107                } else if (sportType === 'basketball') {
1108                    isStillLive = statusId > 1 && statusId < 10;
1109                }
1110
1111                if (isStillLive) {
1112                    // 更新比分和状态
1113                    updateMatchInfoData(matchInfo, sportType);
1114                } else {
1115                    // 比赛结束,停止更新
1116                    clearInterval(intervalScoreObj);
1117                    updateMatchInfoData(matchInfo, sportType);
1118                }
1119            } else {
1120                // 数据异常,停止更新
1121                clearInterval(intervalScoreObj);
1122            }
1123        }).fail(function() {
1124            // 请求失败,停止更新
1125            clearInterval(intervalScoreObj);
1126        });
1127    }, ajaxSecond * 1000);
1128}
1129
1130// 更新比赛信息页面的比分和状态
1131function updateMatchInfoData(matchInfo, sportType) {
1132    // 更新比分
1133    var homeTotalScore, awayTotalScore;
1134
1135    if (sportType === 'basketball') {
1136        // 篮球:只计算前四节(常规时间)的得分
1137        var regularPeriods = matchInfo.home_scores.slice(0, 4);
1138        homeTotalScore = regularPeriods.reduce((sum, score) => sum + score, 0);
1139
1140        regularPeriods = matchInfo.away_scores.slice(0, 4);
1141        awayTotalScore = regularPeriods.reduce((sum, score) => sum + score, 0);
1142    } else {
1143        // 足球:只显示当前比分
1144        homeTotalScore = matchInfo.home_scores[0];
1145        awayTotalScore = matchInfo.away_scores[0];
1146    }
1147
1148    jQuery('.match_scores').html(`<span>${homeTotalScore}</span><span class="detailScore__divider">-</span><span>${awayTotalScore}</span>`);
1149
1150    // 更新状态
1151    var statusText = sportType === 'basketball' ? bb_language['status_'+matchInfo.status_id] : language['status_'+matchInfo.status_id];
1152
1153    if (sportType === 'football' && matchInfo.status_id > 1 && matchInfo.status_id < 8) {
1154        // 足球比赛中显示分钟数
1155        jQuery('.match_status span').text(statusText + ': ' + getStartTime(matchInfo.match_time) + "'");
1156        jQuery('.full_time').text(statusText + ': ' + getStartTime(matchInfo.match_time) + "'");
1157    } else {
1158        jQuery('.match_status span').text(statusText);
1159        jQuery('.full_time').text(statusText);
1160    }
1161}
1162
1163function insertMatchInfoHtml(data) {
1164    var matchInfo = data.info;
1165    jQuery('.league_name').text(matchInfo.competition_name);
1166    jQuery('.league_name').attr('href',`${league_page[sportType]}${matchInfo.competition_id}`);
1167    jQuery('.league_logo').attr('src', matchInfo.competition_logo);
1168    jQuery('.league_logo').attr('onerror',`this.src='${theme_uri}/assets/img/team_default.png'`);
1169
1170    jQuery('.date_time').text(formatDate('y-m-d H:i', matchInfo.match_time * 1000));
1171    jQuery('.full_time').text(matchInfo.status_id > 1 && matchInfo.status_id < 8 ? language['status_'+matchInfo.status_id] + ': ' + getStartTime(matchInfo.match_time) + "'" : language['status_'+matchInfo.status_id]);
1172
1173    jQuery('.home_team').attr('href',`${team_page[sportType]}${matchInfo.home_id}`);
1174    jQuery('.home_logo').attr('src', matchInfo.home_logo);
1175    jQuery('.home_logo').attr('onerror',`this.src='${theme_uri}/assets/img/team_default.png'`);
1176    jQuery('.home_name').text(matchInfo.home_name).attr('data-desktop',matchInfo.home_name).attr('data-mobile',matchInfo.home_name);
1177
1178    jQuery('.away_team').attr('href',`${team_page[sportType]}${matchInfo.away_id}`);
1179    jQuery('.away_logo').attr('src', matchInfo.away_logo);
1180    jQuery('.away_logo').attr('onerror',`this.src='${theme_uri}/assets/img/team_default.png'`);
1181    jQuery('.away_name').text(matchInfo.away_name).attr('data-desktop',matchInfo.away_name).attr('data-mobile',matchInfo.away_name);
1182
1183
1184    // 根据运动类型计算总分
1185    var homeTotalScore, awayTotalScore;
1186    if (matchInfo.status_id > 1) {
1187        if (sportType === 'basketball') {
1188            // 篮球:只计算前四节(常规时间)的得分,不包æ
1188‹¬åŠ æ—¶èµ›
1189            var regularPeriods = matchInfo.home_scores.slice(0, 4);
1190            homeTotalScore = regularPeriods.reduce((sum, score) => sum + score, 0);
1191
1192            regularPeriods = matchInfo.away_scores.slice(0, 4);
1193            awayTotalScore = regularPeriods.reduce((sum, score) => sum + score, 0);
1194        } else {
1195            // 足球:只显示当前比分
1196            homeTotalScore = matchInfo.home_scores[0];
1197            awayTotalScore = matchInfo.away_scores[0];
1198        }
1199        jQuery('.match_scores').html(`<span>${homeTotalScore}</span><span class="detailScore__divider">-</span><span>${awayTotalScore}</span>`);
1200    } else {
1201        jQuery('.match_scores').html('<span>VS</span>');
1202    }
1203
1204    // 设置赛事状态文字
1205    var statusText = sportType === 'basketball' ? bb_language['status_'+matchInfo.status_id] : language['status_'+matchInfo.status_id];
1206    jQuery('.match_status span').text(statusText);
1207
1208    // 处理各个标签页内容
1209    // match_info - 基本信息
1210    if (data.info) {
1211        generateMatchInfoHtml(data.info);
1212    }
1213
1214    // match_stats - 统计数据(篮球没有统计数据)
1215    if (sportType === 'basketball') {
1216        jQuery('.match_stats').hide();
1217    } else if (data.stats) {
1218        var statsHtml = generateMatchStatsHtml(data.stats);
1219        jQuery('.match_stats .match-lists').html(statsHtml);
1220    } else {
1221        jQuery('.match_stats .match-lists').html(`<div class="empty_data">${language.empty}</div>`);
1222    }
1223
1224    // match_lineup - 阵容信息
1225    if (sportType === 'football' && data.lineup && Object.keys(data.lineup).length > 0) {
1226        var lineupHtml = generateMatchLineupHtml(data.info, data.lineup);
1227        jQuery('.match_lineup .match-lists').html(lineupHtml);
1228    } else {
1229        jQuery('.match_lineup .match-lists').html(`<div class="empty_data">${language.empty}</div>`);
1230    }
1231
1232    // match_table - 积分榜
1233    if (sportType === 'football' && data.table && Object.keys(data.table).length > 0) {
1234        var tableHtml = generateMatchTableHtml(data.table, sportType);
1235        jQuery('.match_table .match-lists').html(tableHtml);
1236    } else {
1237        jQuery('.match_table .match-lists').html(`<div class="empty_data">${language.empty}</div>`);
1238    }
1239
1240    // match_h2h - 历史交锋
1241    var h2hHtml = generateMatchListHtml(data.vs || [], 'h2h');
1242    jQuery('.match_h2h .match-lists').html(h2hHtml);
1243
1244    // match_h2h_home - 主队历史
1245    var homeHistoryHtml = generateMatchListHtml(data.home || [], 'home');
1246    jQuery('.match_h2h_home .match-lists').html(homeHistoryHtml);
1247
1248    // match_h2h_away - 客队历史
1249    var awayHistoryHtml = generateMatchListHtml(data.away || [], 'away');
1250    jQuery('.match_h2h_away .match-lists').html(awayHistoryHtml);
1251}
1252
1253
1254
1255// 生成比赛信息HTML
1256function generateMatchInfoHtml(matchInfo) {
1257    // 更新基本信息
1258    jQuery('.competition-name').text(matchInfo.competition_name);
1259    jQuery('.venue-name').text(matchInfo.venue_name || 'Unknown');
1260    jQuery('.match-time').text(formatDate('y-m-d H:i', matchInfo.match_time * 1000));
1261
1262    // 天气信息(如果有)
1263    if (matchInfo.environment) {
1264        var weatherData = {
1265            "1": "Partly Cloudy", "2": "Cloudy", "3": "Partly Cloudy / Rain", "4": "Snow",
1266            "5": "Clear", "6": "Overcast with Rain / Isolated Thunderstorms", "7": "Overcast",
1267            "8": "Haze", "9": "Overcast with Rain", "10": "Cloudy with Rain",
1268            "11": "Cloudy with Rain / Isolated Thunderstorms", "12": "Partly Cloudy / Rain and Thunderstorms",
1269            "13": "Fog"
1270        };
1271
1272        jQuery('.weather-name').text(weatherData[matchInfo.environment.weather] || 'Unknown');
1273        jQuery('.temperature-value').text((matchInfo.environment.temperature || 'N/A') + '°C');
1274        jQuery('.humidity-value').text((matchInfo.environment.humidity || 'N/A') + '%');
1275
1276        // 显示天气相关字段
1277        jQuery('.weather-info, .temperature-info, .humidity-info').show();
1278    } else {
1279        // 隐藏天气相关字段
1280        jQuery('.weather-info, .temperature-info, .humidity-info').hide();
1281    }
1282}
1283
1284// 生成比赛统计HTML
1285function generateMatchStatsHtml(stats) {
1286    var html = '';
1287
1288    // API返回的stats是数组格式:[{away:16, home:5, type:22}, ...]
1289    if (stats && Array.isArray(stats) && stats.length > 0) {
1290        stats.forEach(function(stat) {
1291            var homeValue = parseFloat(stat.home) || 0;
1292            var awayValue = parseFloat(stat.away) || 0;
1293            var statType = stat.type;
1294            var total = homeValue + awayValue;
1295
1296            // 避免除以零
1297            var homePercent = total > 0 ? Math.round((homeValue / total) * 100) : 50;
1298            var awayPercent = total > 0 ? Math.round((awayValue / total) * 100) : 50;
1299
1300            // 确定哪一方更好,用于图表样式
1301            var homeClass = homeValue > awayValue ? 'wcl-betterSideBackground_q18q-' : 'wcl-worseSideOrEqualBackground_Zhv0n';
1302            var awayClass = awayValue > homeValue ? 'wcl-betterSideBackground_q18q-' : 'wcl-worseSideOrEqualBackground_Zhv0n';
1303
1304            // 根据type获取语言文本
1305            var statName = language['stats_' + statType] || 'Stat ' + statType;
1306
1307            html += '<div class="wcl-row_2oCpS">';
1308            html += '<div class="wcl-category_Ydwqh">';
1309            html += '<div class="wcl-value_XJG99 wcl-homeValue_3Q-7P">';
1310            html += '<strong class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-bold_MMDhq">' + homePercent + '%</strong>';
1311            html += '</div>';
1312            html += '<div class="wcl-category_6sT1J">';
1313            html += '<strong class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-bold_MMDhq">' + statName + '</strong>';
1314            html += '</div>';
1315            html += '<div class="wcl-value_XJG99 wcl-awayValue_Y-QR1">';
1316            html += '<strong class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-bold_MMDhq">' + awayPercent + '%</strong>';
1317            html += '</div>';
1318            html += '</div>';
1319            html += '<div class="wcl-charts_UfKzp">';
1320            html += '<div class="wcl-chart_-31bu wcl-home_yQ91A">';
1321            html += '<div class="' + homeClass + '" style="width: ' + homePercent + '%;"></div>';
1322            html += '</div>';
1323            html += '<div class="wcl-chart_-31bu">';
1324            html += '<div class="' + awayClass + '" style="width: ' + awayPercent + '%;"></div>';
1325            html += '</div>';
1326            html += '</div>';
1327            html += '</div>';
1328        });
1329    }
1330
1331    // 如果没有生成任何内容,显示空数据
1332    if (!html) {
1333        html += `<div class="empty_data">${language.empty}</div>`;
1334    }
1335
1336    return html;
1337}// 生成比赛阵容HTML
1338function generateMatchLineupHtml(matchInfo, lineup) {
1339    var html = '<div class="match-lineup">';
1340
1341    if (lineup.home && lineup.away) {
1342        // 主队阵容
1343        html += '<div class="team-lineup home-lineup">';
1344        html += '<h3>' + matchInfo.home_name + '</h3>';
1345        html += '<div class="formation">' + (lineup.home.formation || 'N/A') + '</div>';
1346
1347        if (lineup.home.players) {
1348            html += '<div class="players-list">';
1349            lineup.home.players.forEach(function(player) {
1350                html += '<div class="player-item">';
1351                html += '<span class="player-number">' + (player.number || '') + '</span>';
1352                html += '<span class="player-name">' + (player.name || '') + '</span>';
1353                html += '<span class="player-position">' + (player.position || '') + '</span>';
1354                html += '</div>';
1355            });
1356            html += '</div>';
1357        }
1358
1359        html += '</div>';
1360
1361        // 客队阵容
1362        html += '<div class="team-lineup away-lineup">';
1363        html += '<h3>' + matchInfo.away_name + '</h3>';
1364        html += '<div class="formation">' + (lineup.away.formation || 'N/A') + '</div>';
1365
1366        if (lineup.away.players) {
1367            html += '<div class="players-list">';
1368            lineup.away.players.forEach(function(player) {
1369                html += '<div class="player-item">';
1370                html += '<span class="player-number">' + (player.number || '') + '</span>';
1371                html += '<span class="player-name">' + (player.name || '') + '</span>';
1372                html += '<span class="player-position">' + (player.position || '') + '</span>';
1373                html += '</div>';
1374            });
1375            html += '</div>';
1376        }
1377
1378        html += '</div>';
1379    }
1380
1381    html += '</div>';
1382    return html;
1383}
1384
1385// 生成比赛列表HTML(通用方法,用于正面交锋、主队历史、客队历史)
1386function generateMatchListHtml(matchData, listType) {
1387    let html = '';
1388
1389    if (!Array.isArray(matchData) || matchData.length === 0) {
1390        return `<div class="empty_data">${language.empty}</div>`;
1391    }
1392
1393    // 历史比赛只显示已结束的比赛
1394    matchData.forEach((match, index) => {
1395        // 确定是否是最后一场比赛
1396        let isLastClass = index === matchData.length - 1 ? 'event__match--last' : '';
1397
1398        // 格式化比赛时间和日期
1399        const formattedDate = formatDate('d-m', match.match_time);
1400        const formattedTime = formatDate('H:i', match.match_time);
1401
1402        // 根据运动类型获取比分
1403        let homeScore, awayScore, scoreDetails = '';
1404
1405        if (sportType === 'basketball') {
1406            // 篮球:计算四节总分
1407            homeScore = (match.home_scores[0] || 0) + (match.home_scores[1] || 0) + (match.home_scores[2] || 0) + (match.home_scores[3] || 0);
1408            awayScore = (match.away_scores[0] || 0) + (match.away_scores[1] || 0) + (match.away_scores[2] || 0) + (match.away_scores[3] || 0);
1409
1410            // 篮球节比分详情
1411            scoreDetails = `
1412                <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home1">${match.home_scores[0] || 0}</span>
1413                <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away1">${match.away_scores[0] || 0}</span>
1414                <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home2">${match.home_scores[1] || 0}</span>
1415                <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away2">${match.away_scores[1] || 0}</span>
1416                <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home3">${match.home_scores[2] || 0}</span>
1417                <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away3">${match.away_scores[2] || 0}</span>
1418                <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home4">${match.home_scores[3] || 0}</span>
1419                <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away4">${match.away_scores[3] || 0}</span>
1420            `;
1421        } else {
1422            // 足球:获取比分
1423            homeScore = match.home_scores[0] || 0;
1424            awayScore = match.away_scores[0] || 0;
1425
1426            // 足球角球数详情
1427            scoreDetails = `
1428                <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__part--home event__part--1"><img src="${theme_uri}/assets/img/corner.png">${match.home_scores[4] > 0 ? match.home_scores[4] : '-' }</span>
1429                <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__part--away event__part--1"><img src="${theme_uri}/assets/img/corner.png">${match.away_scores[4] > 0 ? match.away_scores[4] : '-'}</span>
1430            `;
1431        }
1432
1433        // 历史比赛都是已结束的比赛,使用 finished 状态
1434        const statusClass = sportType === 'basketball' ? 'event__match--finished bb' : 'event__match--finished';
1435
1436        // 根据列表类型确定是否高亮显示获胜比赛
1437        let winnerClass = '';
1438        if (listType === 'home') {
1439            // 主队历史:高亮主队获胜的比赛
1440            winnerClass = homeScore > awayScore ? 'event__match--winner' : '';
1441        } else if (listType === 'away') {
1442            // 客队历史:高亮客队获胜的比赛
1443            winnerClass = awayScore > homeScore ? 'event__match--winner' : '';
1444        }
1445        // 正面交锋(h2h)不高亮任何一方
1446
1447        // 生成比赛HTML
1448        html += `
1449            <div class="event__match event__match--withRowLink ${statusClass} ${isLastClass} ${winnerClass} event__match--twoLine" id="${listType}_${match.match_id}">
1450                <a href="${matchinfo_page[sportType]}${match.match_id}" target="_self" title="${language.look_match_info}" class="eventRowLink"></a>
1451                <div class="event__time">${formattedDate} ${formattedTime}</div>
1452                <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--home">${homeScore}</span>
1453                <span class="wcl-matchRowScore_fWR-Z wcl-isFinal_7U4ca event__score event__score--away">${awayScore}</span>
1454                ${scoreDetails}
1455                <div class="wcl-participant_bctDY event__homeParticipant">
1456                    <img class="wcl-assetContainer_KJQf9 wcl-logo_UrSpU wcl-sizeXXS_CNb8a" alt="${match.home_name}" loading="lazy" src="${match.home_logo}" onerror="this.src='${theme_uri}/assets/img/team_default.png'">
1457                    <span class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-name_jjfMf">${match.home_name}</span>
1458                </div>
1459                <div class="wcl-participant_bctDY event__awayParticipant">
1460                    <img class="wcl-assetContainer_KJQf9 wcl-logo_UrSpU wcl-sizeXXS_CNb8a" alt="${match.away_name}" loading="lazy" src="${match.away_logo}" onerror="this.src='${theme_uri}/assets/img/team_default.png'">
1461                    <span class="wcl-simpleText_2t3pL wcl-scores-simple-text-01_8lVyp wcl-name_jjfMf">${match.away_name}</span>
1462                </div>
1463            </div>
1464        `;
1465    });
1466
1467    return html;
1468}
1469
1470
1471
1472// 生成比赛详情页积分榜HTML(不包含Form字段)
1473function generateMatchTableHtml(data, sportType) {
1474    if (!data.list || data.list.length === 0) {
1475        return `<div class="empty_data">${language.empty}</div>`;
1476    }
1477
1478    var lang = sportType === 'basketball' ? bb_language['intergal'] : language['intergal'];
1479    var html = '';
1480    var promotions_html = '';
1481
1482    // 生成 promotions HTML
1483    if (data.promotions && Object.keys(data.promotions).length > 0) {
1484        promotions_html = '<div class="tableLegend"><div class="tableLegend__rank">';
1485        Object.values(data.promotions).forEach(promo => {
1486            promotions_html += `
1487                <div class="tableLegend__row">
1488                    <div class="tableLegend__coloredSquare" style="background-color: ${promo.color};"></div>
1489                    <span>${promo.name_en}</span>
1490                </div>
1491            `;
1492        });
1493        promotions_html += '</div></div>';
1494    }
1495
1496    // 生成排行榜 HTML
1497    html = '<div id="tournament-table" class="tournament-table-standings">';
1498    html += '<div id="tournament-table-tabs-and-content">';
1499    html += '<div class="tableWrapper">';
1500    html += '<div class="ui-table">';
1501
1502    // 生成表格内容
1503    html += '<div class="ui-table__body">';
1504
1505    data.list.forEach(function(group) {
1506        // 为每个组生成表头
1507        html += '<div class="ui-table__header">';
1508        if (data.list.length > 1) {
1509            // 多个组时,排名列显示组名
1510            html += '<div class="ui-table__headerCell table__headerCell--rank ui-table__headerCell--sortable ui-table__headerCell--sorted" role="button" tabindex="0">' + group.group + '</div>';
1511        } else {
1512            // 单个组时,显示#
1513            html += '<div class="ui-table__headerCell table__headerCell--rank ui-table__headerCell--sortable ui-table__headerCell--sorted" role="button" tabindex="0">#</div>';
1514        }
1515        html += '<div class="ui-table__headerCell table__headerCell--participant ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[0] + '</div>';
1516        html += '<div class="ui-table__headerCell ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[1] + '</div>';
1517
1518        // 根据运动类型显示不同的列
1519        if (sportType === 'basketball') {
1520            // 篮球没有平局,只显示胜场和负场
1521            html += '<div class="ui-table__headerCell ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[2] + '</div>';
1522            html += '<div class="ui-table__headerCell ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[4] + '</div>';
1523        } else {
1524            // 足球显示胜、平、负
1525            html += '<div class="ui-table__headerCell ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[2] + '</div>';
1526            html += '<div class="ui-table__headerCell ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[3] + '</div>';
1527            html += '<div class="ui-table__headerCell ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[4] + '</div>';
1528        }
1529
1530        html += '<div class="ui-table__headerCell table__cell--score ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[5] + '</div>';
1531
1532        // 只有足球显示净胜球
1533        if (sportType !== 'basketball') {
1534            html += '<div class="ui-table__headerCell table__cell--goalsForAgainstDiff ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[7] + '</div>';
1535        }
1536
1537        html += '<div class="ui-table__headerCell table__cell--points ui-table__headerCell--sortable" role="button" tabindex="0">' + lang[8] + '</div>';
1538        // 注意:这里不添加 Form 字段的表头
1539        html += '</div>';
1540
1541        group.list.forEach(function(team, index) {
1542            var promotionColor = team.promotion_id > 0 && data.promotions[team.promotion_id] ? data.promotions[team.promotion_id].color : '';
1543            var rankStyle = promotionColor ? `style="--color: ${promotionColor}"` : '';
1544
1545            html += '<div class="ui-table__row" ' + rankStyle + '>';
1546            html += '<div class="table__cell table__cell--rank table__cell--sorted">';
1547            html += '<div class="tableCellRank" title="">' + (index + 1) + '.</div>';
1548            html += '</div>';
1549
1550            html += '<div class="table__cell table__cell--participant">';
1551            html += '<div class="tableCellParticipant">';
1552            html += '<div class="tableCellParticipant__block">';
1553            html += '<a class="tableCellParticipant__image" href="' + team_page[sportType] + (team.team_id ?? team.id) + '" target="_self" title="' + team.name + '">';
1554            html += '<img class="participant__image" loading="lazy" alt="' + team.name + '" src="' + team.logo + '" onerror="this.src=\'' + theme_uri + '/assets/img/team_default.png\'">';
1555            html += '</a>';
1556            html += '<a href="' + team_page[sportType] + (team.team_id ?? team.id) + '" target="_self" class="tableCellParticipant__name">' + team.name + '</a>';
1557            html += '</div>';
1558            html += '</div>';
1559            html += '</div>';
1560
1561            html += '<span class="table__cell table__cell--value">' + team.total + '</span>';
1562
1563            // 根据运动类型显示不同的数据
1564            if (sportType === 'basketball') {
1565                // 篮球:只显示胜场和负场
1566                html += '<span class="table__cell table__cell--value">' + team.won + '</span>';
1567                html += '<span class="table__cell table__cell--value">' + team.loss + '</span>';
1568            } else {
1569                // 足球:显示胜、平、负
1570                html += '<span class="table__cell table__cell--value">' + team.won + '</span>';
1571                html += '<span class="table__cell table__cell--value">' + (team.draw || 0) + '</span>';
1572                html += '<span class="table__cell table__cell--value">' + team.loss + '</span>';
1573            }
1574
1575            html += '<span class="table__cell table__cell--value table__cell--score">' + team.goals + ':' + team.goals_against + '</span>';
1576
1577            // 只有足球显示净胜球
1578            if (sportType !== 'basketball') {
1579                html += '<span class="table__cell table__cell--value table__cell--goalsForAgainstDiff">' + team.goal_diff + '</span>';
1580            }
1581
1582            html += '<span class="table__cell table__cell--value table__cell--points">' + team.points + '</span>';
1583            // 注意:这里不添加 Form 字段的内容
1584
1585            html += '</div>';
1586        });
1587    });
1588
1589    html += '</div>';
1590    html += '</div>';
1591    html += '</div>';
1592    html += promotions_html;
1593    html += '</div>';
1594    html += '</div>';
1595
1596    return html;
1597}
1598
1599// 页面加载完成后执行
1600jQuery(document).ready(function () {
1601    jQuery('body').removeClass('isSportPage','tournament-page','team-page');
1602    if (page_slug == 'home') {
1603        jQuery('body').addClass('isSportPage');
1604
1605        get_country_list(sportType);
1606        get_category_list(sportType);
1607        get_match_result(sportType,1, real_day);
1608    }
1609
1610    if (page_slug == 'league') {
1611        jQuery('body').addClass('tournament-page');
1612
1613        get_country_list(sportType);
1614        get_category_list(sportType);
1615        get_league_info(sportType,leagueId);
1616    }
1617
1618    if (page_slug == 'team') {
1619        jQuery('body').addClass('team-page');
1620
1621        get_country_list(sportType);
1622        get_category_list(sportType);
1623        get_team_info(sportType,teamId);
1624    }
1625
1626    if (page_slug == 'matchInfo') {
1627        jQuery('body').addClass('team-page');
1628
1629        get_country_list(sportType);
1630        get_category_list(sportType);
1631        get_match_info(sportType,matchId);
1632    }
1633
1634
1635    // 切换足球/篮球
1636    jQuery('.menuTop__item').click(function(){
1637        let selectedType = jQuery(this).data('type');
1638        if( sportType != selectedType ){
1639            sportType = selectedType;
1640            // 切换菜单高亮
1641            jQuery('.menuTop__item').removeClass('menuTop__item--active');
1642            jQuery(this).addClass('menuTop__item--active');
1643
1644            // 切换热门联赛列表显示
1645            jQuery('.leftMenu__list').removeClass('active');
1646
1647            if (sportType === 'basketball') {
1648                jQuery('.basketball-league-list').addClass('active');
1649            } else {
1650                jQuery('.football-league-list').addClass('active');
1651            }
1652
1653            // 获取左侧菜单数据
1654
1655            get_country_list(sportType);
1656            get_category_list(sportType);
1657
1658            // 获取赛程赛果数据
1659            get_match_result(sportType,1, real_day);
1660        }
1661    });
1662
1663    // 左侧菜单 国家 点击事件
1664    jQuery('.country_list').on('click','.lmc__item',function(){
1665        let sportType = jQuery(this).data('ctype');
1666        let countryId = jQuery(this).data('id');
1667        let _that = jQuery(this);
1668
1669        if( !_that.parent().hasClass('lmc__blockOpened') ){
1670            if( !_that.next().hasClass('lmc__template') ){
1671                _that.parent().addClass('lmc__blockOpened');
1672                _that.addClass('lmc__itemOpen');
1673                if( !_that.next().hasClass(`${sportType}_${countryId}`) ){
1674                    _that.after(`<div class="${sportType}_${countryId}"><div class="ajax-loading"><div class="loading-line" style="width: 70%;height:15px;"></div><div class="loading-line" style="width: 70%;height:15px;"></div><div class="loading-line" style="width: 70%;height:15px;"></div></div></div>`);
1675                }
1676
1677                jQuery.ajax({
1678                    url: `${apiUrl[sportType]}/country/competition?id=${countryId}`,
1679                    type: 'GET',
1680                    dataType: 'json',
1681                    success: function (res) {
1682                        // 处理数据
1683                        let html = competitionListHtml(sportType,res.data);
1684                        _that.next().remove();
1685                        _that.after(html);
1686                    }
1687                });
1688            }else{
1689                _that.parent().addClass('lmc__blockOpened');
1690                _that.addClass('lmc__itemOpen');
1691            }
1692        }else{
1693            _that.parent().removeClass('lmc__blockOpened');
1694            _that.removeClass('lmc__itemOpen');
1695        }
1696    });
1697
1698    // 左侧菜单 分类 点击事件
1699    jQuery('.category_list').on('click','.lmc__item',function(){
1700        let sportType = jQuery(this).data('ctype');
1701        let countryId = jQuery(this).data('id');
1702        let _that = jQuery(this);
1703
1704        if( !_that.parent().hasClass('lmc__blockOpened') ){
1705            if( !_that.next().hasClass('lmc__template') ){
1706                _that.parent().addClass('lmc__blockOpened');
1707                _that.addClass('lmc__itemOpen');
1708                if( !_that.next().hasClass(`${sportType}_${countryId}`) ){
1709                    _that.after(`<div class="${sportType}_${countryId}"><div class="ajax-loading"><div class="loading-line" style="width: 70%;height:15px;"></div><div class="loading-line" style="width: 70%;height:15px;"></div><div class="loading-line" style="width: 70%;height:15px;"></div></div></div>`);
1710                }
1711
1712                jQuery.ajax({
1713                    url: `${apiUrl[sportType]}/category/competition?id=${countryId}`,
1714                    type: 'GET',
1715                    dataType: 'json',
1716                    success: function (res) {
1717                        // 处理数据
1718                        let html = competitionListHtml(sportType,res.data);
1719                        _that.next().remove();
1720                        _that.after(html);
1721                    }
1722                });
1723            }else{
1724                _that.parent().addClass('lmc__blockOpened');
1725                _that.addClass('lmc__itemOpen');
1726            }
1727        }else{
1728            _that.parent().removeClass('lmc__blockOpened');
1729            _that.removeClass('lmc__itemOpen');
1730        }
1731    });
1732
1733    // 赛事列表 top事件
1734    jQuery('.filters .filters__group .filters__tab').click(function(){
1735        let type = jQuery(this).data('type');
1736        jQuery(this).addClass('selected').siblings().removeClass('selected');
1737        if( type == 'live' ){
1738            jQuery('.filters .calendarContainer').hide();
1739            get_match_result(sportType,1,real_day,function(){
1740                jQuery('.match-lists .event__match').hide();
1741                jQuery('.match-lists .event__match.event__match--live').show();
1742                checkAndHideEmptyLeagues();
1743            });
1744
1745        }else{
1746            jQuery('.match-lists .event__match').show();
1747
1748            jQuery('.filters .calendarContainer').show();
1749            let date = jQuery('.btn-ddmmyy.active').data('date');
1750            if( date == undefined ){
1751                date = real_day;
1752            }
1753
1754            if( date == real_day ){
1755                if( type == 'all' ){
1756                    get_match_result(sportType,1,date);
1757                } else if( type == 'scheduled' ){
1758                    get_match_result(sportType,1,date,function(){
1759                        jQuery('.match-lists .event__match.event__match--live').hide();
1760                        checkAndHideEmptyLeagues();
1761                    });
1762                }else{
1763                    get_match_result(sportType,0,date);
1764                }
1765            }else{
1766                get_match_result(sportType,real_day > date ? 0 : 1,date);
1767            }
1768        }
1769    });
1770
1771    // tab 切换事件
1772    jQuery('.tabs__tab').click(function(){
1773        let tabId = jQuery(this).attr('id');
1774
1775        // 切换 tab 选中状态
1776        jQuery(this).addClass('selected').siblings().removeClass('selected');
1777
1778        // 隐藏所有 section.event 元素
1779        jQuery('#live-table section.event').hide();
1780
1781        // 对于其他 tab,显示对应类名的 section
1782        jQuery(`#live-table section.event.${tabId}`).show();
1783
1784        if( sportType == 'basketball' ){
1785            jQuery('#live-table section.event.match_stats').hide();
1786            jQuery('#live-table section.event.match_lineup').hide();
1787        }
1788    });
1789});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.