New Try Code
New Try Code
DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>ISL FOOTBALL PLAYERS PERFORMANCE ANALYSIS</title>
<link
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/tailwind.min.c
ss" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/[email protected]/papaparse.min.js"></scr
ipt>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-image: url('background.JPG');
background-size: cover;
background-position: center;
background-attachment: fixed;
color: white;
transition: background-color 0.3s, color 0.3s;
}
.dark-mode { background-color: #1e293b; color: white; }
.login-overlay {
position: fixed; top: 0; left: 0; width: 100vw; height: 100vh;
background: rgba(0,0,0,0.7);
display: flex; align-items: center; justify-content: center;
z-index: 1000;
backdrop-filter: blur(4px);
}
.login-form {
background: rgba(34,34,34,0.95);
padding: 2.5rem 2.5rem 2rem 2.5rem;
border-radius: 1.5rem;
box-shadow: 0 12px 40px rgba(0,0,0,0.35);
min-width: 340px;
animation: popIn 0.7s cubic-bezier(.25,.8,.25,1);
}
@keyframes popIn {
0% { transform: scale(0.85); opacity: 0; }
100% { transform: scale(1); opacity: 1; }
}
.login-form input {
background: #18181b;
color: #facc15;
border: 1px solid #555;
font-size: 1rem;
transition: border 0.2s;
width: 100%; margin-bottom: 1rem; padding: 0.5rem;
border-radius: 0.5rem;
}
.login-form input:focus {
border: 1.5px solid #facc15;
outline: none;
}
.login-form button {
width: 100%;
background: linear-gradient(90deg, #facc15 60%, #4ade80 100%);
color: #222;
font-size: 1.1rem;
font-weight: bold;
letter-spacing: 0.5px;
box-shadow: 0 4px 16px rgba(250,204,21,0.08);
padding: 0.5rem;
border-radius: 0.5rem;
border: none;
cursor: pointer;
transition: background 0.2s, box-shadow 0.2s;
}
.login-form button:hover {
background: linear-gradient(90deg, #fbbf24 40%, #22d3ee 100%);
box-shadow: 0 8px 32px rgba(34,197,94,0.12);
}
#projectDescModal {
display: none;
position: fixed; top: 0; left: 0; width: 100vw; height: 100vh;
background: rgba(0,0,0,0.7);
z-index: 2000;
align-items: center; justify-content: center;
}
#projectDescModal.active { display: flex; }
#projectDescModal .modal-content {
background: #18181b;
color: #facc15;
padding: 2.5rem 2rem 2rem 2rem;
border-radius: 1.25rem;
min-width: 340px;
max-width: 95vw;
box-shadow: 0 8px 32px rgba(0,0,0,0.25);
animation: popIn 0.7s cubic-bezier(.25,.8,.25,1);
position: relative;
}
.close-btn {
position: absolute; top: 18px; right: 28px;
background: none; border: none; font-size: 2rem; color: #f87171;
cursor: pointer;
}
.comparison-card {
background: linear-gradient(135deg, #facc15 0%, #4ade80 100%);
border-radius: 16px;
box-shadow: 0 8px 32px rgba(0,0,0,0.2);
padding: 24px;
margin: 12px;
transition: transform 0.3s;
color: #222;
text-align: center;
}
.comparison-card:hover { transform: scale(1.04); }
.comparison-card img {
width: 80px; height: 80px; border-radius: 50%;
border: 4px solid #fbbf24; margin-bottom: 10px; object-fit: cover;
}
.comparison-container {
display: flex; justify-content: center; gap: 20px; flex-wrap: wrap;
margin-top: 20px;
}
.player-details {
background-color: rgba(0, 0, 0, 0.7);
padding: 20px;
border-radius: 8px;
margin-top: 20px;
max-width: 600px;
margin-left: auto;
margin-right: auto;
color: white;
}
.player-details img { width: 150px; border-radius: 8px; margin-
bottom: 10px; }
table { border-collapse: collapse; width: 100%; font-size: 0.8rem; }
th, td { border: 1px solid #444; padding: 6px 8px; text-align: left;
}
th { background-color: #333; color: #facc15; }
.overflow-auto { overflow-x: auto; }
/* Smaller Best XI cards */
#bestXICardView {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
gap: 10px;
margin-top: 20px;
}
#bestXICardView .comparison-card {
padding: 10px;
margin: 0;
font-size: 0.85rem;
border-radius: 10px;
}
#bestXICardView .comparison-card img {
width: 48px;
height: 48px;
margin-bottom: 6px;
border-width: 2px;
}
#bestXICardView .comparison-card h3 {
font-size: 1rem;
margin-bottom: 2px;
}
</style>
</head>
<body class="dark-mode p-4">
<!-- Login Overlay -->
<div id="loginOverlay" class="login-overlay">
<div class="login-form">
<h2 class="text-2xl font-bold text-center mb-6 text-yellow-300">ISL
Analysis Dashboard</h2>
<input type="text" id="username" placeholder="Enter your username"
autocomplete="username" />
<input type="password" id="password" placeholder="Enter your
password" autocomplete="current-password" />
<button id="loginBtn">LOGIN</button>
</div>
</div>
<script>
window.chartInstance = null;
let playerData = [];
// Login logic
$('#loginBtn').on('click', function() {
$('#loginOverlay').hide();
$('#dashboardContent').show();
$('#userDisplay').text('Welcome, ' + $('#username').val());
loadSampleData();
});
$('#logoutBtn').on('click', function() {
$('#dashboardContent').hide();
$('#loginOverlay').show();
});
// Hide Table
let tableVisible = true;
$('#toggleTableBtn').on('click', function() {
tableVisible = !tableVisible;
if (tableVisible) {
$('#tableContainer').show();
$(this).text('Hide Table');
} else {
$('#tableContainer').hide();
$(this).text('Show Table');
}
});
function updateAllSections() {
populateTable(playerData);
populatePlayerDropdowns(playerData);
updateAutocomplete(playerData);
}
function populateTable(data) {
if (!data.length) return $('#tableContainer').html('');
let headers = Object.keys(data[0]);
let html = '<table class="min-w-full text-xs"><thead><tr>' +
headers.map(h => `<th class="px-2 py-1">${h}</th>`).join('') +
'</tr></thead><tbody>' +
data.map(row => '<tr>' + headers.map(h => `<td class="px-2 py-
1">${row[h]}</td>`).join('') + '</tr>').join('') +
'</tbody></table>';
$('#tableContainer').html(html);
}
function populatePlayerDropdowns(data) {
let options = data.map(p => `<option
value="${p.Player}">${p.Player}</option>`).join('');
$('#comparePlayer1').html('<option value="">Select Player
1</option>' + options);
$('#comparePlayer2').html('<option value="">Select Player
2</option>' + options);
}
function updateAutocomplete(data) {
$('#playerSearch').off('input').on('input', function() {
const val = $(this).val().toLowerCase();
if (!val) {
$('#autocompleteSuggestions').addClass('hidden').empty();
return;
}
const matches = data.filter(p =>
p.Player.toLowerCase().includes(val));
if (matches.length === 0) {
$('#autocompleteSuggestions').addClass('hidden').empty();
return;
}
$('#autocompleteSuggestions').removeClass('hidden').html(
matches.map(m => `<div class="px-3 py-2 cursor-pointer
hover:bg-yellow-500" data-
player="${m.Player}">${m.Player}</div>`).join('')
);
});
$('#autocompleteSuggestions').off('click').on('click', 'div',
function() {
const playerName = $(this).data('player');
$('#playerSearch').val(playerName);
$('#autocompleteSuggestions').addClass('hidden').empty();
const player = playerData.find(p => p.Player === playerName);
if (player) showPlayerDetails(player);
});
}
function showPlayerDetails(player) {
$('#playerDetails').removeClass('hidden').html(`
<div>
<img src="${player.playersimages}" alt="${player.Player}"
style="max-width:120px;">
<h3 class="text-xl font-bold mt-2 mb-1">${player.Player}</h3>
<p class="mb-2">${player.Position} | ${player.Nation} | Age:
${player.Age}</p>
<div class="grid grid-cols-2 gap-2 text-sm">
<div>Goals:</div><div class="font-bold">${player.Goals}</div>
<div>Assists:</div><div class="font-
bold">${player.Assists}</div>
<div>Market Value:</div><div class="font-bold text-green-
300">₹${player.Marketvalueincrores} Cr</div>
<div>Club:</div><div>${player.CLUB}</div>
<div>Yellow Cards:</div><div>${player.Yellowcard}</div>
<div>Red Cards:</div><div>${player.Redcard}</div>
</div>
</div>
`);
}
$('#compareBtn').on('click', function() {
let p1 = $('#comparePlayer1').val();
let p2 = $('#comparePlayer2').val();
if (!p1 || !p2) {
alert('Please select two players to compare.');
return;
}
if (p1 === p2) {
alert('Please select two different players.');
return;
}
let player1 = playerData.find(p => p.Player === p1);
let player2 = playerData.find(p => p.Player === p2);
if (!player1 || !player2) {
alert('Player data not found.');
return;
}
showComparison(player1, player2);
});
$('#generateChart').on('click', function() {
let type = $('#chartType').val();
let topN = parseInt($('#topN').val()) || 10;
let sorted, labels, data, label;
if (type === 'goals') {
sorted = playerData.slice().sort((a, b) => parseInt(b.Goals) -
parseInt(a.Goals));
labels = sorted.slice(0, topN).map(p => p.Player);
data = sorted.slice(0, topN).map(p => parseInt(p.Goals));
label = 'Goals';
} else if (type === 'assists') {
sorted = playerData.slice().sort((a, b) => parseInt(b.Assists) -
parseInt(a.Assists));
labels = sorted.slice(0, topN).map(p => p.Player);
data = sorted.slice(0, topN).map(p => parseInt(p.Assists));
label = 'Assists';
} else if (type === 'marketValue') {
sorted = playerData.slice().sort((a, b) =>
parseFloat(b.Marketvalueincrores) - parseFloat(a.Marketvalueincrores));
labels = sorted.slice(0, topN).map(p => p.Player);
data = sorted.slice(0, topN).map(p =>
parseFloat(p.Marketvalueincrores));
label = 'Market Value (Cr)';
} else if (type === 'ageDistribution') {
let ageBuckets = {};
playerData.forEach(p => {
let age = parseInt(p.Age);
let bucket = Math.floor(age / 5) * 5 + '-' + (Math.floor(age /
5) * 5 + 4);
ageBuckets[bucket] = (ageBuckets[bucket] || 0) + 1;
});
labels = Object.keys(ageBuckets);
data = Object.values(ageBuckets);
label = 'Players';
} else if (type === 'positionDistribution') {
let posBuckets = {};
playerData.forEach(p => {
let pos = p.Position;
posBuckets[pos] = (posBuckets[pos] || 0) + 1;
});
labels = Object.keys(posBuckets);
data = Object.values(posBuckets);
label = 'Players';
} else if (type === 'nationalityDistribution') {
let natBuckets = {};
playerData.forEach(p => {
let nat = p.Nation;
natBuckets[nat] = (natBuckets[nat] || 0) + 1;
});
labels = Object.keys(natBuckets);
data = Object.values(natBuckets);
label = 'Players';
}
if (window.chartInstance) window.chartInstance.destroy();
const ctx = document.getElementById('mainChart').getContext('2d');
window.chartInstance = new Chart(ctx, {
type: 'bar',
data: {
labels: labels,
datasets: [{
label: label,
data: data,
backgroundColor: 'rgba(250,204,21,0.7)'
}]
},
options: {
responsive: true,
plugins: { legend: { display: false } },
scales: {
x: { ticks: { color: '#fff' } },
y: { beginAtZero: true, ticks: { color: '#fff' } }
}
}
});
});
$('#featuresDropdown').on('change', function() {
let val = $(this).val();
$('#basicChartsSection, #heatmapSection,
#bestElevenSection').addClass('hidden');
if (val === 'basicCharts')
$('#basicChartsSection').removeClass('hidden');
if (val === 'heatmap') $('#heatmapSection').removeClass('hidden');
if (val === 'bestEleven')
$('#bestElevenSection').removeClass('hidden');
});
$('#generateBestXI').on('click', function() {
let formation = $('#formationSelect').val();
let metric = $('#bestXIMetric').val();
let sorted;
if (metric === 'goals') {
sorted = playerData.slice().sort((a, b) => parseInt(b.Goals) -
parseInt(a.Goals));
} else if (metric === 'assists') {
sorted = playerData.slice().sort((a, b) => parseInt(b.Assists) -
parseInt(a.Assists));
} else if (metric === 'marketValue') {
sorted = playerData.slice().sort((a, b) =>
parseFloat(b.Marketvalueincrores) - parseFloat(a.Marketvalueincrores));
} else {
sorted = playerData.slice().sort((a, b) => (
(parseInt(b.Goals) + parseInt(b.Assists) +
parseFloat(b.Marketvalueincrores)) -
(parseInt(a.Goals) + parseInt(a.Assists) +
parseFloat(a.Marketvalueincrores))
));
}
let bestXI = sorted.slice(0, 11);
$('#bestXICardView').html(
bestXI.map(p => `
<div class="comparison-card">
<img src="${p.playersimages}" alt="${p.Player}">
<h3 class="text-lg font-bold">${p.Player}</h3>
<p>${p.Position} | ${p.Nation}</p>
<div>Goals: <span class="font-bold">${p.Goals}</span></div>
<div>Assists: <span class="font-
bold">${p.Assists}</span></div>
<div>Market Value: <span class="font-bold text-green-
300">₹${p.Marketvalueincrores} Cr</span></div>
</div>
`).join('')
);
});
</script>
</body>
</html>