{"id":454,"date":"2025-11-29T00:37:22","date_gmt":"2025-11-29T00:37:22","guid":{"rendered":"https:\/\/homenorthbaseball.ca\/LNH\/?page_id=454"},"modified":"2025-12-07T03:01:02","modified_gmt":"2025-12-07T03:01:02","slug":"career-stats","status":"publish","type":"page","link":"https:\/\/homenorthbaseball.ca\/LNH\/career-stats\/","title":{"rendered":"Career Stats"},"content":{"rendered":"\n<h4 class=\"wp-block-heading has-text-align-center\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">CAREER STATS 2006-PRESENT<\/h4>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>LNH Player Career Stats<\/title>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Roboto:wght@400;500;700&#038;display=swap\" rel=\"stylesheet\">\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/PapaParse\/5.4.1\/papaparse.min.js\"><\/script>\n    <style>\n        body {font-family:'Roboto',Arial,sans-serif;margin:0;padding:0px;background:#f4f4f4;color:#333;}\n        .search-container {background:#980000;padding:20px;text-align:center;margin-bottom:30px;border-radius:8px;}\n        .search-container label {color:white;font-size:16px;font-weight:700;}\n        input[type=\"text\"] {padding:12px;width:340px;font-size:16px;border:none;border-radius:4px;margin:0 10px;}\n        button {padding:12px 28px;font-size:16px;background:white;color:#980000;border:none;border-radius:4px;cursor:pointer;font-weight:700;}\n        button:hover {background:#f0f0f0;}\n        h2 {text-align:center;color:#980000;margin:30px 0 10px;font-size:28px;font-weight:700;}\n        table {\n            width:100%;\n            border-collapse:collapse;\n            background:white;\n            margin:20px 0;\n            box-shadow:0 4px 12px rgba(0,0,0,0.1);\n            border:1px solid #980000;\n            font-size:15px;\n        }\n        th, td {\n            border: 1px solid black !important;\n            padding:12px 8px;\n            text-align:center;\n        }\n        th {\n            background:#980000;\n            color:white;\n            font-weight:700;\n            text-transform:uppercase;\n        }\n        tr:nth-child(even) {background-color:#f9f9f9;}\n        tr:hover {background-color:#d9d9d9;}\n       \n        .total-row {\n            background:#d9d9d9 !important;\n            font-weight:700;\n            border-top:4px double #980000;\n            border-bottom:4px double #980000;\n        }\n        .total-row td {color:#980000;font-weight:700;}\n        .no-data {text-align:center;color:#666;font-style:italic;padding:50px;font-size:18px;}\n       \n        @media (max-width:768px){\n            .table-wrapper{overflow-x:auto;-webkit-overflow-scrolling:touch;}\n            table{min-width:1000px;}\n            input[type=\"text\"]{width:70%;max-width:280px;}\n        }\n\/* FREEZE YEAR COLUMN \u2014 MOBILE ONLY *\/\n@media (max-width: 768px) {\n    table {\n        border-collapse: separate;\n        border-spacing: 0;\n    }\n\n    \/* Freeze the very first column (YEAR) *\/\n    th:first-child,\n    td:first-child {\n        position: sticky;\n        left: 0;\n        background: white;\n        z-index: 10;\n        min-width: 90px;               \/* gives a little breathing room *\/\n        box-shadow: 4px 0 8px -3px rgba(0,0,0,0.3);\n    }\n\n    \/* Keep the header red when frozen *\/\n    th:first-child {\n        background: #980000 !important;\n        color: white !important;\n        z-index: 11;\n    }\n\n    \/* Make sure the Career Totals row keeps your chosen color when frozen *\/\n    .total-row td:first-child {\n        background: #d9d9d9\n !important;   \/* \u2190 change only if you use a different career row color *\/\n        color: #960000 !important;\n        font-weight: 700;\n    }\n}\n\n    <\/style>\n<\/head>\n<body>\n<div class=\"search-container\">\n    <label for=\"playerInput\">Select or type a player name:<\/label><br><br>\n    <input list=\"players\" id=\"playerInput\" placeholder=\"Start typing player name...\" autocomplete=\"off\">\n    <datalist id=\"players\"><\/datalist>\n    <button id=\"showStats\">SHOW CAREER STATS<\/button>\n<\/div>\n<div id=\"statsContainer\"><\/div>\n\n<script>\n    const csvUrl = 'https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vRPEh-SZo6BnS_7aDHUmNPCGTF0BVVsgP0hxzLl0P4yOlfORLf2CyRbVdTb2QTAeVcl-ekVpIeTOZ6c\/pub?gid=1270105435&single=true&output=csv';\n    let allData = [];\n\n    fetch(csvUrl)\n        .then(r => r.text())\n        .then(text => {\n            Papa.parse(text, {\n                header: true,\n                skipEmptyLines: true,\n                complete: results => {\n                    allData = results.data;\n                    const players = [...new Set(allData.map(r => r.NAME).filter(Boolean))].sort();\n                    const datalist = document.getElementById('players');\n                    players.forEach(p => {\n                        const opt = document.createElement('option');\n                        opt.value = p;\n                        datalist.appendChild(opt);\n                    });\n                }\n            });\n        });\n\n    document.getElementById('showStats').addEventListener('click', showPlayerStats);\n    document.getElementById('playerInput').addEventListener('keypress', e => { if (e.key === 'Enter') showPlayerStats(); });\n\n    function showPlayerStats() {\n        const name = document.getElementById('playerInput').value.trim();\n        if (!name) return alert('Please enter a player name');\n\n        const rows = allData\n            .filter(r => r.NAME && r.NAME.trim() === name)\n            .sort((a, b) => (b.YEAR || 0) - (a.YEAR || 0)); \/\/ newest year first\n\n        if (rows.length === 0) {\n            document.getElementById('statsContainer').innerHTML = `<p class=\"no-data\">No career stats found for \"${name}\"<\/p>`;\n            return;\n        }\n\n        \/\/ === Calculate Career Totals ===\n        let tot = {GP:0, AB:0, R:0, H:0, '1B':0, '2B':0, '3B':0, HR:0, BB:0, HBP:0, SF:0, SAC:0};\n        rows.forEach(r => {\n            tot.GP += parseInt(r.GP)||0;\n            tot.AB += parseInt(r.AB)||0;\n            tot.R += parseInt(r.R)||0;\n            tot.H += parseInt(r.H)||0;\n            tot['1B'] += parseInt(r['1B'])||0;\n            tot['2B'] += parseInt(r['2B'])||0;\n            tot['3B'] += parseInt(r['3B'])||0;\n            tot.HR += parseInt(r.HR)||0;\n            tot.BB += parseInt(r.BB)||0;\n            tot.HBP += parseInt(r.HBP)||0;\n            tot.SF += parseInt(r.SF)||0;\n            tot.SAC += parseInt(r.SAC)||0;\n        });\n\n        const TB = tot['1B'] + 2*tot['2B'] + 3*tot['3B'] + 4*tot.HR;\n        const PA = tot.AB + tot.BB + tot.HBP + tot.SF + tot.SAC;\n        const AVG = tot.AB > 0 ? (tot.H \/ tot.AB).toFixed(3) : '.000';\n        const OBP = PA > 0 ? ((tot.H + tot.BB + tot.HBP) \/ PA).toFixed(3) : '.000';\n        const SLG = tot.AB > 0 ? (TB \/ tot.AB).toFixed(3) : '.000';\n        const OPS = (parseFloat(OBP) + parseFloat(SLG)).toFixed(3);\n\n        \/\/ === Build Table \u2013 Career row first ===\n        let html = `\n            <h2 style=\"color: #ffffff;\">${name}<\/h2>\n            <div class=\"table-wrapper\">\n                <table>\n                    <thead>\n                        <tr>\n                            <th>YEAR<\/th>\n                            <th>GP<\/th>\n                            <th>AB<\/th>\n                            <th>R<\/th>\n                            <th>H<\/th>\n                            <th>1B<\/th>\n                            <th>2B<\/th>\n                            <th>3B<\/th>\n                            <th>HR<\/th>\n                            <th>BB<\/th>\n                            <th>AVG<\/th>\n                            <th>OBP<\/th>\n                            <th>SLG<\/th>\n                            <th>OPS<\/th>\n                            <th>OPS+<\/th>\n                        <\/tr>\n                    <\/thead>\n                    <tbody>\n\n                    <!-- CAREER TOTALS ROW (now at the top) -->\n                    <tr class=\"total-row\">\n                        <td><strong>CAREER<\/strong><\/td>\n                        <td><strong>${tot.GP}<\/strong><\/td>\n                        <td><strong>${tot.AB}<\/strong><\/td>\n                        <td><strong>${tot.R}<\/strong><\/td>\n                        <td><strong>${tot.H}<\/strong><\/td>\n                        <td><strong>${tot['1B']}<\/strong><\/td>\n                        <td><strong>${tot['2B']}<\/strong><\/td>\n                        <td><strong>${tot['3B']}<\/strong><\/td>\n                        <td><strong>${tot.HR}<\/strong><\/td>\n                        <td><strong>${tot.BB}<\/strong><\/td>\n                        <td><strong>${AVG}<\/strong><\/td>\n                        <td><strong>${OBP}<\/strong><\/td>\n                        <td><strong>${SLG}<\/strong><\/td>\n                        <td><strong>${OPS}<\/strong><\/td>\n                        <td><strong>-<\/strong><\/td>\n                    <\/tr>\n\n                    <!-- Individual season rows -->\n        `;\n\n        rows.forEach(r => {\n            html += `<tr>\n                <td><strong>${r.YEAR||''}<\/strong><\/td>\n                <td>${r.GP||0}<\/td>\n                <td>${r.AB||0}<\/td>\n                <td>${r.R||0}<\/td>\n                <td>${r.H||0}<\/td>\n                <td>${r['1B']||0}<\/td>\n                <td>${r['2B']||0}<\/td>\n                <td>${r['3B']||0}<\/td>\n                <td>${r.HR||0}<\/td>\n                <td>${r.BB||0}<\/td>\n                <td>${r.AVG||'.000'}<\/td>\n                <td>${r.OBP||'.000'}<\/td>\n                <td>${r.SLG||'.000'}<\/td>\n                <td>${r.OPS||'.000'}<\/td>\n                <td>${r['OPS+']||'-'}<\/td>\n            <\/tr>`;\n        });\n\n        html += `\n                    <\/tbody>\n                <\/table>\n            <\/div>`;\n\n        document.getElementById('statsContainer').innerHTML = html;\n    }\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>CAREER STATS 2006-PRESENT LNH Player Career Stats Select or type a player name: SHOW CAREER STATS<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-454","page","type-page","status-publish","hentry"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/homenorthbaseball.ca\/LNH\/wp-json\/wp\/v2\/pages\/454","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/homenorthbaseball.ca\/LNH\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/homenorthbaseball.ca\/LNH\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/homenorthbaseball.ca\/LNH\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/homenorthbaseball.ca\/LNH\/wp-json\/wp\/v2\/comments?post=454"}],"version-history":[{"count":41,"href":"https:\/\/homenorthbaseball.ca\/LNH\/wp-json\/wp\/v2\/pages\/454\/revisions"}],"predecessor-version":[{"id":738,"href":"https:\/\/homenorthbaseball.ca\/LNH\/wp-json\/wp\/v2\/pages\/454\/revisions\/738"}],"wp:attachment":[{"href":"https:\/\/homenorthbaseball.ca\/LNH\/wp-json\/wp\/v2\/media?parent=454"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}