{"id":1842,"date":"2026-04-20T17:30:33","date_gmt":"2026-04-20T15:30:33","guid":{"rendered":"https:\/\/proelis.net\/en\/?page_id=1842"},"modified":"2026-04-20T17:40:29","modified_gmt":"2026-04-20T15:40:29","slug":"bca-plus","status":"publish","type":"page","link":"https:\/\/proelis.net\/en\/bca-plus\/","title":{"rendered":"BCA plus"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1842\" class=\"elementor elementor-1842\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5e6ed30c e-con-full e-flex e-con e-parent\" data-id=\"5e6ed30c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-44d8ca10 elementor-widget__width-initial elementor-widget elementor-widget-image\" data-id=\"44d8ca10\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"300\" height=\"145\" src=\"https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/version-simplificada-logo-blanco-2-1-300x145.png\" class=\"attachment-medium size-medium wp-image-1232\" alt=\"\" srcset=\"https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/version-simplificada-logo-blanco-2-1-300x145.png 300w, https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/version-simplificada-logo-blanco-2-1-1024x493.png 1024w, https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/version-simplificada-logo-blanco-2-1-768x370.png 768w, https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/version-simplificada-logo-blanco-2-1-1536x740.png 1536w, https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/version-simplificada-logo-blanco-2-1-2048x987.png 2048w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-58f429c elementor-widget__width-initial elementor-widget elementor-widget-image\" data-id=\"58f429c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/proelis.net\/blog\/\">\n\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"640\" height=\"426\" src=\"https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/spain-28528_640.png\" class=\"attachment-large size-large wp-image-1410\" alt=\"Spanish\" srcset=\"https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/spain-28528_640.png 640w, https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/spain-28528_640-300x200.png 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-591b40bd hfe-nav-menu__align-right elementor-widget__width-initial hfe-submenu-icon-arrow hfe-submenu-animation-none hfe-link-redirect-child hfe-nav-menu__breakpoint-tablet elementor-widget elementor-widget-navigation-menu\" data-id=\"591b40bd\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;padding_horizontal_menu_item_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:50,&quot;sizes&quot;:[]},&quot;padding_horizontal_menu_item&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:15,&quot;sizes&quot;:[]},&quot;padding_horizontal_menu_item_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_vertical_menu_item&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:15,&quot;sizes&quot;:[]},&quot;padding_vertical_menu_item_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_vertical_menu_item_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;menu_space_between&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;menu_space_between_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;menu_space_between_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;menu_row_space&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;menu_row_space_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;menu_row_space_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;dropdown_border_radius&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;dropdown_border_radius_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;dropdown_border_radius_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;top&quot;:&quot;&quot;,&quot;right&quot;:&quot;&quot;,&quot;bottom&quot;:&quot;&quot;,&quot;left&quot;:&quot;&quot;,&quot;isLinked&quot;:true},&quot;width_dropdown_item&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;220&quot;,&quot;sizes&quot;:[]},&quot;width_dropdown_item_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;width_dropdown_item_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_horizontal_dropdown_item&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_horizontal_dropdown_item_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_horizontal_dropdown_item_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_vertical_dropdown_item&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:15,&quot;sizes&quot;:[]},&quot;padding_vertical_dropdown_item_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;padding_vertical_dropdown_item_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;distance_from_menu&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;distance_from_menu_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;distance_from_menu_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_size&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_size_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_size_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_width&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_width_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_width_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_radius&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_radius_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;toggle_border_radius_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"navigation-menu.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t<div class=\"hfe-nav-menu hfe-layout-horizontal hfe-nav-menu-layout horizontal hfe-pointer__none\" data-layout=\"horizontal\">\n\t\t\t\t<div role=\"button\" class=\"hfe-nav-menu__toggle elementor-clickable\" tabindex=\"0\" aria-label=\"Menu Toggle\">\n\t\t\t\t\t<span class=\"screen-reader-text\">Menu<\/span>\n\t\t\t\t\t<div class=\"hfe-nav-menu-icon\">\n\t\t\t\t\t\t<svg aria-hidden=\"true\"  class=\"e-font-icon-svg e-fas-align-justify\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M432 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z\"><\/path><\/svg>\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<nav class=\"hfe-nav-menu__layout-horizontal hfe-nav-menu__submenu-arrow\" data-toggle-icon=\"&lt;svg aria-hidden=&quot;true&quot; tabindex=&quot;0&quot; class=&quot;e-font-icon-svg e-fas-align-justify&quot; viewBox=&quot;0 0 448 512&quot; xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot;&gt;&lt;path d=&quot;M432 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-128H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16z&quot;&gt;&lt;\/path&gt;&lt;\/svg&gt;\" data-close-icon=\"&lt;svg aria-hidden=&quot;true&quot; tabindex=&quot;0&quot; class=&quot;e-font-icon-svg e-far-window-close&quot; viewBox=&quot;0 0 512 512&quot; xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot;&gt;&lt;path d=&quot;M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v340zM356.5 194.6L295.1 256l61.4 61.4c4.6 4.6 4.6 12.1 0 16.8l-22.3 22.3c-4.6 4.6-12.1 4.6-16.8 0L256 295.1l-61.4 61.4c-4.6 4.6-12.1 4.6-16.8 0l-22.3-22.3c-4.6-4.6-4.6-12.1 0-16.8l61.4-61.4-61.4-61.4c-4.6-4.6-4.6-12.1 0-16.8l22.3-22.3c4.6-4.6 12.1-4.6 16.8 0l61.4 61.4 61.4-61.4c4.6-4.6 12.1-4.6 16.8 0l22.3 22.3c4.7 4.6 4.7 12.1 0 16.8z&quot;&gt;&lt;\/path&gt;&lt;\/svg&gt;\" data-full-width=\"yes\">\n\t\t\t\t\t<ul id=\"menu-1-591b40bd\" class=\"hfe-nav-menu\"><li id=\"menu-item-1322\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-home parent hfe-creative-menu\"><a href=\"https:\/\/proelis.net\/en\/\" class = \"hfe-menu-item\">Home<\/a><\/li>\n<li id=\"menu-item-1318\" class=\"menu-item menu-item-type-custom menu-item-object-custom parent hfe-creative-menu\"><a href=\"http:\/\/padel.proelis.net\" class = \"hfe-menu-item\">Access the campus<\/a><\/li>\n<li id=\"menu-item-1319\" class=\"menu-item menu-item-type-post_type menu-item-object-page parent hfe-creative-menu\"><a href=\"https:\/\/proelis.net\/en\/contact\/\" class = \"hfe-menu-item\">Contact<\/a><\/li>\n<li id=\"menu-item-1320\" class=\"menu-item menu-item-type-post_type menu-item-object-page parent hfe-creative-menu\"><a href=\"https:\/\/proelis.net\/en\/courses\/\" class = \"hfe-menu-item\">Courses<\/a><\/li>\n<li id=\"menu-item-1321\" class=\"menu-item menu-item-type-post_type menu-item-object-page parent hfe-creative-menu\"><a href=\"https:\/\/proelis.net\/en\/more-activities\/\" class = \"hfe-menu-item\">Let&#8217;s work together!<\/a><\/li>\n<li id=\"menu-item-1857\" class=\"menu-item menu-item-type-post_type menu-item-object-page parent hfe-creative-menu\"><a href=\"https:\/\/proelis.net\/en\/tools\/\" class = \"hfe-menu-item\">Tools<\/a><\/li>\n<\/ul> \n\t\t\t\t<\/nav>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-52d96927 elementor-section-height-min-height elementor-section-full_width elementor-section-height-default elementor-section-items-middle\" data-id=\"52d96927\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-16d73ce0\" data-id=\"16d73ce0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2cac497 elementor-widget elementor-widget-html\" data-id=\"2cac497\" data-element_type=\"widget\" data-e-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-GB\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <style>\r\n        :root { --verde-elis: #00c800; --verde-oscuro: #004d00; --blanco: #ffffff; --gris-claro: #f4f4f4; }\r\n        body { font-family: 'Coolvetica', sans-serif; background-color: var(--blanco); margin: 0; color: var(--verde-oscuro); text-align: center; }\r\n\r\n        .screen { display: none; padding: 20px; width: 100%; box-sizing: border-box; flex-direction: column; align-items: center; }\r\n        #home-screen { display: flex; }\r\n\r\n        h1 { font-size: 2.5rem; color: var(--verde-elis); text-transform: uppercase; margin-bottom: 10px; }\r\n        h2 { color: var(--verde-elis); margin: 20px 0 10px 0; font-size: 1.5rem; }\r\n        .tagline { font-style: italic; margin-bottom: 30px; font-size: 1.1rem; }\r\n\r\n        .btn-main { background-color: var(--verde-elis); color: white; border: none; padding: 15px 30px; font-size: 1.2rem; border-radius: 50px; cursor: pointer; width: 100%; max-width: 300px; margin-bottom: 10px; font-family: 'Coolvetica', sans-serif; }\r\n        .btn-info  { background: none; border: 2px solid var(--verde-elis); color: var(--verde-elis); padding: 10px 20px; border-radius: 50px; cursor: pointer; width: 100%; max-width: 300px; }\r\n\r\n        \/* Setup *\/\r\n        .setup-grid { width: 100%; max-width: 400px; margin: 20px 0; }\r\n        .team-box { background: var(--gris-claro); padding: 15px; border-radius: 15px; margin-bottom: 15px; text-align: left; }\r\n        input[type=\"text\"] { width: 100%; padding: 10px; margin-top: 5px; border: 1px solid #ccc; border-radius: 5px; box-sizing: border-box; font-size: 1rem; }\r\n        .option-group { background: var(--gris-claro); border-radius: 15px; padding: 15px; margin-bottom: 15px; text-align: left; width: 100%; max-width: 400px; box-sizing: border-box; }\r\n        .option-group strong { display: block; margin-bottom: 10px; color: var(--verde-oscuro); }\r\n        .radio-row { display: flex; flex-direction: column; gap: 8px; }\r\n        .radio-row label { display: flex; align-items: center; gap: 8px; font-size: 0.95rem; cursor: pointer; }\r\n        .radio-row input[type=\"radio\"] { accent-color: var(--verde-elis); width: 18px; height: 18px; cursor: pointer; }\r\n\r\n        \/* Court *\/\r\n        .court-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; width: 100%; padding: 5px; box-sizing: border-box; }\r\n        .player-card { background: var(--gris-claro); border-radius: 12px; padding: 6px; display: flex; flex-direction: column; justify-content: space-around; border: 1px solid #ddd; }\r\n        .score-badge { font-size: 1.2rem; font-weight: bold; background: var(--verde-oscuro); color: white; border-radius: 8px; margin: 2px 0; padding: 4px 2px; }\r\n        .btn-action { border: none; border-radius: 5px; padding: 12px 0; color: white; font-weight: bold; cursor: pointer; margin: 2px 0; font-size: 0.85rem; font-family: 'Coolvetica', sans-serif; }\r\n        .player-label { font-size: 0.8rem; display: flex; align-items: center; justify-content: center; gap: 4px; }\r\n\r\n        \/* Top bar *\/\r\n        .set-bar { display: flex; gap: 4px; width: 100%; background: #eee; padding: 10px; box-sizing: border-box; }\r\n        .btn-set { flex: 1; padding: 10px 2px; border: none; border-radius: 5px; background: var(--verde-oscuro); color: white; font-size: 0.6rem; cursor: pointer; font-family: 'Coolvetica', sans-serif; text-transform: uppercase; }\r\n\r\n        \/* \u2500\u2500 SCOREBOARD \u2500\u2500 *\/\r\n        #scoreboard { width: 100%; background: var(--verde-oscuro); color: white; box-sizing: border-box; }\r\n        #sb-table { width: 100%; border-collapse: collapse; font-size: 0.8rem; }\r\n        #sb-table thead tr th {\r\n            font-size: 0.55rem; font-weight: normal; opacity: 0.65;\r\n            text-transform: uppercase; padding: 3px 4px; text-align: center;\r\n            border-bottom: 1px solid rgba(255,255,255,0.15);\r\n        }\r\n        #sb-table tbody tr td { padding: 5px 4px; vertical-align: middle; text-align: center; }\r\n        #sb-table tbody tr#sb-row-b td { border-bottom: 1px solid rgba(255,255,255,0.15); }\r\n        .sb-th-name { text-align: left !important; padding-left: 8px !important; }\r\n        .sb-td-name { text-align: left; padding-left: 8px !important; white-space: nowrap; }\r\n        #sb-name-a, #sb-name-b { font-size: 0.72rem; vertical-align: middle; }\r\n        .sb-inline-btns { display: inline-flex; gap: 3px; margin-left: 5px; vertical-align: middle; }\r\n        .sb-inline-btns button {\r\n            background: rgba(255,255,255,0.18); border: none; color: white;\r\n            border-radius: 5px; width: 24px; height: 24px;\r\n            font-size: 0.95rem; font-weight: bold; cursor: pointer;\r\n            font-family: 'Coolvetica', sans-serif; line-height: 1;\r\n        }\r\n        .sb-inline-btns button:active { background: rgba(255,255,255,0.4); }\r\n        .sb-td-set { font-size: 0.8rem; min-width: 20px; background: rgba(255,255,255,0.1); border-radius: 3px; }\r\n        .sb-td-set.won { background: rgba(255,255,255,0.28); font-weight: bold; }\r\n        .sb-td-games { font-size: 1.3rem; font-weight: bold; min-width: 28px; background: rgba(255,255,255,0.08); border-radius: 4px; }\r\n        .sb-td-pts { font-size: 0.95rem; font-weight: bold; min-width: 44px; background: rgba(255,255,255,0.12); border-radius: 4px; }\r\n        .sb-td-pts.leading { background: var(--verde-elis); }\r\n        .sb-td-pts.deuce   { background: #b8860b; }\r\n        .sb-td-pts.decisive { background: #c0392b; }\r\n\r\n        \/* Serve overlay *\/\r\n        #overlay-serve {\r\n            display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%;\r\n            background: rgba(0,0,0,0.92); z-index: 9998;\r\n            flex-direction: column; justify-content: center; align-items: center; color: white;\r\n        }\r\n        #overlay-serve .ov-title { font-size: 1.2rem; font-weight: bold; margin-bottom: 6px; }\r\n        #overlay-serve .ov-sub   { font-size: 0.9rem; color: #aaa; margin-bottom: 28px; }\r\n        #serve-options { display: flex; flex-direction: column; gap: 14px; width: 85%; max-width: 320px; }\r\n        #serve-options button {\r\n            background: var(--verde-elis); color: white; border: none; border-radius: 14px;\r\n            padding: 18px 20px; font-size: 1.15rem; font-weight: bold; cursor: pointer;\r\n            font-family: 'Coolvetica', sans-serif;\r\n        }\r\n        #serve-options button:active { background: #00a000; }\r\n\r\n        \/* Overlays *\/\r\n        #overlay-forced { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.92); z-index: 9999; flex-direction: column; justify-content: center; align-items: center; color: white; }\r\n        .ov-title { font-size: 1.2rem; font-weight: bold; margin-bottom: 6px; }\r\n        .ov-sub { font-size: 0.9rem; color: #aaa; margin-bottom: 28px; }\r\n        #opt-rivals { display: flex; flex-direction: column; gap: 16px; width: 85%; max-width: 340px; }\r\n        #opt-rivals button { background: #007bff; color: white; border: none; border-radius: 16px; padding: 22px 20px; font-size: 1.3rem; font-weight: bold; cursor: pointer; font-family: 'Coolvetica', sans-serif; }\r\n        .btn-cancel-ov { margin-top: 24px; background: none; border: 2px solid #666; color: #aaa; border-radius: 50px; padding: 12px 30px; font-size: 1rem; cursor: pointer; font-family: 'Coolvetica', sans-serif; }\r\n\r\n        #modal-confirm { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.85); z-index: 10001; flex-direction: column; justify-content: center; align-items: center; padding: 20px; box-sizing: border-box; }\r\n        .confirm-box { background: white; border-radius: 20px; padding: 30px 24px; max-width: 340px; width: 100%; text-align: center; }\r\n        .confirm-box h3 { color: var(--verde-oscuro); margin: 0 0 10px 0; font-size: 1.2rem; }\r\n        .confirm-box p { color: #555; font-size: 0.95rem; margin: 0 0 24px 0; line-height: 1.5; }\r\n        .confirm-actions { display: flex; gap: 12px; }\r\n        .btn-cy { flex: 1; background: var(--verde-elis); color: white; border: none; border-radius: 50px; padding: 14px; font-size: 1rem; cursor: pointer; font-family: 'Coolvetica', sans-serif; }\r\n        .btn-cn { flex: 1; background: none; border: 2px solid #ccc; color: #555; border-radius: 50px; padding: 14px; font-size: 1rem; cursor: pointer; font-family: 'Coolvetica', sans-serif; }\r\n\r\n        #modal-inst { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: white; z-index: 10000; padding: 30px; overflow-y: auto; text-align: left; color: #333; box-sizing: border-box; }\r\n        .results-table { width: 100%; border-collapse: collapse; margin-top: 10px; background: white; font-size: 0.75rem; border: 1px solid #ddd; }\r\n        .results-table th, .results-table td { border: 1px solid #ddd; padding: 8px 4px; text-align: center; }\r\n        .results-table th { background: var(--verde-elis); color: white; text-transform: uppercase; }\r\n        .col-total { background: #e8f5e9; font-weight: bold; color: var(--verde-oscuro); }\r\n        .col-label { text-align: left; padding-left: 8px; font-weight: bold; }\r\n        .disclaimer { font-size: 0.75rem; color: #888; padding: 20px; text-align: center; width: 100%; margin-top: 20px; border-top: 1px solid #eee; }\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n\r\n<!-- HOME -->\r\n<div id=\"home-screen\" class=\"screen\">\r\n    <img decoding=\"async\" src=\"https:\/\/proelis.net\/wp-content\/uploads\/2026\/03\/OlivaElis-SANE-Futura.png\" style=\"width:200px;margin-bottom:20px;\">\r\n    <h1>BCA+<\/h1>\r\n    <p style=\"font-size:1.2rem;margin-top:-10px;\">Basic Consistency Analysis<br><span style=\"font-size:0.9rem;opacity:0.8;\">with score tracking<\/span><\/p>\r\n    <p class=\"tagline\">'In padel, it's not the winner who wins, but the loser who loses.'<\/p>\r\n    <button class=\"btn-main\" onclick=\"changeScreen('setup-screen')\">START<\/button>\r\n    <button class=\"btn-info\" onclick=\"document.getElementById('modal-inst').style.display='block'\">Instructions<\/button>\r\n<\/div>\r\n\r\n<!-- SETTINGS -->\r\n<div id=\"setup-screen\" class=\"screen\">\r\n    <img decoding=\"async\" src=\"https:\/\/proelis.net\/wp-content\/uploads\/2026\/03\/OlivaElis-SANE-Futura.png\" style=\"width:120px;margin-bottom:10px;\">\r\n    <h2>Settings<\/h2>\r\n    <div class=\"setup-grid\">\r\n        <div class=\"team-box\">\r\n            <strong>Team A<\/strong>\r\n            <input type=\"text\" id=\"name-p1\" placeholder=\"Player 1\">\r\n            <input type=\"text\" id=\"name-p2\" placeholder=\"Player 2\">\r\n        <\/div>\r\n        <div class=\"team-box\">\r\n            <strong>Team B<\/strong>\r\n            <input type=\"text\" id=\"name-p3\" placeholder=\"Rival 1\">\r\n            <input type=\"text\" id=\"name-p4\" placeholder=\"Rival 2\">\r\n        <\/div>\r\n    <\/div>\r\n    <div class=\"option-group\">\r\n        <strong>Deuce system<\/strong>\r\n        <div class=\"radio-row\">\r\n            <label><input type=\"radio\" name=\"deuce\" value=\"golden\" checked> Golden point (decisive at 40-40)<\/label>\r\n            <label><input type=\"radio\" name=\"deuce\" value=\"star\"> Star point (decisive at 3rd deuce)<\/label>\r\n            <label><input type=\"radio\" name=\"deuce\" value=\"advantage\"> Traditional advantage<\/label>\r\n        <\/div>\r\n    <\/div>\r\n    <div class=\"option-group\">\r\n        <strong>Match format<\/strong>\r\n        <div class=\"radio-row\">\r\n            <label><input type=\"radio\" name=\"matchtype\" value=\"normal\" checked> Full match (3 sets with tie-break)<\/label>\r\n            <label><input type=\"radio\" name=\"matchtype\" value=\"short\"> Short match (3rd set = super tie-break to 10)<\/label>\r\n        <\/div>\r\n    <\/div>\r\n    <button class=\"btn-main\" onclick=\"initMatch()\">ENTER THE COURT<\/button>\r\n<\/div>\r\n\r\n<!-- TRACKING -->\r\n<div id=\"tracking-screen\" class=\"screen\" style=\"padding:0;\">\r\n    <div class=\"set-bar\">\r\n        <button id=\"btn-undo\" class=\"btn-set\" style=\"background:#6c757d;opacity:0.5;\" onclick=\"undo()\">Undo last action<\/button>\r\n        <button class=\"btn-set\" style=\"background:var(--verde-elis);\" onclick=\"renderResults()\">Results<\/button>\r\n        <button class=\"btn-set\" style=\"background:#c0392b;\" onclick=\"confirmNewMatch()\">New analysis<\/button>\r\n    <\/div>\r\n\r\n    <!-- SCOREBOARD -->\r\n    <div id=\"scoreboard\">\r\n        <table id=\"sb-table\">\r\n            <thead>\r\n                <tr>\r\n                    <th class=\"sb-th-name\"><\/th>\r\n                    <th id=\"sb-h-s1\" style=\"display:none;\">S1<\/th>\r\n                    <th id=\"sb-h-s2\" style=\"display:none;\">S2<\/th>\r\n                    <th id=\"sb-h-s3\" style=\"display:none;\">S3<\/th>\r\n                    <th>Games<\/th>\r\n                    <th>Pts<\/th>\r\n                <\/tr>\r\n            <\/thead>\r\n            <tbody>\r\n                <tr id=\"sb-row-b\">\r\n                    <td class=\"sb-td-name\">\r\n                        <span id=\"sb-name-b\">Team B<\/span>\r\n                        <span class=\"sb-inline-btns\">\r\n                            <button onclick=\"sbAddPoint('B')\">+<\/button>\r\n                            <button onclick=\"sbRemovePoint('B')\">\u2212<\/button>\r\n                        <\/span>\r\n                    <\/td>\r\n                    <td class=\"sb-td-set\" id=\"sb-s1-b\" style=\"display:none;\"><\/td>\r\n                    <td class=\"sb-td-set\" id=\"sb-s2-b\" style=\"display:none;\"><\/td>\r\n                    <td class=\"sb-td-set\" id=\"sb-s3-b\" style=\"display:none;\"><\/td>\r\n                    <td class=\"sb-td-games\" id=\"sb-games-b\">0<\/td>\r\n                    <td class=\"sb-td-pts\" id=\"sb-pts-b\">0<\/td>\r\n                <\/tr>\r\n                <tr id=\"sb-row-a\">\r\n                    <td class=\"sb-td-name\">\r\n                        <span id=\"sb-name-a\">Team A<\/span>\r\n                        <span class=\"sb-inline-btns\">\r\n                            <button onclick=\"sbAddPoint('A')\">+<\/button>\r\n                            <button onclick=\"sbRemovePoint('A')\">\u2212<\/button>\r\n                        <\/span>\r\n                    <\/td>\r\n                    <td class=\"sb-td-set\" id=\"sb-s1-a\" style=\"display:none;\"><\/td>\r\n                    <td class=\"sb-td-set\" id=\"sb-s2-a\" style=\"display:none;\"><\/td>\r\n                    <td class=\"sb-td-set\" id=\"sb-s3-a\" style=\"display:none;\"><\/td>\r\n                    <td class=\"sb-td-games\" id=\"sb-games-a\">0<\/td>\r\n                    <td class=\"sb-td-pts\" id=\"sb-pts-a\">0<\/td>\r\n                <\/tr>\r\n            <\/tbody>\r\n        <\/table>\r\n    <\/div>\r\n\r\n    <div style=\"padding:6px 10px;font-weight:bold;background:#f9f9f9;width:100%;font-size:0.85rem;box-sizing:border-box;\">\r\n        LIVE ANALYSIS: <span id=\"set-num-label\">SET 1<\/span>\r\n    <\/div>\r\n\r\n    <div class=\"court-grid\">\r\n        <div class=\"player-card\">\r\n            <span id=\"label-p3\" style=\"font-size:0.75rem;font-weight:bold;\">R1<\/span>\r\n            <div class=\"score-badge\" id=\"sc-p3\">0<\/div>\r\n            <button class=\"btn-action\" style=\"background:#28a745\" onclick=\"hit('p3','w')\">W<\/button>\r\n            <button class=\"btn-action\" style=\"background:#dc3545\" onclick=\"hit('p3','enf')\">UE<\/button>\r\n            <button class=\"btn-action\" style=\"background:#007bff\" onclick=\"askForced('p3')\">IE (+0.5)<\/button>\r\n        <\/div>\r\n        <div class=\"player-card\">\r\n            <span id=\"label-p4\" style=\"font-size:0.75rem;font-weight:bold;\">R2<\/span>\r\n            <div class=\"score-badge\" id=\"sc-p4\">0<\/div>\r\n            <button class=\"btn-action\" style=\"background:#28a745\" onclick=\"hit('p4','w')\">W<\/button>\r\n            <button class=\"btn-action\" style=\"background:#dc3545\" onclick=\"hit('p4','enf')\">UE<\/button>\r\n            <button class=\"btn-action\" style=\"background:#007bff\" onclick=\"askForced('p4')\">IE (+0.5)<\/button>\r\n        <\/div>\r\n        <div class=\"player-card\">\r\n            <span id=\"label-p1\" style=\"font-size:0.75rem;font-weight:bold;\">P1<\/span>\r\n            <div class=\"score-badge\" id=\"sc-p1\">0<\/div>\r\n            <button class=\"btn-action\" style=\"background:#28a745\" onclick=\"hit('p1','w')\">W<\/button>\r\n            <button class=\"btn-action\" style=\"background:#dc3545\" onclick=\"hit('p1','enf')\">UE<\/button>\r\n            <button class=\"btn-action\" style=\"background:#007bff\" onclick=\"askForced('p1')\">IE (+0.5)<\/button>\r\n        <\/div>\r\n        <div class=\"player-card\">\r\n            <span id=\"label-p2\" style=\"font-size:0.75rem;font-weight:bold;\">P2<\/span>\r\n            <div class=\"score-badge\" id=\"sc-p2\">0<\/div>\r\n            <button class=\"btn-action\" style=\"background:#28a745\" onclick=\"hit('p2','w')\">W<\/button>\r\n            <button class=\"btn-action\" style=\"background:#dc3545\" onclick=\"hit('p2','enf')\">UE<\/button>\r\n            <button class=\"btn-action\" style=\"background:#007bff\" onclick=\"askForced('p2')\">IE (+0.5)<\/button>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<!-- RESULTS -->\r\n<div id=\"results-screen\" class=\"screen\">\r\n    <img decoding=\"async\" src=\"https:\/\/proelis.net\/wp-content\/uploads\/2026\/03\/OlivaElis-SANE-Futura.png\" style=\"width:120px;margin-bottom:10px;\">\r\n    <h2>Match Result<\/h2>\r\n    <div id=\"match-result-display\" style=\"width:100%;overflow-x:auto;margin-bottom:10px;\"><\/div>\r\n    <h2>BCA Balance Sheets (Weighted)<\/h2>\r\n    <table class=\"results-table\">\r\n        <thead><tr><th class=\"col-label\">Player<\/th><th>Set 1<\/th><th>Set 2<\/th><th>Set 3<\/th><th class=\"col-total\">TOTAL<\/th><\/tr><\/thead>\r\n        <tbody id=\"res-table-body\"><\/tbody>\r\n    <\/table>\r\n    <h2>Technical Breakdown (Game Actions)<\/h2>\r\n    <div id=\"tech-breakdown-container\"><\/div>\r\n    <div style=\"margin-top:25px;width:100%;\">\r\n        <button id=\"btn-back-to-court\" class=\"btn-main\" onclick=\"changeScreen('tracking-screen')\">BACK TO COURT<\/button>\r\n        <button class=\"btn-main\" style=\"background:var(--verde-oscuro);\" onclick=\"downloadCSV()\">&#11015; Download CSV<\/button>\r\n        <button class=\"btn-main\" style=\"background:#007bff;\" onclick=\"copyText()\">&#128203; Copy summary<\/button>\r\n        <button class=\"btn-info\" onclick=\"confirmNewMatch()\">NEW ANALYSIS<\/button>\r\n    <\/div>\r\n    <div id=\"copy-feedback\" style=\"display:none;color:var(--verde-elis);font-weight:bold;margin-top:8px;\">Copied to clipboard!<\/div>\r\n<\/div>\r\n\r\n<!-- OVERLAY IE\/FE -->\r\n<div id=\"overlay-forced\">\r\n    <div class=\"ov-title\">Induced Error by <span id=\"ep-provoker-name\"><\/span><\/div>\r\n    <div class=\"ov-sub\">Who made the Forced Error?<\/div>\r\n    <div id=\"opt-rivals\"><\/div>\r\n    <button class=\"btn-cancel-ov\" onclick=\"document.getElementById('overlay-forced').style.display='none'\">Cancel<\/button>\r\n<\/div>\r\n\r\n<!-- SERVE OVERLAY -->\r\n<div id=\"overlay-serve\">\r\n    <div class=\"ov-title\" id=\"serve-ov-title\">Who serves?<\/div>\r\n    <div class=\"ov-sub\" id=\"serve-ov-sub\"><\/div>\r\n    <div id=\"serve-options\"><\/div>\r\n<\/div>\r\n\r\n<!-- CONFIRM MODAL -->\r\n<div id=\"modal-confirm\">\r\n    <div class=\"confirm-box\">\r\n        <h3 id=\"confirm-title\">Are you sure?<\/h3>\r\n        <p id=\"confirm-msg\">This action cannot be undone.<\/p>\r\n        <div class=\"confirm-actions\">\r\n            <button class=\"btn-cn\" onclick=\"closeConfirm()\">Cancel<\/button>\r\n            <button class=\"btn-cy\" onclick=\"doConfirm()\">Confirm<\/button>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<!-- INSTRUCTIONS MODAL -->\r\n<div id=\"modal-inst\">\r\n    <h2 style=\"color:var(--verde-elis);text-align:center;\">How does BCA+ work?<\/h2>\r\n\r\n    <p><strong>Consistency analysis<\/strong><\/p>\r\n    <p>This app allows the observer to log key actions at the end of each point, producing a weighted consistency balance per player and per set. The scoreboard updates automatically with every logged action.<\/p>\r\n    <ul style=\"line-height:1.8;\">\r\n        <li><strong>W &mdash; Winner (+1):<\/strong> Point won by a player's direct positive action.<\/li>\r\n        <li><strong>UE &mdash; Unforced Error (&minus;1):<\/strong> Point lost due to a player's own mistake, without pressure from the opponent.<\/li>\r\n        <li><strong>IE &mdash; Induced Error (+0.5):<\/strong> An action that generates pressure and causes the opponent to err. Once logged, the app will ask who made the Forced Error.<\/li>\r\n        <li><strong>FE &mdash; Forced Error (&minus;0.5):<\/strong> An error made under pressure from the opponent (logged automatically when an IE is recorded).<\/li>\r\n    <\/ul>\r\n    <p>Each action adds or subtracts from the player's balance and simultaneously updates the scoreboard: W and IE add a point to the player's team; UE adds a point to the opposing team.<\/p>\r\n    <p><em>Any balance above 0 indicates a positive performance. A balance of 0 is neutral.<\/em><\/p>\r\n\r\n    <p><strong>Automatic scoreboard<\/strong><\/p>\r\n    <p>The scoreboard reflects the real match score at all times. It is configured on the opening screen:<\/p>\r\n    <ul style=\"line-height:1.8;\">\r\n        <li><strong>Deuce system:<\/strong> Golden point (decisive at the first deuce, 40-40), Star point (decisive at the third deuce) or Traditional advantage.<\/li>\r\n        <li><strong>Match format:<\/strong> Full match (three sets with tie-break to 7) or Short match (third set replaced by a super tie-break to 10).<\/li>\r\n    <\/ul>\r\n    <p>The score advances automatically: points &rarr; games &rarr; sets. When the match ends, the app moves directly to the results screen.<\/p>\r\n    <p>Sets decided by a tie-break are shown as <strong>7(x)<\/strong> for the winner and <strong>6<\/strong> for the loser, where x is the loser's score in that tie-break. The super tie-break follows the same format with the actual points scored.<\/p>\r\n    <p>If the observer makes a mistake, the <strong>+<\/strong> and <strong>&minus;<\/strong> buttons next to each team name in the scoreboard allow point-by-point correction, automatically reversing any game or set generated by that point.<\/p>\r\n\r\n    <p><strong>Serve order<\/strong><\/p>\r\n    <p>The app manages the serve order throughout the match. At the start of each set, it asks who serves the first game; once that game ends, it asks who will serve first from the opposing team, which defines the full serve order for that set. The rotation within each pair is automatic. The current server is indicated with &#127934; next to their name in the scoreboard.<\/p>\r\n    <p>In the tie-break, the first serve goes to whoever is next in the set rotation (1 point), after which serves alternate in blocks of 2 following the set order. In the super tie-break, the first server is asked at the start and the second server is asked after the first point, following the same rotation.<\/p>\r\n\r\n    <p><strong>Top bar buttons<\/strong><\/p>\r\n    <ul style=\"line-height:1.8;\">\r\n        <li><strong>Undo last action:<\/strong> reverts the last logged action (W, UE, IE\/FE), correcting both the BCA balance and the scoreboard.<\/li>\r\n        <li><strong>Results:<\/strong> access the results screen at any time without closing the match.<\/li>\r\n        <li><strong>New analysis:<\/strong> resets the app from scratch (requires confirmation).<\/li>\r\n    <\/ul>\r\n\r\n    <p><strong>Results screen<\/strong><\/p>\r\n    <p>Shows the final match score in table format, the weighted balance per player per set and overall, and a full technical breakdown by action type. From this screen you can download a CSV file or copy a plain-text summary to the clipboard to share via any channel.<\/p>\r\n\r\n    <button class=\"btn-main\" onclick=\"document.getElementById('modal-inst').style.display='none'\">Got it<\/button>\r\n<\/div>\r\n\r\n<div id=\"disclaimer-global\" class=\"disclaimer\">\r\n    Free-to-use application created by Mart&iacute;n Echegaray Vales for Proyecto Elis. No liability is accepted for the use of data, which will not be stored once the page is closed. Suggestions: info@proelis.net\r\n<\/div>\r\n\r\n<script>\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ BCA STATE\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nvar activeSet = 1;\r\nvar isFinished = false;\r\nvar actionHistory = [];\r\nvar confirmCallback = null;\r\nvar players = { p1:\"P1\", p2:\"P2\", p3:\"R1\", p4:\"R2\" };\r\n\r\nvar stats = {\r\n    1:{p1:0,p2:0,p3:0,p4:0},\r\n    2:{p1:0,p2:0,p3:0,p4:0},\r\n    3:{p1:0,p2:0,p3:0,p4:0}\r\n};\r\nvar counts = {\r\n    1:{p1:{w:0,enf:0,ep:0,ef:0},p2:{w:0,enf:0,ep:0,ef:0},p3:{w:0,enf:0,ep:0,ef:0},p4:{w:0,enf:0,ep:0,ef:0}},\r\n    2:{p1:{w:0,enf:0,ep:0,ef:0},p2:{w:0,enf:0,ep:0,ef:0},p3:{w:0,enf:0,ep:0,ef:0},p4:{w:0,enf:0,ep:0,ef:0}},\r\n    3:{p1:{w:0,enf:0,ep:0,ef:0},p2:{w:0,enf:0,ep:0,ef:0},p3:{w:0,enf:0,ep:0,ef:0},p4:{w:0,enf:0,ep:0,ef:0}}\r\n};\r\nvar DELTA = { w:2, enf:-2, ep:1, ef:-1 };\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ SCOREBOARD STATE\r\n\/\/ pointLog: ['A','B',...] \u2014 single source of truth, computeScore() recalculates everything\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nvar deuceSystem = 'golden';\r\nvar matchType   = 'normal';\r\nvar pointLog    = [];\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ SERVE SYSTEM\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nvar serveLog = [];\r\nvar serveCallback = null;\r\n\r\n\/\/ \u2500\u2500 Utilities \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nfunction fmt(v2) {\r\n    if (v2 === 0) return \"0\";\r\n    var n = v2 \/ 2;\r\n    var s = (Math.abs(v2) % 2 !== 0) ? n.toFixed(1) : String(n);\r\n    return n > 0 ? \"+\" + s : s;\r\n}\r\nfunction teamOf(player) { return (player === 'p1' || player === 'p2') ? 'A' : 'B'; }\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ SCOREBOARD LOGIC \u2014 computeScore\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction computeScore() {\r\n    var s = {\r\n        setsA:[], setsB:[],\r\n        setsTB:[],\r\n        gamesA:0, gamesB:0,\r\n        ptsA:0, ptsB:0,\r\n        gamesDone: 0,\r\n        inTB:false, inSTB:false,\r\n        matchOver:false\r\n    };\r\n    for (var i = 0; i < pointLog.length; i++) {\r\n        applyPoint(s, pointLog[i]);\r\n        if (s.matchOver) break;\r\n    }\r\n    return s;\r\n}\r\n\r\nfunction applyPoint(s, winner) {\r\n    var wPts = (winner==='A') ? 'ptsA' : 'ptsB';\r\n    var lPts = (winner==='A') ? 'ptsB' : 'ptsA';\r\n\r\n    if (s.inSTB) {\r\n        s[wPts]++;\r\n        if (s[wPts] >= 10 && s[wPts] - s[lPts] >= 2) closeSet(s, winner, true);\r\n        return;\r\n    }\r\n\r\n    if (s.inTB) {\r\n        s[wPts]++;\r\n        if (s[wPts] >= 7 && s[wPts] - s[lPts] >= 2) closeGame(s, winner, true);\r\n        return;\r\n    }\r\n\r\n    var wp = s[wPts], lp = s[lPts];\r\n\r\n    if (wp >= 3 && lp >= 3) {\r\n        var diff = wp - lp;\r\n        if (diff === 1) { closeGame(s, winner); return; }\r\n        if (diff === 0) {\r\n            var deuceNum = wp - 2;\r\n            var decisive = false;\r\n            if (deuceSystem === 'golden' && deuceNum === 1) decisive = true;\r\n            if (deuceSystem === 'star'   && deuceNum >= 3)  decisive = true;\r\n            if (decisive) {\r\n                s[wPts]++;\r\n                closeGame(s, winner);\r\n            } else {\r\n                s[wPts]++;\r\n            }\r\n            return;\r\n        }\r\n        if (diff === -1) { s[wPts]++; return; }\r\n    }\r\n\r\n    if (wp === 3 && lp < 3) { closeGame(s, winner); return; }\r\n\r\n    s[wPts]++;\r\n}\r\n\r\nfunction closeGame(s, winner, wasTB) {\r\n    var wG = (winner==='A') ? 'gamesA' : 'gamesB';\r\n    var tbLoser = wasTB ? ((winner==='A') ? s.ptsB : s.ptsA) : null;\r\n    s.ptsA=0; s.ptsB=0; s.inTB=false;\r\n    s[wG]++;\r\n    s.gamesDone++;\r\n\r\n    var ga=s.gamesA, gb=s.gamesB;\r\n    var setWinner=null;\r\n    if      (ga>=6 && ga-gb>=2) setWinner='A';\r\n    else if (gb>=6 && gb-ga>=2) setWinner='B';\r\n    else if (ga===7 && gb===6)  setWinner='A';\r\n    else if (gb===7 && ga===6)  setWinner='B';\r\n    else if (ga===6 && gb===6)  s.inTB=true;\r\n    if (setWinner) closeSet(s, setWinner, false, tbLoser);\r\n}\r\n\r\nfunction closeSet(s, winner, isSTB, tbLoserPts) {\r\n    var tbLoser = isSTB ? ((winner==='A') ? s.ptsB : s.ptsA) : (tbLoserPts !== undefined ? tbLoserPts : null);\r\n    var tbWinner = isSTB ? ((winner==='A') ? s.ptsA : s.ptsB) : null;\r\n    s.setsA.push(s.gamesA); s.setsB.push(s.gamesB);\r\n    s.setsTB.push((isSTB || tbLoser !== null) ? {loserPts: tbLoser, winnerPts: tbWinner, isSTB: !!isSTB, winner: winner} : null);\r\n    s.gamesA=0; s.gamesB=0; s.ptsA=0; s.ptsB=0;\r\n    s.inTB=false; s.inSTB=false; s.gamesDone=0;\r\n    var wa=0,wb=0;\r\n    for (var i=0;i<s.setsA.length;i++) { if(s.setsA[i]>s.setsB[i]) wa++; else wb++; }\r\n    if (wa===2||wb===2) { s.matchOver=true; return; }\r\n    if (matchType==='short' && s.setsA.length===2) s.inSTB=true;\r\n}\r\n\r\n\/\/ \u2500\u2500 Render scoreboard \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\nvar PTS_LABELS = ['0','15','30','40'];\r\n\r\nfunction ptsLabel(wp, lp, inTB, inSTB) {\r\n    if (inSTB||inTB) return String(wp);\r\n    if (wp>=3 && lp>=3) {\r\n        var diff = wp-lp;\r\n        if (diff===1)  return 'AD';\r\n        if (diff===-1) return '';\r\n        var n = wp-2;\r\n        if (n===1) return (deuceSystem==='golden') ? 'GP' : '40';\r\n        return 'D'+n;\r\n    }\r\n    return PTS_LABELS[wp]||'0';\r\n}\r\n\r\nfunction ptsClass(wp, lp, inTB, inSTB) {\r\n    var base='sb-td-pts';\r\n    if (inSTB||inTB) return base+(wp>lp?' leading':'');\r\n    if (wp>=3&&lp>=3) {\r\n        var diff=wp-lp;\r\n        if (diff===1) return base+' leading';\r\n        if (diff===-1) return base;\r\n        var n=wp-2;\r\n        var isDecisive=(deuceSystem==='golden'&&n===1)||(deuceSystem==='star'&&n>=3);\r\n        return base+(isDecisive?' decisive':' deuce');\r\n    }\r\n    return base+(wp>lp?' leading':'');\r\n}\r\n\r\nfunction renderScoreboard() {\r\n    var s = computeScore();\r\n    var totalSets = s.setsA.length;\r\n\r\n    for (var i=1;i<=3;i++) {\r\n        var hEl=document.getElementById('sb-h-s'+i);\r\n        var aEl=document.getElementById('sb-s'+i+'-a');\r\n        var bEl=document.getElementById('sb-s'+i+'-b');\r\n        if (!aEl||!bEl) continue;\r\n        if (i<=totalSets) {\r\n            if (hEl) hEl.style.display='';\r\n            aEl.style.display=''; bEl.style.display='';\r\n            var tb = (s.setsTB && s.setsTB[i-1]) || null;\r\n            aEl.innerText = setScore(s.setsA[i-1], s.setsB[i-1], tb, 'A');\r\n            bEl.innerText = setScore(s.setsA[i-1], s.setsB[i-1], tb, 'B');\r\n            aEl.className='sb-td-set'+(s.setsA[i-1]>s.setsB[i-1]?' won':'');\r\n            bEl.className='sb-td-set'+(s.setsB[i-1]>s.setsA[i-1]?' won':'');\r\n        } else {\r\n            if (hEl) hEl.style.display='none';\r\n            aEl.style.display='none'; bEl.style.display='none';\r\n        }\r\n    }\r\n\r\n    document.getElementById('sb-games-a').innerText = s.inSTB?'STB':String(s.gamesA);\r\n    document.getElementById('sb-games-b').innerText = s.inSTB?'STB':String(s.gamesB);\r\n\r\n    var elA=document.getElementById('sb-pts-a');\r\n    var elB=document.getElementById('sb-pts-b');\r\n    elA.innerText=ptsLabel(s.ptsA,s.ptsB,s.inTB,s.inSTB);\r\n    elB.innerText=ptsLabel(s.ptsB,s.ptsA,s.inTB,s.inSTB);\r\n    elA.className=ptsClass(s.ptsA,s.ptsB,s.inTB,s.inSTB);\r\n    elB.className=ptsClass(s.ptsB,s.ptsA,s.inTB,s.inSTB);\r\n}\r\n\r\nfunction sbAddPoint(team) {\r\n    pointLog.push(team);\r\n    syncActiveSet();\r\n    renderScoreboard();\r\n    checkServeQuestions();\r\n}\r\nfunction sbRemovePoint(team) {\r\n    for (var i=pointLog.length-1;i>=0;i--) {\r\n        if (pointLog[i]===team) { pointLog.splice(i,1); renderScoreboard(); renderServeIndicator(); return; }\r\n    }\r\n}\r\nfunction getFinalSets() { var s=computeScore(); return {A:s.setsA,B:s.setsB}; }\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ SERVE SYSTEM\r\n\/\/ setServe[n] = { s1: 'p?', s2: 'p?' }\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nvar setServe = {};\r\nvar serveAsked = {};\r\n\r\nfunction getPartner(p) {\r\n    if (p==='p1') return 'p2'; if (p==='p2') return 'p1';\r\n    if (p==='p3') return 'p4'; return 'p3';\r\n}\r\n\r\nfunction serverForGame(setNum, gameIdx) {\r\n    var sv = setServe[setNum];\r\n    if (!sv || !sv.s1) return null;\r\n    var order = [sv.s1, sv.s2, getPartner(sv.s1), getPartner(sv.s2)];\r\n    if (!sv.s2 && gameIdx !== 0) return null;\r\n    if (!sv.s2) return order[0];\r\n    return order[gameIdx % 4];\r\n}\r\n\r\nfunction currentSetAndGame() {\r\n    var s = computeScore();\r\n    var setNum = s.setsA.length + 1;\r\n    var gameInSet = s.gamesA + s.gamesB;\r\n    var inTB = s.inTB || s.inSTB;\r\n    var tbPoints = inTB ? (s.ptsA + s.ptsB) : 0;\r\n    return { setNum: setNum, gameInSet: gameInSet, inTB: inTB, tbPoints: tbPoints, isSTB: s.inSTB };\r\n}\r\n\r\nfunction currentServer() {\r\n    var sg = currentSetAndGame();\r\n    var setNum = sg.setNum;\r\n    var gameInSet = sg.gameInSet;\r\n\r\n    if (!sg.inTB) {\r\n        return serverForGame(setNum, gameInSet);\r\n    }\r\n\r\n    var sv = setServe[setNum];\r\n    if (!sv || !sv.s1 || !sv.s2) return sv ? sv.s1 : null;\r\n\r\n    var fullOrder = [sv.s1, sv.s2, getPartner(sv.s1), getPartner(sv.s2)];\r\n\r\n    if (sg.isSTB) {\r\n        var startIdx = 0;\r\n        var tp = sg.tbPoints;\r\n        var serverIdx;\r\n        if (tp === 0) {\r\n            serverIdx = startIdx;\r\n        } else {\r\n            serverIdx = (startIdx + 1 + Math.floor((tp - 1) \/ 2)) % 4;\r\n        }\r\n        return fullOrder[serverIdx];\r\n    }\r\n\r\n    var tbFirstServer = serverForGame(setNum, gameInSet);\r\n    if (!tbFirstServer) return null;\r\n\r\n    var startIdx = fullOrder.indexOf(tbFirstServer);\r\n    if (startIdx === -1) return tbFirstServer;\r\n\r\n    var tp = sg.tbPoints;\r\n    var serverIdx;\r\n    if (tp === 0) {\r\n        serverIdx = startIdx;\r\n    } else {\r\n        serverIdx = (startIdx + 1 + Math.floor((tp - 1) \/ 2)) % 4;\r\n    }\r\n    return fullOrder[serverIdx];\r\n}\r\n\r\nfunction askServer(title, sub, candidates, cb) {\r\n    document.getElementById('serve-ov-title').innerText = title;\r\n    document.getElementById('serve-ov-sub').innerText = sub;\r\n    var div = document.getElementById('serve-options');\r\n    div.innerHTML = '';\r\n    for (var i = 0; i < candidates.length; i++) {\r\n        (function(p) {\r\n            var b = document.createElement('button');\r\n            b.innerText = '\\uD83C\\uDFBE  ' + players[p];\r\n            b.onclick = function() {\r\n                document.getElementById('overlay-serve').style.display = 'none';\r\n                cb(p);\r\n            };\r\n            div.appendChild(b);\r\n        })(candidates[i]);\r\n    }\r\n    document.getElementById('overlay-serve').style.display = 'flex';\r\n}\r\n\r\nfunction checkServeQuestions() {\r\n    if (isFinished) return;\r\n\r\n    var sg = currentSetAndGame();\r\n    var setNum = sg.setNum;\r\n    var gameInSet = sg.gameInSet;\r\n\r\n    if (setNum > 3) return;\r\n\r\n    if (!setServe[setNum]) setServe[setNum] = { s1: null, s2: null };\r\n\r\n    var key1 = setNum + '-s1';\r\n    var key2 = setNum + '-s2';\r\n\r\n    if (!serveAsked[key1] && gameInSet === 0 && !setServe[setNum].s1) {\r\n        serveAsked[key1] = true;\r\n\r\n        var candidates, subtitle;\r\n        if (setNum === 1) {\r\n            candidates = ['p1','p2','p3','p4'];\r\n            subtitle = 'Who serves the first game?';\r\n        } else {\r\n            var prevSetNum = setNum - 1;\r\n            var s = computeScore();\r\n            var prevGamesA = s.setsA[setNum-2];\r\n            var prevGamesB = s.setsB[setNum-2];\r\n            var prevTotalGames = prevGamesA + prevGamesB;\r\n            var prevTB = s.setsTB && s.setsTB[setNum-2];\r\n            var lastServer;\r\n            if (prevTB) {\r\n                var tbGameIdx = prevTotalGames - 1;\r\n                lastServer = serverForGame(prevSetNum, tbGameIdx);\r\n            } else {\r\n                lastServer = serverForGame(prevSetNum, prevTotalGames - 1);\r\n            }\r\n            var servingTeam = lastServer ? (teamOf(lastServer) === 'A' ? 'B' : 'A') : 'A';\r\n            candidates = (servingTeam === 'A') ? ['p1','p2'] : ['p3','p4'];\r\n            var teamName = (servingTeam === 'A') ? (players.p1+' \/ '+players.p2) : (players.p3+' \/ '+players.p4);\r\n            subtitle = sg.isSTB ? 'Who serves the first point of the Super Tie-Break for '+teamName+'?' : 'Who serves for '+teamName+'?';\r\n        }\r\n\r\n        var titleTxt = sg.isSTB ? 'Super Tie-Break' : 'Set '+setNum+' \\u2014 Game 1';\r\n        askServer(titleTxt, subtitle, candidates, function(p) {\r\n            setServe[setNum].s1 = p;\r\n            renderServeIndicator();\r\n        });\r\n        return;\r\n    }\r\n\r\n    var stbAfterFirstPoint = sg.isSTB && sg.tbPoints === 1;\r\n    var normalGame2 = !sg.isSTB && gameInSet === 1;\r\n    if (!serveAsked[key2] && (stbAfterFirstPoint || normalGame2) && setServe[setNum].s1 && !setServe[setNum].s2) {\r\n        serveAsked[key2] = true;\r\n        var rivalTeam = (teamOf(setServe[setNum].s1) === 'A') ? 'B' : 'A';\r\n        var rivals = (rivalTeam === 'A') ? ['p1','p2'] : ['p3','p4'];\r\n        var teamName2 = (rivalTeam === 'A') ? (players.p1+' \/ '+players.p2) : (players.p3+' \/ '+players.p4);\r\n        var titleTxt2 = sg.isSTB ? 'Super Tie-Break \\u2014 2nd server' : 'Set '+setNum+' \\u2014 Game 2';\r\n\r\n        askServer(\r\n            titleTxt2,\r\n            'Who serves for '+teamName2+'?',\r\n            rivals,\r\n            function(p) {\r\n                setServe[setNum].s2 = p;\r\n                renderServeIndicator();\r\n            }\r\n        );\r\n        return;\r\n    }\r\n\r\n    renderServeIndicator();\r\n}\r\n\r\nfunction buildTeamName(team, srv) {\r\n    var p1 = (team === 'A') ? 'p1' : 'p3';\r\n    var p2 = (team === 'A') ? 'p2' : 'p4';\r\n    var n1 = players[p1], n2 = players[p2];\r\n    if (srv === p1) return '\\uD83C\\uDFBE ' + n1 + ' \/ ' + n2;\r\n    if (srv === p2) return n1 + ' \/ \\uD83C\\uDFBE ' + n2;\r\n    return n1 + ' \/ ' + n2;\r\n}\r\n\r\nfunction renderServeIndicator() {\r\n    var srv = currentServer();\r\n    document.getElementById('sb-name-a').innerText = buildTeamName('A', srv);\r\n    document.getElementById('sb-name-b').innerText = buildTeamName('B', srv);\r\n\r\n    var sg = currentSetAndGame();\r\n    var setTxt = 'SET ' + sg.setNum;\r\n    if (sg.inTB) setTxt += sg.isSTB ? '  |  SUPER TB' : '  |  TIE-BREAK';\r\n    if (srv) setTxt += '  |  \\uD83C\\uDFBE ' + players[srv];\r\n    document.getElementById('set-num-label').innerText = setTxt;\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ NAVIGATION\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction syncActiveSet() {\r\n    var s = computeScore();\r\n    var newSet = s.setsA.length + 1;\r\n    if (s.matchOver) {\r\n        if (!isFinished) { isFinished = true; renderResults(); }\r\n        return;\r\n    }\r\n    if (newSet !== activeSet && newSet <= 3) activeSet = newSet;\r\n}\r\n\r\nfunction changeScreen(id) {\r\n    var all=document.querySelectorAll('.screen');\r\n    for (var i=0;i<all.length;i++) all[i].style.display='none';\r\n    document.getElementById(id).style.display='flex';\r\n    document.getElementById('disclaimer-global').style.display=(id==='tracking-screen')?'none':'block';\r\n    if (id==='tracking-screen') { syncActiveSet(); refreshAllScores(); renderScoreboard(); renderServeIndicator(); }\r\n    window.scrollTo(0,0);\r\n}\r\n\r\nfunction initMatch() {\r\n    players.p1=document.getElementById('name-p1').value.trim()||\"P1\";\r\n    players.p2=document.getElementById('name-p2').value.trim()||\"P2\";\r\n    players.p3=document.getElementById('name-p3').value.trim()||\"R1\";\r\n    players.p4=document.getElementById('name-p4').value.trim()||\"R2\";\r\n\r\n    var rd=document.querySelectorAll('input[name=\"deuce\"]');\r\n    for (var i=0;i<rd.length;i++) if (rd[i].checked) { deuceSystem=rd[i].value; break; }\r\n    var rm=document.querySelectorAll('input[name=\"matchtype\"]');\r\n    for (var i=0;i<rm.length;i++) if (rm[i].checked) { matchType=rm[i].value; break; }\r\n\r\n    var ks=['p1','p2','p3','p4'];\r\n    for (var i=0;i<ks.length;i++) document.getElementById('label-'+ks[i]).innerText=players[ks[i]];\r\n\r\n    changeScreen('tracking-screen');\r\n    checkServeQuestions();\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ SCOUTING\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction hit(player, type, isAuto) {\r\n    if (isFinished) return;\r\n\r\n    var scoringTeam=null;\r\n    if (type==='w'||type==='ep')  scoringTeam=teamOf(player);\r\n    else if (type==='enf')        scoringTeam=(teamOf(player)==='A')?'B':'A';\r\n\r\n    if (scoringTeam) pointLog.push(scoringTeam);\r\n    syncActiveSet();\r\n\r\n    stats[activeSet][player]+=DELTA[type];\r\n    counts[activeSet][player][type]+=1;\r\n    if (!isAuto) actionHistory.push({kind:'simple',player:player,type:type,set:activeSet});\r\n    document.getElementById('sc-'+player).innerText=fmt(stats[activeSet][player]);\r\n\r\n    if (scoringTeam) {\r\n        renderScoreboard();\r\n        checkServeQuestions();\r\n    }\r\n    updateUndoBtn();\r\n}\r\n\r\nfunction askForced(provoker) {\r\n    if (isFinished) return;\r\n    document.getElementById('ep-provoker-name').innerText=players[provoker];\r\n    var div=document.getElementById('opt-rivals');\r\n    div.innerHTML='';\r\n    var rivals=(provoker==='p1'||provoker==='p2')?['p3','p4']:['p1','p2'];\r\n    for (var i=0;i<rivals.length;i++) {\r\n        (function(r) {\r\n            var b=document.createElement('button');\r\n            b.innerText=players[r];\r\n            b.onclick=function() {\r\n                actionHistory.push({kind:'double',provoker:provoker,victim:r,set:activeSet});\r\n                hit(provoker,'ep',true);\r\n                hit(r,'ef',true);\r\n                document.getElementById('overlay-forced').style.display='none';\r\n                updateUndoBtn();\r\n            };\r\n            div.appendChild(b);\r\n        })(rivals[i]);\r\n    }\r\n    document.getElementById('overlay-forced').style.display='flex';\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ UNDO\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction undo() {\r\n    if (actionHistory.length===0) return;\r\n    var last=actionHistory.pop();\r\n    if (last.kind==='simple') {\r\n        stats[last.set][last.player]-=DELTA[last.type];\r\n        counts[last.set][last.player][last.type]-=1;\r\n        var st=null;\r\n        if (last.type==='w'||last.type==='ep') st=teamOf(last.player);\r\n        else if (last.type==='enf') st=(teamOf(last.player)==='A')?'B':'A';\r\n        if (st) sbRemovePoint(st);\r\n    } else {\r\n        stats[last.set][last.provoker]-=DELTA['ep'];\r\n        counts[last.set][last.provoker]['ep']-=1;\r\n        stats[last.set][last.victim]-=DELTA['ef'];\r\n        counts[last.set][last.victim]['ef']-=1;\r\n        sbRemovePoint(teamOf(last.provoker));\r\n    }\r\n    syncActiveSet();\r\n    refreshAllScores();\r\n    updateUndoBtn();\r\n    renderServeIndicator();\r\n}\r\n\r\nfunction refreshAllScores() {\r\n    var ks=['p1','p2','p3','p4'];\r\n    for (var i=0;i<ks.length;i++) document.getElementById('sc-'+ks[i]).innerText=fmt(stats[activeSet][ks[i]]);\r\n}\r\n\r\nfunction updateUndoBtn() {\r\n    var btn=document.getElementById('btn-undo');\r\n    if (actionHistory.length===0){btn.innerText=\"Undo last action\";btn.style.opacity=\"0.5\";return;}\r\n    btn.style.opacity=\"1\";\r\n    var last=actionHistory[actionHistory.length-1];\r\n    var names={w:\"Winner\",enf:\"UE\",ep:\"IE\",ef:\"FE\"};\r\n    if (last.kind==='simple') btn.innerText=\"Undo: \"+players[last.player]+\" (\"+names[last.type]+\") S\"+last.set;\r\n    else btn.innerText=\"Undo: Pressure IE\/FE S\"+last.set;\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ CONFIRMATIONS\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction showConfirm(title,msg,cb){\r\n    document.getElementById('confirm-title').innerText=title;\r\n    document.getElementById('confirm-msg').innerText=msg;\r\n    confirmCallback=cb;\r\n    document.getElementById('modal-confirm').style.display='flex';\r\n}\r\nfunction closeConfirm(){document.getElementById('modal-confirm').style.display='none';confirmCallback=null;}\r\nfunction doConfirm(){var cb=confirmCallback;closeConfirm();if(cb)cb();}\r\n\r\nfunction confirmNewMatch(){showConfirm(\"New analysis?\",\"All data from the current analysis will be lost.\",function(){location.reload();});}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ RESULTS\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction setScore(gamesA, gamesB, tb, team) {\r\n    if (!tb) return String((team==='A') ? gamesA : gamesB);\r\n    var won = (tb.winner === team);\r\n    if (tb.isSTB) {\r\n        if (won) return String(tb.winnerPts) + '(' + tb.loserPts + ')';\r\n        return String(tb.loserPts);\r\n    } else {\r\n        if (won) return '7(' + tb.loserPts + ')';\r\n        return '6';\r\n    }\r\n}\r\n\r\nfunction renderResults() {\r\n    document.getElementById('btn-back-to-court').style.display = isFinished ? 'none' : 'block';\r\n    var s = computeScore();\r\n    var numSets = s.setsA.length;\r\n\r\n    var setHeaders = '<th class=\"col-label\" style=\"min-width:140px;\">Team<\/th>';\r\n    for (var i=0;i<numSets;i++) {\r\n        var tb = s.setsTB[i] || null;\r\n        var lbl = 'Set '+(i+1);\r\n        if (tb && tb.isSTB) lbl += ' (STB)';\r\n        setHeaders += '<th style=\"min-width:70px;\">'+lbl+'<\/th>';\r\n    }\r\n\r\n    var rowA = '<td class=\"col-label\">'+players.p1+' \/ '+players.p2+'<\/td>';\r\n    var rowB = '<td class=\"col-label\">'+players.p3+' \/ '+players.p4+'<\/td>';\r\n    for (var i=0;i<numSets;i++) {\r\n        var tb = s.setsTB[i] || null;\r\n        var scoreA = setScore(s.setsA[i], s.setsB[i], tb, 'A');\r\n        var scoreB = setScore(s.setsA[i], s.setsB[i], tb, 'B');\r\n        var wonA = s.setsA[i] > s.setsB[i];\r\n        rowA += '<td style=\"font-size:1.3rem;font-weight:bold;color:'+(wonA?'var(--verde-oscuro)':'#aaa')+';\">'+scoreA+'<\/td>';\r\n        rowB += '<td style=\"font-size:1.3rem;font-weight:bold;color:'+(!wonA?'var(--verde-oscuro)':'#aaa')+';\">'+scoreB+'<\/td>';\r\n    }\r\n\r\n    document.getElementById('match-result-display').innerHTML =\r\n        '<table style=\"margin:0 auto;border-collapse:collapse;text-align:center;\">'+\r\n        '<thead><tr>'+setHeaders+'<\/tr><\/thead>'+\r\n        '<tbody>'+\r\n        '<tr>'+rowA+'<\/tr>'+\r\n        '<tr>'+rowB+'<\/tr>'+\r\n        '<\/tbody><\/table>';\r\n\r\n    var tbody=document.getElementById('res-table-body');\r\n    tbody.innerHTML='';\r\n    document.getElementById('tech-breakdown-container').innerHTML='';\r\n    var ks=['p1','p2','p3','p4'];\r\n    for (var i=0;i<ks.length;i++) {\r\n        var p=ks[i];\r\n        var s1=stats[1][p],s2=stats[2][p],s3=stats[3][p],tot=s1+s2+s3;\r\n        tbody.innerHTML+='<tr><td class=\"col-label\">'+players[p]+'<\/td><td>'+fmt(s1)+'<\/td><td>'+fmt(s2)+'<\/td><td>'+fmt(s3)+'<\/td><td class=\"col-total\">'+fmt(tot)+'<\/td><\/tr>';\r\n        document.getElementById('tech-breakdown-container').innerHTML+=\r\n            '<table class=\"results-table\" style=\"margin-top:20px;\"><thead>'+\r\n            '<tr><th colspan=\"5\" style=\"background:var(--verde-oscuro)\">'+players[p]+'&nbsp;&nbsp;<span style=\"font-weight:normal;opacity:0.85;\">(Total: '+fmt(tot)+')<\/span><\/th><\/tr>'+\r\n            '<tr><th>Game action<\/th><th>Set 1<\/th><th>Set 2<\/th><th>Set 3<\/th><th class=\"col-total\">TOTAL<\/th><\/tr><\/thead><tbody>'+\r\n            techRow(p,'w','Winners')+techRow(p,'enf','Unforced Errors')+\r\n            techRow(p,'ep','Induced Errors')+techRow(p,'ef','Forced Errors')+\r\n            '<\/tbody><\/table>';\r\n    }\r\n    changeScreen('results-screen');\r\n}\r\n\r\nfunction techRow(p,action,label){\r\n    var v1=counts[1][p][action],v2=counts[2][p][action],v3=counts[3][p][action];\r\n    return '<tr><td class=\"col-label\">'+label+'<\/td><td>'+v1+'<\/td><td>'+v2+'<\/td><td>'+v3+'<\/td><td class=\"col-total\">'+(v1+v2+v3)+'<\/td><\/tr>';\r\n}\r\n\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\n\/\/ EXPORT\r\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\r\nfunction getFinalSets() { var s=computeScore(); return {A:s.setsA,B:s.setsB,TB:s.setsTB||[]}; }\r\nfunction getResultStr(){\r\n    var fs=getFinalSets(),r='';\r\n    for(var i=0;i<fs.A.length;i++){\r\n        if(i>0)r+=' \/ ';\r\n        var tb=(fs.TB&&fs.TB[i])||null;\r\n        r+=setScore(fs.A[i],fs.B[i],tb,'A')+'-'+setScore(fs.A[i],fs.B[i],tb,'B');\r\n    }\r\n    return r;\r\n}\r\n\r\nfunction downloadCSV(){\r\n    var sep=\",\",lines=[];\r\n    var fs=getFinalSets();\r\n    var numSets=fs.A.length;\r\n\r\n    lines.push(\"BCA+ \\u2014 Basic Consistency Analysis with score tracking\");\r\n    lines.push(\"Date:\"+sep+new Date().toLocaleDateString('en-GB'));\r\n    lines.push(\"\");\r\n\r\n    var hdrCols=[\"Team\"];\r\n    for(var i=0;i<numSets;i++){\r\n        var tb=(fs.TB&&fs.TB[i])||null;\r\n        hdrCols.push((tb&&tb.isSTB)?'Set '+(i+1)+' (STB)':'Set '+(i+1));\r\n    }\r\n    lines.push(hdrCols.join(sep));\r\n    var rowACols=[players.p1+' \/ '+players.p2];\r\n    var rowBCols=[players.p3+' \/ '+players.p4];\r\n    for(var i=0;i<numSets;i++){\r\n        var tb=(fs.TB&&fs.TB[i])||null;\r\n        rowACols.push(setScore(fs.A[i],fs.B[i],tb,'A'));\r\n        rowBCols.push(setScore(fs.A[i],fs.B[i],tb,'B'));\r\n    }\r\n    lines.push(rowACols.join(sep));\r\n    lines.push(rowBCols.join(sep));\r\n    lines.push(\"\");\r\n\r\n    lines.push(\"BALANCE SHEETS (Weighted)\");\r\n    lines.push(\"Player\"+sep+\"Set 1\"+sep+\"Set 2\"+sep+\"Set 3\"+sep+\"TOTAL\");\r\n    var ks=['p1','p2','p3','p4'];\r\n    for(var i=0;i<ks.length;i++){var p=ks[i];var s1=stats[1][p],s2=stats[2][p],s3=stats[3][p],tot=s1+s2+s3;lines.push([players[p],fmt(s1),fmt(s2),fmt(s3),fmt(tot)].join(sep));}\r\n    lines.push(\"\");\r\n    lines.push(\"TECHNICAL BREAKDOWN (Game Actions)\");\r\n    var al={w:\"Winners\",enf:\"Unforced Errors\",ep:\"Induced Errors\",ef:\"Forced Errors\"},ak=['w','enf','ep','ef'];\r\n    for(var i=0;i<ks.length;i++){\r\n        var p=ks[i];\r\n        var s1=stats[1][p],s2=stats[2][p],s3=stats[3][p],tot=s1+s2+s3;\r\n        lines.push(players[p]+\" (Total: \"+fmt(tot)+\")\");\r\n        lines.push(\"Action\"+sep+\"Set 1\"+sep+\"Set 2\"+sep+\"Set 3\"+sep+\"TOTAL\");\r\n        for(var j=0;j<ak.length;j++){var a=ak[j];var v1=counts[1][p][a],v2=counts[2][p][a],v3=counts[3][p][a];lines.push([al[a],v1,v2,v3,v1+v2+v3].join(sep));}\r\n        lines.push(\"\");\r\n    }\r\n    var csv=lines.join(\"\\r\\n\");\r\n    var blob=new Blob([\"\\uFEFF\"+csv],{type:'text\/csv;charset=utf-8;'});\r\n    var url=URL.createObjectURL(blob);\r\n    var a=document.createElement('a');a.href=url;a.download='BCA_'+new Date().toISOString().slice(0,10)+'.csv';\r\n    document.body.appendChild(a);a.click();document.body.removeChild(a);URL.revokeObjectURL(url);\r\n}\r\n\r\nfunction copyText(){\r\n    var lines=[];\r\n    var fs=getFinalSets();\r\n    var numSets=fs.A.length;\r\n\r\n    lines.push(\"BCA+ \\u2014 Basic Consistency Analysis with score tracking\");\r\n    lines.push(new Date().toLocaleDateString('en-GB'));\r\n    lines.push(\"\");\r\n\r\n    var setColW=8;\r\n    var nameColW=20;\r\n    var hdr=\"Team\".padEnd(nameColW);\r\n    for(var i=0;i<numSets;i++){\r\n        var tb=(fs.TB&&fs.TB[i])||null;\r\n        var lbl=(tb&&tb.isSTB)?'STB':'Set '+(i+1);\r\n        hdr+=lbl.padStart(setColW);\r\n    }\r\n    lines.push(hdr);\r\n    lines.push(\"\".padEnd(nameColW+numSets*setColW,\"-\"));\r\n\r\n    var nA=(players.p1+' \/ '+players.p2).slice(0,nameColW-1).padEnd(nameColW);\r\n    var nB=(players.p3+' \/ '+players.p4).slice(0,nameColW-1).padEnd(nameColW);\r\n    var rowA=nA, rowB=nB;\r\n    for(var i=0;i<numSets;i++){\r\n        var tb=(fs.TB&&fs.TB[i])||null;\r\n        rowA+=setScore(fs.A[i],fs.B[i],tb,'A').padStart(setColW);\r\n        rowB+=setScore(fs.A[i],fs.B[i],tb,'B').padStart(setColW);\r\n    }\r\n    lines.push(rowA);\r\n    lines.push(rowB);\r\n    lines.push(\"\");\r\n\r\n    lines.push(\"BALANCE SHEETS\");\r\n    lines.push(\"Player\".padEnd(14)+\"S1\".padStart(6)+\"  S2\".padStart(6)+\"  S3\".padStart(6)+\"  TOTAL\".padStart(8));\r\n    lines.push(\"\".padEnd(44,\"-\"));\r\n    var ks=['p1','p2','p3','p4'];\r\n    for(var i=0;i<ks.length;i++){\r\n        var p=ks[i];\r\n        var s1=stats[1][p],s2=stats[2][p],s3=stats[3][p],tot=s1+s2+s3;\r\n        lines.push(players[p].padEnd(14)+fmt(s1).padStart(6)+\"  \"+fmt(s2).padStart(4)+\"  \"+fmt(s3).padStart(4)+\"  \"+fmt(tot).padStart(6));\r\n    }\r\n    lines.push(\"\");\r\n    lines.push(\"TECHNICAL BREAKDOWN\");\r\n    var al={w:\"Winners\",enf:\"UE\",ep:\"IE\",ef:\"FE\"},ak=['w','enf','ep','ef'];\r\n    for(var i=0;i<ks.length;i++){\r\n        var p=ks[i];\r\n        var s1=stats[1][p],s2=stats[2][p],s3=stats[3][p],tot=s1+s2+s3;\r\n        lines.push(\"\");\r\n        lines.push(players[p]+\" (Total: \"+fmt(tot)+\"):\");\r\n        for(var j=0;j<ak.length;j++){\r\n            var a=ak[j];\r\n            var v1=counts[1][p][a],v2=counts[2][p][a],v3=counts[3][p][a];\r\n            lines.push(\"  \"+al[a].padEnd(8)+\" S1:\"+v1+\"  S2:\"+v2+\"  S3:\"+v3+\"  Total:\"+(v1+v2+v3));\r\n        }\r\n    }\r\n    lines.push(\"\");\r\n    lines.push(\"Generated with BCA+ \\u2014 \\u00a9 Mart\\u00edn Echegaray Vales, Proyecto Elis\");\r\n    var text=lines.join(\"\\n\");\r\n    if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(text).then(function(){showCopyFeedback();});}\r\n    else{var ta=document.createElement('textarea');ta.value=text;ta.style.position='fixed';ta.style.opacity='0';document.body.appendChild(ta);ta.focus();ta.select();document.execCommand('copy');document.body.removeChild(ta);showCopyFeedback();}\r\n}\r\n\r\nfunction showCopyFeedback(){var fb=document.getElementById('copy-feedback');fb.style.display='block';setTimeout(function(){fb.style.display='none';},2500);}\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-6ab5c1d9 e-con-full e-flex e-con e-parent\" data-id=\"6ab5c1d9\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-28758149 elementor-widget__width-initial elementor-widget elementor-widget-image\" data-id=\"28758149\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"300\" height=\"145\" src=\"https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/version-simplificada-logo-blanco-2-1-300x145.png\" class=\"attachment-medium size-medium wp-image-1232\" alt=\"\" srcset=\"https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/version-simplificada-logo-blanco-2-1-300x145.png 300w, https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/version-simplificada-logo-blanco-2-1-1024x493.png 1024w, https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/version-simplificada-logo-blanco-2-1-768x370.png 768w, https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/version-simplificada-logo-blanco-2-1-1536x740.png 1536w, https:\/\/proelis.net\/en\/wp-content\/uploads\/sites\/2\/2024\/09\/version-simplificada-logo-blanco-2-1-2048x987.png 2048w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-11ca9fec elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"11ca9fec\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\u00a9 All rights reserved<\/h2>\t\t\t\t<\/div>\n\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>Menu Home Access the campus Contact Courses Let&#8217;s work together! BCA BCA+ Basic Consistency Analysiswith score tracking &#8216;In padel, it&#8217;s not the winner who wins, but the loser who loses.&#8217; START Instructions Settings Team A Team B Deuce system Golden point (decisive at 40-40) Star point (decisive at 3rd deuce) Traditional advantage Match format Full [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-1842","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/proelis.net\/en\/wp-json\/wp\/v2\/pages\/1842","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/proelis.net\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/proelis.net\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/proelis.net\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/proelis.net\/en\/wp-json\/wp\/v2\/comments?post=1842"}],"version-history":[{"count":4,"href":"https:\/\/proelis.net\/en\/wp-json\/wp\/v2\/pages\/1842\/revisions"}],"predecessor-version":[{"id":1849,"href":"https:\/\/proelis.net\/en\/wp-json\/wp\/v2\/pages\/1842\/revisions\/1849"}],"wp:attachment":[{"href":"https:\/\/proelis.net\/en\/wp-json\/wp\/v2\/media?parent=1842"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}