{"id":324,"date":"2025-07-03T22:43:11","date_gmt":"2025-07-03T22:43:11","guid":{"rendered":"https:\/\/avinya.me\/?page_id=324"},"modified":"2025-07-04T01:18:08","modified_gmt":"2025-07-04T01:18:08","slug":"player-page","status":"publish","type":"page","link":"https:\/\/avinya.me\/index.php\/player-page\/","title":{"rendered":"Player Page"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"324\" class=\"elementor elementor-324\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0c09582 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"0c09582\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4910f6d elementor-widget elementor-widget-html\" data-id=\"4910f6d\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n  <meta charset=\"UTF-8\" \/>\r\n  <title>Player Page<\/title>\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/>\r\n  <link href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.3\/dist\/css\/bootstrap.min.css\" rel=\"stylesheet\" \/>\r\n  <style>\r\n    body {\r\n      background: #f8f9fa;\r\n      padding-top: 2rem;\r\n    }\r\n\r\n    #autocomplete-list {\r\n      border: 1px solid #ced4da;\r\n      max-height: 200px;\r\n      overflow-y: auto;\r\n      position: absolute;\r\n      z-index: 1000;\r\n      background: white;\r\n      width: 100%;\r\n    }\r\n    #autocomplete-list div {\r\n      padding: 8px;\r\n      cursor: pointer;\r\n    }\r\n    #autocomplete-list div:hover {\r\n      background-color: #e9ecef;\r\n    }\r\n\r\n    .spinner-wrapper {\r\n      display: none;\r\n      justify-content: center;\r\n      margin: 2rem 0;\r\n    }\r\n    .poker-chip {\r\n      width: 50px;\r\n      height: 50px;\r\n      border: 8px solid #dc3545;\r\n      border-top: 8px solid #0d6efd;\r\n      border-radius: 50%;\r\n      animation: spin 1s linear infinite;\r\n    }\r\n    @keyframes spin {\r\n      to { transform: rotate(360deg); }\r\n    }\r\n\r\n    #summary, #message {\r\n      min-height: 24px;\r\n    }\r\n  <\/style>\r\n<\/head>\r\n<body>\r\n  <div class=\"container\" style=\"max-width: 600px; position: relative;\">\r\n    <h2 class=\"mb-4 text-primary\">Player Stats<\/h2>\r\n\r\n    <div class=\"mb-3 position-relative\">\r\n      <label for=\"playerInput\" class=\"form-label\">Search Player:<\/label>\r\n      <input type=\"text\" id=\"playerInput\" class=\"form-control\" placeholder=\"Type a player name...\" autocomplete=\"off\" \/>\r\n      <div id=\"autocomplete-list\"><\/div>\r\n    <\/div>\r\n\r\n    <div id=\"spinner\" class=\"spinner-wrapper\">\r\n      <div class=\"poker-chip\"><\/div>\r\n    <\/div>\r\n\r\n    <div id=\"message\" class=\"mb-3 text-muted fst-italic\">Please select a player.<\/div>\r\n\r\n    <div id=\"summary\" class=\"mb-3 fw-bold text-dark\"><\/div>\r\n\r\n    <div class=\"table-responsive\" id=\"tableWrapper\" style=\"display: none;\">\r\n      <table class=\"table table-striped table-bordered\">\r\n        <thead class=\"table-dark\">\r\n          <tr>\r\n            <th>Date<\/th>\r\n            <th>Rank<\/th>\r\n            <th>Points<\/th>\r\n          <\/tr>\r\n        <\/thead>\r\n        <tbody id=\"dataBody\"><\/tbody>\r\n      <\/table>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <script>\r\n    const apiBase = \"https:\/\/script.google.com\/macros\/s\/AKfycbyzK-rTcIlqH1Yg_BEVc2-2-e8YVH3CnT-jeHg0kBXCQfJgjomnitLAF-1IYZe4wSUK\/exec\";\r\n    let allData = [], playerNames = [];\r\n\r\n    const playerInput = document.getElementById(\"playerInput\");\r\n    const autocompleteList = document.getElementById(\"autocomplete-list\");\r\n    const spinner = document.getElementById(\"spinner\");\r\n    const message = document.getElementById(\"message\");\r\n    const summary = document.getElementById(\"summary\");\r\n    const tableWrapper = document.getElementById(\"tableWrapper\");\r\n    const dataBody = document.getElementById(\"dataBody\");\r\n\r\n    function getQueryParam(param) {\r\n      const urlParams = new URLSearchParams(window.location.search);\r\n      return urlParams.get(param);\r\n    }\r\n\r\n    function showSpinner(show) {\r\n      spinner.style.display = show ? \"flex\" : \"none\";\r\n    }\r\n\r\n    function showAutocompleteList(val) {\r\n      autocompleteList.innerHTML = \"\";\r\n      if (!val) return;\r\n\r\n      const matches = playerNames.filter(name =>\r\n        name.toLowerCase().includes(val.toLowerCase())\r\n      );\r\n\r\n      matches.slice(0, 10).forEach(name => {\r\n        const div = document.createElement(\"div\");\r\n        div.textContent = name;\r\n        div.addEventListener(\"click\", () => {\r\n          playerInput.value = name;\r\n          autocompleteList.innerHTML = \"\";\r\n          updateDisplayForPlayer(name);\r\n        });\r\n        autocompleteList.appendChild(div);\r\n      });\r\n    }\r\n\r\n    function updateDisplayForPlayer(name) {\r\n      showSpinner(true);\r\n      summary.textContent = \"\";\r\n      dataBody.innerHTML = \"\";\r\n      tableWrapper.style.display = \"none\";\r\n      message.textContent = \"\";\r\n\r\n      setTimeout(() => {\r\n        const filteredData = allData.filter(row => row.Name === name);\r\n\r\n        if (filteredData.length === 0) {\r\n          message.textContent = \"No data found for this player.\";\r\n          showSpinner(false);\r\n          return;\r\n        }\r\n\r\n        filteredData.sort((a, b) => new Date(b.Date) - new Date(a.Date));\r\n        const totalPoints = filteredData.reduce((sum, row) => sum + Number(row.Points), 0);\r\n\r\n        summary.textContent = `Entries: ${filteredData.length} | Cumulative Points: ${totalPoints}`;\r\n        tableWrapper.style.display = \"block\";\r\n        message.textContent = \"\";\r\n\r\n        filteredData.forEach(row => {\r\n          const tr = document.createElement(\"tr\");\r\n          const encodedDate = encodeURIComponent(row.Date);\r\n          tr.innerHTML = `\r\n            <td><a href=\"https:\/\/avinya.me\/index.php\/games\/?Date=${encodedDate}\" class=\"text-decoration-none\">${row.Date}<\/a><\/td>\r\n            <td>${row.Rank}<\/td>\r\n            <td>${row.Points}<\/td>\r\n          `;\r\n          dataBody.appendChild(tr);\r\n        });\r\n\r\n        showSpinner(false);\r\n      }, 300); \/\/ slight delay for effect\r\n    }\r\n\r\n    async function loadData() {\r\n      showSpinner(true);\r\n      try {\r\n        const response = await fetch(apiBase);\r\n        allData = await response.json();\r\n\r\n        playerNames = Array.from(new Set(allData.map(row => row.Name))).sort((a, b) =>\r\n          a.localeCompare(b)\r\n        );\r\n\r\n        const queryName = getQueryParam(\"Name\");\r\n        if (queryName && playerNames.includes(queryName)) {\r\n          playerInput.value = queryName;\r\n          updateDisplayForPlayer(queryName);\r\n        } else {\r\n          message.textContent = \"Please select a player.\";\r\n        }\r\n\r\n        playerInput.addEventListener(\"input\", (e) => {\r\n          showAutocompleteList(e.target.value);\r\n        });\r\n\r\n        playerInput.addEventListener(\"keydown\", (e) => {\r\n          if (e.key === \"Enter\") {\r\n            e.preventDefault();\r\n            autocompleteList.innerHTML = \"\";\r\n            updateDisplayForPlayer(playerInput.value.trim());\r\n          }\r\n        });\r\n\r\n        document.addEventListener(\"click\", (e) => {\r\n          if (e.target !== playerInput) {\r\n            autocompleteList.innerHTML = \"\";\r\n          }\r\n        });\r\n      } catch (error) {\r\n        console.error(\"Failed to load data:\", error);\r\n        message.textContent = \"Error loading player data.\";\r\n      } finally {\r\n        showSpinner(false);\r\n      }\r\n    }\r\n\r\n    loadData();\r\n  <\/script>\r\n\r\n  <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.3\/dist\/js\/bootstrap.bundle.min.js\"><\/script>\r\n<\/body>\r\n<\/html>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Player Page Player Stats Search Player: Please select a player. Date Rank Points<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-324","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/avinya.me\/index.php\/wp-json\/wp\/v2\/pages\/324","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/avinya.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/avinya.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/avinya.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/avinya.me\/index.php\/wp-json\/wp\/v2\/comments?post=324"}],"version-history":[{"count":43,"href":"https:\/\/avinya.me\/index.php\/wp-json\/wp\/v2\/pages\/324\/revisions"}],"predecessor-version":[{"id":381,"href":"https:\/\/avinya.me\/index.php\/wp-json\/wp\/v2\/pages\/324\/revisions\/381"}],"wp:attachment":[{"href":"https:\/\/avinya.me\/index.php\/wp-json\/wp\/v2\/media?parent=324"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}