{"id":1603,"date":"2026-04-18T12:01:52","date_gmt":"2026-04-18T17:01:52","guid":{"rendered":"https:\/\/www.coviacol.com\/?page_id=1603"},"modified":"2026-05-24T14:38:37","modified_gmt":"2026-05-24T19:38:37","slug":"agendamiento","status":"publish","type":"page","link":"https:\/\/www.coviacol.com\/index.php\/agendamiento\/","title":{"rendered":"Agendamiento"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1603\" class=\"elementor elementor-1603\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f8eb7fd elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f8eb7fd\" data-element_type=\"section\" data-settings=\"{&quot;ekit_has_onepagescroll_dot&quot;:&quot;yes&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"aux-parallax-section elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7d61b5b\" data-id=\"7d61b5b\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-cdc7609 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"cdc7609\" data-element_type=\"section\" data-settings=\"{&quot;ekit_has_onepagescroll_dot&quot;:&quot;yes&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"aux-parallax-section elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ce0d203\" data-id=\"ce0d203\" data-element_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-ac922c3 elementor-widget-mobile__width-initial elementor-widget elementor-widget-html\" data-id=\"ac922c3\" data-element_type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>COVIACOL \u2014 Sistema de Agendamiento<\/title>\n  <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Barlow:wght@400;500;600;700;900&family=Barlow+Condensed:wght@700;900&display=swap\" rel=\"stylesheet\">\n  <style>\/* ============================================================\n   COVIACOL \u2014 Sistema de Agendamiento\n   Estilos principales\n   ============================================================ *\/\n\n* {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\n:root {\n  --gold:       #E5A800;\n  --gold-light: #FFD04D;\n  --gold-dark:  #B38200;\n  --black:      #111111;\n  --white:      #FFFFFF;\n  --gray-50:    #FAFAF8;\n  --gray-100:   #F2F0EA;\n  --gray-200:   #E0DDD4;\n  --gray-400:   #9E9B92;\n  --gray-600:   #5A5850;\n  --radius:     8px;\n  --radius-lg:  14px;\n  --shadow:     0 2px 16px rgba(0, 0, 0, 0.10);\n}\n\nbody {\n  font-family: 'Barlow', sans-serif;\n  background: #F7F5EF;\n  color: var(--black);\n  min-height: 100vh;\n}\n\n\/* ===== HEADER ===== *\/\n\n.header {\n  background: var(--black);\n  padding: 16px 32px;\n  display: flex;\n  align-items: center;\n  gap: 16px;\n  position: sticky;\n  top: 0;\n  z-index: 100;\n}\n\n.logo-icon {\n  width: 44px;\n  height: 44px;\n}\n\n.brand-name {\n  font-family: 'Barlow Condensed', sans-serif;\n  font-size: 27px;\n  font-weight: 900;\n  color: var(--gold);\n  letter-spacing: 1px;\n}\n\n.header-sub {\n  font-size: 17px;\n  color: var(--gray-400);\n  margin-top: 1px;\n}\n\n\/* ===== PROGRESS BAR ===== *\/\n\n.progress-bar {\n  padding: 0 32px 16px;\n  display: flex;\n  align-items: center;\n}\n\n.step-item {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  flex: 1;\n}\n\n.step-num {\n  width: 26px;\n  height: 26px;\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 16px;\n  font-weight: 700;\n  background: var(--gray-600);\n  color: var(--gray-400);\n  transition: all .3s;\n  flex-shrink: 0;\n}\n\n.step-num.active { background: var(--gold);      color: var(--black); }\n.step-num.done   { background: var(--gold-dark); color: var(--black); }\n\n.step-label {\n  font-size: 16px;\n  color: var(--gray-400);\n  font-weight: 500;\n  transition: color .3s;\n}\n\n.step-label.active { color: var(--gold); }\n\n.step-connector {\n  height: 2px;\n  flex: 1;\n  background: var(--gray-600);\n  margin: 0 8px;\n  transition: background .3s;\n}\n\n.step-connector.done { background: var(--gold-dark); }\n\n\/* ===== MAIN ===== *\/\n\n.main {\n  max-width: 860px;\n  margin: 0 auto;\n  padding: 32px 20px 60px;\n}\n\n.section-title {\n  font-family: 'Barlow Condensed', sans-serif;\n  font-size: 33px;\n  font-weight: 900;\n  color: var(--black);\n  margin-bottom: 6px;\n  text-transform: uppercase;\n  letter-spacing: .5px;\n}\n\n.section-sub {\n  font-size: 19px;\n  color: var(--gray-600);\n  margin-bottom: 24px;\n}\n\n\/* ===== STEP 1 \u2014 Sucursales ===== *\/\n\n.branches-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n  gap: 10px;\n}\n\n.branch-card {\n  background: var(--white);\n  border: 1.5px solid var(--gray-200);\n  border-radius: var(--radius-lg);\n  padding: 14px 18px;\n  cursor: pointer;\n  transition: all .2s;\n  display: flex;\n  align-items: center;\n  gap: 12px;\n}\n\n.branch-card:hover { border-color: var(--gold); background: #FFFBEF; }\n\n.branch-card.selected {\n  border-color: var(--gold);\n  background: #FFF8DC;\n  box-shadow: 0 0 0 3px rgba(229, 168, 0, .18);\n}\n\n.branch-num {\n  font-family: 'Barlow Condensed', sans-serif;\n  font-size: 23px;\n  font-weight: 900;\n  color: var(--gold);\n  min-width: 28px;\n}\n\n.branch-name {\n  font-size: 19px;\n  font-weight: 600;\n  color: var(--black);\n}\n\n\/* ===== STEP 2 \u2014 Calendario ===== *\/\n\n.calendar-wrap {\n  background: var(--white);\n  border: 1.5px solid var(--gray-200);\n  border-radius: var(--radius-lg);\n  padding: 24px;\n  max-width: 400px;\n}\n\n.cal-header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  margin-bottom: 20px;\n}\n\n.cal-month {\n  font-family: 'Barlow Condensed', sans-serif;\n  font-size: 25px;\n  font-weight: 900;\n  text-transform: uppercase;\n  letter-spacing: .5px;\n}\n\n.cal-nav {\n  background: none;\n  border: 1.5px solid var(--gray-200);\n  border-radius: var(--radius);\n  width: 32px;\n  height: 32px;\n  cursor: pointer;\n  font-size: 21px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: var(--black);\n  transition: all .2s;\n}\n\n.cal-nav:hover { border-color: var(--gold); background: #FFFBEF; }\n\n.cal-grid {\n  display: grid;\n  grid-template-columns: repeat(7, 1fr);\n  gap: 4px;\n}\n\n.cal-day-name {\n  font-size: 16px;\n  font-weight: 700;\n  color: var(--gray-400);\n  text-align: center;\n  padding: 4px 0;\n  text-transform: uppercase;\n}\n\n.cal-day {\n  height: 38px;\n  border-radius: var(--radius);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 18px;\n  font-weight: 500;\n  cursor: pointer;\n  transition: all .2s;\n  color: var(--black);\n}\n\n.cal-day.empty    { cursor: default; }\n.cal-day.disabled { color: var(--gray-200); cursor: not-allowed; }\n.cal-day.available:hover { background: #FFFBEF; color: var(--gold-dark); }\n.cal-day.selected { background: var(--gold); color: var(--black); font-weight: 700; }\n.cal-day.today    { border: 2px solid var(--gold); }\n\n.available-note {\n  margin-top: 14px;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 17px;\n  color: var(--gray-600);\n}\n\n.dot-avail {\n  width: 10px;\n  height: 10px;\n  border-radius: 50%;\n  background: var(--gold);\n  flex-shrink: 0;\n}\n\n\/* ===== STEP 3 \u2014 Horarios ===== *\/\n\n.times-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n  gap: 12px;\n  max-width: 600px;\n}\n\n.time-card {\n  background: var(--white);\n  border: 1.5px solid var(--gray-200);\n  border-radius: var(--radius-lg);\n  padding: 18px 20px;\n  cursor: pointer;\n  transition: all .2s;\n  text-align: center;\n}\n\n.time-card:hover { border-color: var(--gold); background: #FFFBEF; }\n\n.time-card.selected {\n  border-color: var(--gold);\n  background: var(--gold);\n  box-shadow: 0 0 0 3px rgba(229, 168, 0, .20);\n}\n\n.time-card.selected .time-main { color: var(--black); }\n.time-card.selected .time-dur  { color: rgba(0, 0, 0, .65); }\n\n.time-main {\n  font-family: 'Barlow Condensed', sans-serif;\n  font-size: 29px;\n  font-weight: 900;\n  color: var(--black);\n  line-height: 1;\n}\n\n.time-dur {\n  font-size: 16px;\n  color: var(--gray-400);\n  margin-top: 4px;\n  font-weight: 500;\n}\n\n\/* ===== STEP 4 \u2014 Formulario ===== *\/\n\n.form-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 16px;\n  max-width: 680px;\n}\n\n.form-group      { display: flex; flex-direction: column; gap: 6px; }\n.form-group.full { grid-column: 1 \/ -1; }\n\n.form-label {\n  font-size: 17px;\n  font-weight: 700;\n  color: var(--gray-600);\n  text-transform: uppercase;\n  letter-spacing: .5px;\n}\n\n.form-label span { color: #E24B4A; margin-left: 2px; }\n\n.form-input,\n.form-select {\n  background: var(--white);\n  border: 1.5px solid var(--gray-200);\n  border-radius: var(--radius);\n  padding: 10px 14px;\n  font-size: 19px;\n  font-family: 'Barlow', sans-serif;\n  color: var(--black);\n  transition: border-color .2s;\n  outline: none;\n  width: 100%;\n}\n\n.form-input:focus,\n.form-select:focus {\n  border-color: var(--gold);\n  box-shadow: 0 0 0 3px rgba(229, 168, 0, .15);\n}\n\n.form-select {\n  appearance: none;\n  background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='8' fill='none'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23888' stroke-width='1.5' stroke-linecap='round'\/%3E%3C\/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: right 14px center;\n  padding-right: 36px;\n}\n\n\/* ===== SUMMARY BOX ===== *\/\n\n.summary-box {\n  background: var(--gray-100);\n  border: 1.5px solid var(--gray-200);\n  border-radius: var(--radius-lg);\n  padding: 24px 28px;\n  margin-bottom: 24px;\n  max-width: 680px;\n  text-align: center;\n}\n\n.summary-title {\n  font-family: 'Barlow Condensed', sans-serif;\n  font-size: 25px;\n  font-weight: 700;\n  color: var(--black);\n  text-transform: uppercase;\n  letter-spacing: 1px;\n  margin-bottom: 14px;\n}\n\n.summary-row {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 6px 0;\n  border-bottom: 1px solid rgba(255, 255, 255, .06);\n}\n\n.summary-row:last-child { border-bottom: none; }\n\n.sum-key { font-size: 20px; font-weight: 700; color: var(--black); text-transform: uppercase;}\n.sum-val { font-size: 20px; font-weight: 600; color: var(--black); }\n\n\/* ===== BUTTONS ===== *\/\n\n.btn {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: 8px;\n  padding: 12px 28px;\n  border-radius: var(--radius);\n  font-family: 'Barlow', sans-serif;\n  font-size: 19px;\n  font-weight: 700;\n  cursor: pointer;\n  transition: all .2s;\n  border: none;\n  text-transform: uppercase;\n  letter-spacing: .5px;\n}\n\n.btn-gold          { background: var(--gold); color: var(--black); }\n.btn-gold:hover    { background: var(--gold-light); }\n.btn-back          { background: none; border: 1.5px solid var(--gray-200); color: var(--gray-600); }\n.btn-back:hover    { border-color: var(--gray-400); color: var(--black); }\n.btn-row           { display: flex; gap: 12px; margin-top: 28px; }\n.btn:disabled      { opacity: .4; cursor: not-allowed; }\n\n\/* ===== STEP 5 \u2014 Confirmaci\u00f3n ===== *\/\n\n.confirm-wrap { text-align: center; padding: 24px 0; }\n\n.confirm-icon {\n  width: 72px;\n  height: 72px;\n  background: var(--gold);\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin: 0 auto 20px;\n  font-size: 37px;\n}\n\n.confirm-title {\n  font-family: 'Barlow Condensed', sans-serif;\n  font-size: 37px;\n  font-weight: 900;\n  color: var(--black);\n  text-transform: uppercase;\n  margin-bottom: 8px;\n}\n\n.confirm-sub {\n  font-size: 20px;\n  color: var(--gray-600);\n  margin-bottom: 32px;\n}\n\n\n\/* ===== RESPONSIVE ===== *\/\n\n@media (max-width: 600px) {\n  .form-grid         { grid-template-columns: 1fr; }\n  .form-group.full   { grid-column: 1; }\n  .branches-grid     { grid-template-columns: 1fr 1fr; }\n  .main              { padding: 20px 12px 60px; }\n  .header            { padding: 12px 16px; }\n  .progress-bar      { padding: 0 16px 12px; }\n  .step-label        { display: none; }\n}\n\n\/* ===== ADDRESS BAR ===== *\/\n.address-bar {\n  display: none;\n  align-items: center;\n  gap: 10px;\n  padding: 10px 32px;\n  font-size: 18px;\n  color: var(--gray-400);\n  flex-wrap: wrap;\n}\n.address-bar-icon { color: var(--gold); flex-shrink: 0;}\n.address-bar-text { flex: 1; font-size: 25px; color: black; font-weight: bold;}\n.address-bar-link {\n  color: var(--gold);\n  font-weight: 700;\n  text-decoration: none;\n  font-size: 22px;\n  text-transform: uppercase;\n  letter-spacing: .5px;\n  white-space: nowrap;\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n}\n.address-bar-link:hover { color: var(--gold-light); }\n\n\/* ===== SEDE INFO EN CONFIRMACION ===== *\/\n.sede-info-box {\n  background: var(--gray-100);\n  border: 1.5px solid var(--gray-200);\n  border-radius: var(--radius-lg);\n  padding: 18px 24px;\n  max-width: 680px;\n  margin-bottom: 20px;\n  display: flex;\n  align-items: flex-start;\n  gap: 14px;\n}\n.sede-info-icon {\n  width: 36px; height: 36px;\n  background: var(--gold);\n  border-radius: 50%;\n  display: flex; align-items: center; justify-content: center;\n  flex-shrink: 0;\n}\n.sede-info-name {\n  font-family: 'Barlow Condensed', sans-serif;\n  font-size: 21px; font-weight: 900;\n  color: var(--black); text-transform: uppercase;\n  letter-spacing: .5px; margin-bottom: 3px;\n}\n.sede-info-address { font-size: 18px; color: var(--gray-600); margin-bottom: 6px; }\n.sede-maps-link {\n  display: inline-flex; align-items: center; gap: 6px;\n  font-size: 17px; font-weight: 700; color: var(--gold-dark);\n  text-decoration: none; text-transform: uppercase; letter-spacing: .5px;\n}\n.sede-maps-link:hover { color: var(--gold); }\n\n\/* ===== HORARIOS BLOQUEADOS ===== *\/\n.time-card-blocked {\n  background: var(--gray-100);\n  border: 1.5px solid var(--gray-200);\n  border-radius: var(--radius-lg);\n  padding: 18px 20px;\n  text-align: center;\n  cursor: not-allowed;\n  opacity: .55;\n}\n.time-card-blocked .time-main {\n  font-family: 'Barlow Condensed', sans-serif;\n  font-size: 29px; font-weight: 900;\n  color: var(--gray-400); line-height: 1;\n  text-decoration: line-through;\n}\n.time-card-blocked .time-dur {\n  font-size: 15px; color: #E24B4A;\n  margin-top: 4px; font-weight: 700;\n  text-transform: uppercase; letter-spacing: .3px;\n}\n\n<\/style>\n<\/head>\n<body>\n\n<!-- ===== PROGRESS BAR ===== -->\n<div class=\"progress-bar\">\n  <div class=\"step-item\">\n    <div class=\"step-num active\" id=\"pn1\">1<\/div>\n    <div class=\"step-label active\" id=\"pl1\">Sucursal<\/div>\n  <\/div>\n  <div class=\"step-connector\" id=\"pc1\"><\/div>\n  <div class=\"step-item\">\n    <div class=\"step-num\" id=\"pn2\">2<\/div>\n    <div class=\"step-label\" id=\"pl2\">Fecha y Hora<\/div>\n  <\/div>\n  <div class=\"step-connector\" id=\"pc2\"><\/div>\n  <div class=\"step-item\">\n    <div class=\"step-num\" id=\"pn3\">3<\/div>\n    <div class=\"step-label\" id=\"pl3\">Datos<\/div>\n  <\/div>\n  <div class=\"step-connector\" id=\"pc3\"><\/div>\n  <div class=\"step-item\">\n    <div class=\"step-num\" id=\"pn4\">4<\/div>\n    <div class=\"step-label\" id=\"pl4\">Confirmaci\u00f3n<\/div>\n  <\/div>\n<\/div>\n\n<!-- ===== ADDRESS BAR (steps 2-4) ===== -->\n<div class=\"address-bar\" id=\"addressBar\">\n  <span class=\"address-bar-icon\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"\/><circle cx=\"12\" cy=\"10\" r=\"3\"\/><\/svg><\/span>\n  <span class=\"address-bar-text\" id=\"addressText\"><\/span>\n  <a class=\"address-bar-link\" id=\"addressLink\" href=\"#\" target=\"_blank\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"\/><circle cx=\"12\" cy=\"10\" r=\"3\"\/><\/svg> Ver en mapa<\/a>\n<\/div>\n\n<!-- ===== MAIN ===== -->\n<div class=\"main\">\n\n  <!-- STEP 1: Sucursales -->\n  <div id=\"step1\">\n    <div class=\"section-title\">Selecciona tu sucursal<\/div>\n    <div class=\"section-sub\">Al elegir la sede pasar\u00e1s autom\u00e1ticamente al siguiente paso<\/div>\n    <div class=\"branches-grid\" id=\"branchesGrid\"><\/div>\n  <\/div>\n\n  <!-- STEP 2: Fecha + Hora (combinados) -->\n  <div id=\"step2\" style=\"display:none\">\n    <div class=\"section-title\">Elige la fecha y el horario<\/div>\n    <div class=\"section-sub\">Selecciona el d\u00eda y luego el horario disponible<\/div>\n    <div class=\"calendar-wrap\">\n      <div class=\"cal-header\">\n        <button class=\"cal-nav\" onclick=\"changeMonth(-1)\">&#8249;<\/button>\n        <div class=\"cal-month\" id=\"calMonth\"><\/div>\n        <button class=\"cal-nav\" onclick=\"changeMonth(1)\">&#8250;<\/button>\n      <\/div>\n      <div class=\"cal-grid\" id=\"calGrid\"><\/div>\n      <div class=\"available-note\">\n        <div class=\"dot-avail\"><\/div>\n        <span>Los d\u00edas resaltados est\u00e1n disponibles para agendar<\/span>\n      <\/div>\n    <\/div>\n\n    <!-- Horarios: aparecen al seleccionar un d\u00eda -->\n    <div id=\"timesSection\" style=\"display:none; margin-top:28px;\">\n      <div class=\"section-title\" style=\"font-size: 25px;\">Selecciona el horario<\/div>\n      <div class=\"section-sub\" style=\"margin-bottom:16px;\">Elige la hora de tu cita<\/div>\n      <div class=\"times-grid\" id=\"timesGrid\"><\/div>\n    <\/div>\n\n    <div class=\"btn-row\">\n      <button class=\"btn btn-back\" onclick=\"goStep(1)\">Volver<\/button>\n      <button class=\"btn btn-gold\" id=\"btn2Next\" onclick=\"goStep(3)\" disabled>Continuar<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- STEP 3: Formulario -->\n  <div id=\"step3\" style=\"display:none\">\n    <div class=\"section-title\">Informaci\u00f3n del comparendo<\/div>\n    <div class=\"section-sub\">Completa todos los campos obligatorios<\/div>\n    <div style=\"background:#FFF8DC;border-left:4px solid #E5A800;border-radius:0 8px 8px 0;padding:12px 16px;margin-bottom:20px;font-size: 18px;color:#5A3E00;font-weight:600;line-height:1.5;\">\n      \u26a0\ufe0f Recuerde que la persona que debe realizar el curso es la persona a la que se encuentra cargado el comparendo.\n    <\/div>\n    <div class=\"form-grid\">\n      <div class=\"form-group\">\n        <label class=\"form-label\">N\u00famero de documento<span>*<\/span><\/label>\n        <input class=\"form-input\" id=\"fDoc\" type=\"text\" placeholder=\"Ej: 1234567890\" oninput=\"checkForm()\">\n      <\/div>\n      <div class=\"form-group\">\n        <label class=\"form-label\">N\u00famero de contacto<span>*<\/span><\/label>\n        <input class=\"form-input\" id=\"fPhone\" type=\"tel\" placeholder=\"Ej: 3001234567\" oninput=\"checkForm()\">\n      <\/div>\n      <div class=\"form-group\">\n        <label class=\"form-label\">C\u00f3digo del comparendo<span>*<\/span><\/label>\n        <input class=\"form-input\" id=\"fCode\" type=\"text\" placeholder=\"Ej: C29\" oninput=\"checkForm()\">\n      <\/div>\n      <div class=\"form-group\">\n        <label class=\"form-label\">Placa del veh\u00edculo<span>*<\/span><\/label>\n        <input class=\"form-input\" id=\"fPlaca\" type=\"text\" placeholder=\"Ej: ABC123\" oninput=\"this.value=this.value.toUpperCase();checkForm()\" maxlength=\"7\" style=\"text-transform:uppercase\">\n      <\/div>\n      <div class=\"form-group\">\n        <label class=\"form-label\">Tipo de comparendo<span>*<\/span><\/label>\n        <select class=\"form-select\" id=\"fType\" onchange=\"checkForm()\">\n          <option value=\"\">Selecciona el tipo<\/option>\n          <option value=\"Fotodetecci\u00f3n\">Fotodetecci\u00f3n<\/option>\n          <option value=\"Comparendo F\u00edsico\">Comparendo F\u00edsico<\/option>\n        <\/select>\n      <\/div>\n    <\/div>\n    <div class=\"btn-row\">\n      <button class=\"btn btn-back\" onclick=\"goStep(2)\">Volver<\/button>\n      <button class=\"btn btn-gold\" id=\"btn3Next\" onclick=\"goStep(4)\" disabled>Confirmar cita<\/button>\n    <\/div>\n  <\/div>\n\n  <!-- STEP 4: Confirmaci\u00f3n -->\n  <div id=\"step4\" style=\"display:none\">\n    <div class=\"confirm-wrap\">\n      <div class=\"confirm-icon\">\u2713<\/div>\n      <div class=\"confirm-title\">\u00a1Cita agendada!<\/div>\n      <div class=\"confirm-sub\">Tu cita qued\u00f3 registrada correctamente.<\/div>\n    <\/div>\n\n    <!-- Informaci\u00f3n de la sede -->\n    <div class=\"sede-info-box\" id=\"sedeInfoBox\">\n      <div class=\"sede-info-icon\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#111\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"\/><circle cx=\"12\" cy=\"10\" r=\"3\"\/><\/svg><\/div>\n      <div>\n        <div class=\"sede-info-name\" id=\"sedeInfoName\"><\/div>\n        <div class=\"sede-info-address\" id=\"sedeInfoAddress\"><\/div>\n        <a class=\"sede-maps-link\" id=\"sedeInfoMaps\" href=\"#\" target=\"_blank\">\n          <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"\/><circle cx=\"12\" cy=\"10\" r=\"3\"\/><\/svg> Ver ubicaci\u00f3n en Google Maps\n        <\/a>\n      <\/div>\n    <\/div>\n\n    <div style=\"background:#FFF8DC;border-left:4px solid #E5A800;border-radius:0 8px 8px 0;padding:12px 16px;margin-bottom:20px;max-width:680px;font-size: 18px;color:#5A3E00;font-weight:600;line-height:1.5;\">\n      \u26a0\ufe0f Recuerde que la persona que debe realizar el curso es la persona a la que se encuentra cargado el comparendo.\n    <\/div>\n    <div class=\"summary-box\">\n      <div class=\"summary-title\">Resumen de tu cita<\/div>\n      <div id=\"summaryContent\"><\/div>\n    <\/div>\n  <\/div>\n\n<\/div><!-- \/main -->\n\n<script>\n\/\/ --- FESTIVOS COLOMBIA ---\n\/\/ Festivos fijos + Ley Emiliani calculados para 2024-2030\nfunction getColombianHolidays(year) {\n  const h = new Set();\n  function add(m, d) { h.add(year + '-' + String(m).padStart(2,'0') + '-' + String(d).padStart(2,'0')); }\n  \/\/ Emiliani: mueve al siguiente lunes si no cae en lunes\n  function emiliani(m, d) {\n    const dt = new Date(year, m-1, d);\n    const dow = dt.getDay(); \/\/ 0=dom\n    const diff = dow === 1 ? 0 : (dow === 0 ? 1 : 8 - dow);\n    const moved = new Date(dt); moved.setDate(d + diff);\n    h.add(year + '-' + String(moved.getMonth()+1).padStart(2,'0') + '-' + String(moved.getDate()).padStart(2,'0'));\n  }\n  \/\/ Pascua (Gauss)\n  function easter(y) {\n    const a=y%19,b=Math.floor(y\/100),c=y%100,d=Math.floor(b\/4),e=b%4;\n    const f=Math.floor((b+8)\/25),g=Math.floor((b-f+1)\/3),h2=(19*a+b-d-g+15)%30;\n    const i=Math.floor(c\/4),k=c%4,l=(32+2*e+2*i-h2-k)%7;\n    const m2=Math.floor((a+11*h2+22*l)\/451);\n    const month=Math.floor((h2+l-7*m2+114)\/31);\n    const day=((h2+l-7*m2+114)%31)+1;\n    return new Date(y, month-1, day);\n  }\n  const e = easter(year);\n  function addDays(dt, n) { const d2=new Date(dt); d2.setDate(d2.getDate()+n); return d2; }\n  function fmtDate(dt) { return dt.getFullYear()+'-'+String(dt.getMonth()+1).padStart(2,'0')+'-'+String(dt.getDate()).padStart(2,'0'); }\n\n  \/\/ Fijos\n  add(1,1);   \/\/ A\u00f1o Nuevo\n  add(5,1);   \/\/ D\u00eda del Trabajo\n  add(7,20);  \/\/ Independencia\n  add(8,7);   \/\/ Batalla de Boyac\u00e1\n  add(12,8);  \/\/ Inmaculada Concepci\u00f3n\n  add(12,25); \/\/ Navidad\n\n  \/\/ Emiliani (se mueven al lunes siguiente)\n  emiliani(1,6);   \/\/ Reyes Magos\n  emiliani(3,19);  \/\/ San Jos\u00e9\n  emiliani(6,29);  \/\/ San Pedro y San Pablo\n  emiliani(8,15);  \/\/ Asunci\u00f3n\n  emiliani(10,12); \/\/ D\u00eda de la Raza\n  emiliani(11,1);  \/\/ Todos los Santos\n  emiliani(11,11); \/\/ Independencia de Cartagena\n\n  \/\/ Relativos a Pascua\n  h.add(fmtDate(addDays(e, -3)));  \/\/ Jueves Santo\n  h.add(fmtDate(addDays(e, -2)));  \/\/ Viernes Santo\n  h.add(fmtDate(addDays(e, 43)));  \/\/ Ascensi\u00f3n (Emiliani +39+4)\n  \/\/ Ascensi\u00f3n, Corpus Christi, Sagrado Coraz\u00f3n \u2192 Emiliani\n  const ascension = addDays(e, 39);\n  const corpus    = addDays(e, 60);\n  const sagrado   = addDays(e, 68);\n  [ascension, corpus, sagrado].forEach(dt => {\n    const dow = dt.getDay();\n    const diff = dow === 1 ? 0 : (dow === 0 ? 1 : 8 - dow);\n    dt.setDate(dt.getDate() + diff);\n    h.add(fmtDate(dt));\n  });\n\n  return h;\n}\n\n\/\/ Pre-calcular festivos 2024-2030\nconst COLOMBIA_HOLIDAYS = new Set();\nfor (let y = 2024; y <= 2030; y++) {\n  getColombianHolidays(y).forEach(d => COLOMBIA_HOLIDAYS.add(d));\n}\n\n\/\/ Helper: parsear label de hora a minutos desde medianoche\nfunction timeToMinutes(label) {\n  \/\/ label ej: '8:00 A.M.' '10:30 A.M.' '2:00 P.M.'\n  const clean = label.trim();\n  const isPM  = clean.includes('P.M.');\n  const time  = clean.replace('A.M.','').replace('P.M.','').trim();\n  const [hStr, mStr] = time.split(':');\n  let h = parseInt(hStr, 10);\n  const m = parseInt(mStr, 10);\n  if (isPM && h !== 12) h += 12;\n  if (!isPM && h === 12) h = 0;\n  return h * 60 + m;\n}\n\n\/\/ --- Barra de direcci\u00f3n (pasos 2-4) ---\nfunction updateAddressBar() {\n  const bar = document.getElementById('addressBar');\n  if (state.branch === null) { bar.style.display = 'none'; return; }\n  const info = BRANCH_ADDRESSES[state.branch];\n  bar.style.display = 'flex';\n  document.getElementById('addressText').textContent = BRANCHES[state.branch] + ' \u2014 ' + info.address;\n  document.getElementById('addressLink').href = info.maps;\n}\n\n\/\/ ============================================================\n\/\/ COVIACOL \u2014 Sistema de Agendamiento\n\/\/ Configuraci\u00f3n y l\u00f3gica\n\/\/ ============================================================\n\n\/\/ ============================================================\n\/\/ CONFIGURACI\u00d3N \u2014 EDITA AQU\u00cd LOS VALORES QUE NECESITES\n\/\/ ============================================================\n\n\n\/\/ --- GOOGLE SHEETS \/ DRIVE ---\n\/\/ 1) Crea una hoja de c\u00e1lculo en Google Drive.\n\/\/ 2) Pega el archivo Code.gs incluido en este paquete en Extensiones > Apps Script.\n\/\/ 3) Publica el Apps Script como aplicaci\u00f3n web y pega aqu\u00ed la URL que termina en \/exec.\nconst GOOGLE_SHEETS_WEB_APP_URL = 'https:\/\/script.google.com\/macros\/s\/AKfycbyjXKaPYLfSNWQlIql72ZcTckw9yvmfubJsq43H_JKSOAcSVPZ0r9Y4G4BUVZH-svLf\/exec';\n\n\/\/ Este token debe coincidir con el TOKEN del archivo Code.gs.\n\/\/ No es una seguridad fuerte porque est\u00e1 visible en el HTML, pero evita env\u00edos accidentales.\nconst GOOGLE_SHEETS_TOKEN = 'COVIACOL_2026';\n\n\/\/ --- SUCURSALES ---\n\/\/ Agrega, quita o renombra sucursales en este array.\n\/\/ El n\u00famero visible se asigna autom\u00e1ticamente seg\u00fan el orden.\nconst BRANCHES = [\n  'Bogot\u00e1 Terminal Salitre',\n  'Bogot\u00e1 Restrepo',\n  'Bogot\u00e1 CC Fiesta Suba',\n  'Bogot\u00e1 \u00c1lamos',\n  'Soacha',\n  'Facatativ\u00e1',\n  'Barranquilla CC Americano',\n  'Barranquilla CRA 46#82',\n  'Barranquilla Gobernaci\u00f3n',\n  'Barranquilla Las Cayenas',\n  'Cali',\n  'Cartagena Espinal',\n  'Cartagena Manga',\n  'Cartagena CC Ronda Real',\n  'Popayan',\n  'La Dorada',\n  'Melgar',\n  'Sincelejo',\n  'Sampu\u00e9s',\n  'Villavicencio',\n  'Honda',\n  'Mariquita',\n  'Armenia',\n  'Pereira',\n  'Dosquebradas',\n  'Manizales',\n];\n\n\/\/ --- D\u00cdAS DISPONIBLES ---\n\/\/ Formato: 'YYYY-MM-DD'. Agrega o quita fechas seg\u00fan disponibilidad.\n\/\/ Por defecto se generan autom\u00e1ticamente los pr\u00f3ximos 30 d\u00edas h\u00e1biles.\n\/\/ Si prefieres fechas manuales, reemplaza el bloque por algo como:\n\/\/   const AVAILABLE_DAYS = ['2025-05-10', '2025-05-11', '2025-05-14'];\nconst AVAILABLE_DAYS = (function () {\n  const days = [];\n  const today = new Date();\n  for (let i = 0; i <= 30; i++) {  \/\/ i=0 incluye hoy\n    const d = new Date(today);\n    d.setDate(today.getDate() + i);\n    \/\/ 0 = domingo, 6 = s\u00e1bado \u2014 excluidos por defecto\n    if (d.getDay() !== 0) {\n      const key = d.getFullYear() + '-'\n        + String(d.getMonth() + 1).padStart(2, '0') + '-'\n        + String(d.getDate()).padStart(2, '0');\n      days.push(key);\n    }\n  }\n  return days;\n})();\n\n\/\/ --- HORARIOS POR SEDE ---\n\/\/ Cada objeto: { label: texto visible, val: valor interno }\nconst BRANCH_SCHEDULES = {\n  0: [  \/\/ Bogot\u00e1 (Sucursal 1)\n    { label: '7:00 A.M.', val: '7:00 A.M.' },\n    { label: '8:00 A.M.', val: '8:00 A.M.' },\n    { label: '9:00 A.M.', val: '9:00 A.M.' },\n    { label: '9:30 A.M.', val: '9:30 A.M.' },\n    { label: '10:00 A.M.', val: '10:00 A.M.' },\n    { label: '11:00 A.M.', val: '11:00 A.M.' },\n    { label: '11:30 A.M.', val: '11:30 A.M.' },\n    { label: '12:00 P.M.', val: '12:00 P.M.' },\n    { label: '1:00 P.M.', val: '1:00 P.M.' },\n    { label: '1:30 P.M.', val: '1:30 P.M.' },\n    { label: '2:00 P.M.', val: '2:00 P.M.' },\n    { label: '3:00 P.M.', val: '3:00 P.M.' },\n    { label: '3:30 P.M.', val: '3:30 P.M.' },\n    { label: '4:00 P.M.', val: '4:00 P.M.' },\n    \n  ],\n  1: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n    { label: '7:00 A.M.', val: '7:00 A.M.' },\n    { label: '7:30 A.M.', val: '8:00 A.M.' },\n    { label: '8:20 A.M.', val: '9:00 A.M.' },\n    { label: '9:00 A.M.', val: '9:30 A.M.' },\n    { label: '9:30 A.M.', val: '10:00 A.M.' },\n    { label: '10:20 A.M.', val: '11:00 A.M.' },\n    { label: '11:00 A.M.', val: '11:30 A.M.' },\n    { label: '12:00 P.M.', val: '12:00 P.M.' },\n    { label: '12:50 P.M.', val: '1:00 P.M.' },\n    { label: '1:30 P.M.', val: '1:30 P.M.' },\n    { label: '2:00 P.M.', val: '2:00 P.M.' },\n    { label: '3:00 P.M.', val: '3:00 P.M.' },\n    { label: '3:30 P.M.', val: '3:30 P.M.' },\n  ],\n\n  2: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:00 A.M.', val: '8:00 A.M.' },\n  { label: '9:00 A.M.', val: '9:00 A.M.' },\n  { label: '10:00 A.M.', val: '10:00 A.M.' },\n  { label: '11:00 A.M.', val: '11:00 A.M.' },\n  { label: '12:00 P.M.', val: '12:00 P.M.' },\n  { label: '1:00 P.M.', val: '1:00 P.M.' },\n  { label: '2:00 P.M.', val: '2:00 P.M.' },\n  { label: '3:00 P.M.', val: '3:00 P.M.' },\n  { label: '4:00 P.M.', val: '4:00 P.M.' },\n  ],\n\n  3: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:00 A.M.', val: '8:00 A.M.' },\n  { label: '9:00 A.M.', val: '9:00 A.M.' },\n  { label: '10:00 A.M.', val: '10:00 A.M.' },\n  { label: '11:00 A.M.', val: '11:00 A.M.' },\n  { label: '12:00 P.M.', val: '12:00 P.M.' },\n  { label: '1:00 P.M.', val: '1:00 P.M.' },\n  { label: '2:00 P.M.', val: '2:00 P.M.' },\n  { label: '3:00 P.M.', val: '3:00 P.M.' },\n  { label: '4:00 P.M.', val: '4:00 P.M.' },\n  ],\n\n  4: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:00 A.M.', val: '8:00 A.M.' },\n  { label: '9:00 A.M.', val: '9:00 A.M.' },\n  { label: '10:00 A.M.', val: '10:00 A.M.' },\n  { label: '11:00 A.M.', val: '11:00 A.M.' },\n  { label: '12:00 P.M.', val: '12:00 P.M.' },\n  { label: '1:00 P.M.', val: '1:00 P.M.' },\n  { label: '2:00 P.M.', val: '2:00 P.M.' },\n  { label: '3:00 P.M.', val: '3:00 P.M.' },\n  ],\n\n  5: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:30 A.M.', val: '8:30 A.M.' },\n  { label: '9:20 A.M.', val: '9:20 A.M.' },\n  { label: '10:35 A.M.', val: '10:35 A.M.' },\n  { label: '11:20 A.M.', val: '11:20 A.M.' },\n  { label: '12:45 P.M.', val: '12:45 P.M.' },\n  { label: '1:30 P.M.', val: '1:30 P.M.' },\n  { label: '3:00 P.M.', val: '3:00 P.M.' },\n  { label: '3:30 P.M.', val: '3:30 P.M.' },\n  ],\n\n  6: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:30 A.M.', val: '8:30 A.M.' },\n  { label: '10:30 A.M.', val: '10:30 A.M.' },\n  { label: '1:00 P.M.', val: '1:00 P.M.' },\n  { label: '3:00 P.M.', val: '3:00 P.M.' },\n  ],\n\n  7: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '9:00 A.M.', val: '9:00 A.M.' },\n  { label: '11:00 A.M.', val: '11:00 A.M.' },\n  { label: '1:00 P.M.', val: '1:00 P.M.' },\n  { label: '3:00 P.M.', val: '3:00 P.M.' },\n  ],\n\n  8: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:30 A.M.', val: '8:30 A.M.' },\n  { label: '10:30 A.M.', val: '10:30 A.M.' },\n  { label: '1:00 P.M.', val: '1:00 P.M.' },\n  { label: '3:00 P.M.', val: '3:00 P.M.' },\n  ],\n\n  9: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:30 A.M.', val: '8:30 A.M.' },\n  { label: '9:00 A.M.', val: '9:00 A.M.' },\n  { label: '10:30 A.M.', val: '10:30 A.M.' },\n  { label: '11:00 A.M.', val: '11:00 A.M.' },\n  { label: '12:30 P.M.', val: '12:30 P.M.' },\n  { label: '1:00 P.M.', val: '1:00 P.M.' },\n  { label: '3:00 P.M.', val: '3:00 P.M.' },\n  ],\n\n  10: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:00 A.M.', val: '8:00 A.M.' },\n  { label: '10:00 A.M.', val: '10:00 A.M.' },\n  { label: '12:00 P.M.', val: '12:00 P.M.' },\n  { label: '2:00 P.M.', val: '2:00 P.M.' },\n  ],\n\n  11: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:00 A.M.', val: '8:00 A.M.' },\n  { label: '10:00 A.M.', val: '10:00 A.M.' },\n  { label: '1:00 P.M.', val: '1:00 P.M.' },\n  { label: '3:00 P.M.', val: '3:00 P.M.' },\n  ],\n\n  12: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '7:30 A.M.', val: '7:30 A.M.' },\n  { label: '8:30 A.M.', val: '8:30 A.M.' },\n  { label: '9:30 A.M.', val: '9:30 A.M.' },\n  { label: '10:30 A.M.', val: '10:30 A.M.' },\n  { label: '11:30 A.M.', val: '11:30 A.M.' },\n  { label: '12:30 P.M.', val: '12:30 P.M.' },\n  { label: '1:30 P.M.', val: '1:30 P.M.' },\n  { label: '2:30 P.M.', val: '2:30 P.M.' },\n  { label: '3:30 P.M.', val: '3:30 P.M.' },\n  ],\n\n  13: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '7:30 A.M.', val: '7:30 A.M.' },\n  { label: '9:30 A.M.', val: '9:30 A.M.' },\n  { label: '11:30 A.M.', val: '11:30 A.M.' },\n  { label: '1:30 P.M.', val: '1:30 P.M.' },\n  { label: '3:30 P.M.', val: '3:30 P.M.' },\n  ],\n\n  14: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:20 A.M.', val: '8:20 A.M.' },\n  { label: '9:20 A.M.', val: '9:20 A.M.' },\n  { label: '10:20 A.M.', val: '10:20 A.M.' },\n  { label: '11:20 A.M.', val: '11:20 A.M.' },\n  { label: '2:20 P.M.', val: '2:20 P.M.' },\n  ],\n\n  15: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:00 A.M.', val: '8:00 A.M.' },\n  { label: '9:00 A.M.', val: '9:00 A.M.' },\n  { label: '10:00 A.M.', val: '10:00 A.M.' },\n  { label: '12:00 P.M.', val: '12:00 P.M.' },\n  { label: '2:00 P.M.', val: '2:00 P.M.' },\n  ],\n\n  16: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:30 A.M.', val: '8:30 A.M.' },\n  { label: '10:30 A.M.', val: '10:30 A.M.' },\n  { label: '12:30 P.M.', val: '12:30 P.M.' },\n  { label: '2:30 P.M.', val: '2:30 P.M.' },\n  ],\n\n  17: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:00 A.M.', val: '8:00 A.M.' },\n  { label: '9:00 A.M.', val: '9:00 A.M.' },\n  { label: '10:00 A.M.', val: '10:00 A.M.' },\n  { label: '11:00 A.M.', val: '11:00 A.M.' },\n  { label: '12:00 P.M.', val: '12:00 P.M.' },\n  { label: '1:00 P.M.', val: '1:00 P.M.' },\n  { label: '2:00 P.M.', val: '2:00 P.M.' },\n  { label: '3:00 P.M.', val: '3:00 P.M.' },\n  ],\n\n  18: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '7:00 A.M.', val: '7:00 A.M.' },\n  { label: '9:00 A.M.', val: '9:00 A.M.' },\n  { label: '11:00 A.M.', val: '11:00 A.M.' },\n  { label: '1:00 P.M.', val: '1:00 P.M.' },\n  ],\n\n  19: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '6:30 A.M.', val: '6:30 A.M.' },\n  { label: '7:00 A.M.', val: '7:00 A.M.' },\n  { label: '7:30 A.M.', val: '7:30 A.M.' },\n  { label: '8:00 A.M.', val: '8:00 A.M.' },\n  { label: '8:30 A.M.', val: '8:30 A.M.' },\n  { label: '9:00 A.M.', val: '9:00 A.M.' },\n  { label: '9:30 A.M.', val: '9:30 A.M.' },\n  { label: '10:00 A.M.', val: '10:00 A.M.' },\n  { label: '10:30 A.M.', val: '10:30 A.M.' },\n  { label: '11:00 A.M.', val: '11:00 A.M.' },\n  { label: '11:30 A.M.', val: '11:30 A.M.' },\n  { label: '12:00 P.M.', val: '12:00 P.M.' },\n  { label: '12:30 P.M.', val: '12:30 P.M.' },\n  { label: '1:00 P.M.', val: '1:00 P.M.' },\n  { label: '1:30 P.M.', val: '1:30 P.M.' },\n  { label: '2:00 P.M.', val: '2:00 P.M.' },\n  { label: '2:30 P.M.', val: '2:30 P.M.' },\n  { label: '3:00 P.M.', val: '3:00 P.M.' },\n  ],\n\n  20: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:00 A.M.', val: '8:00 A.M.' },\n  { label: '10:00 A.M.', val: '10:00 A.M.' },\n  { label: '12:00 P.M.', val: '12:00 P.M.' },\n  { label: '2:00 P.M.', val: '2:00 P.M.' },\n  { label: '4:00 P.M.', val: '4:00 P.M.' },\n  ],\n\n  21: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:00 A.M.', val: '8:00 A.M.' },\n  { label: '10:00 A.M.', val: '10:00 A.M.' },\n  { label: '12:00 P.M.', val: '12:00 P.M.' },\n  { label: '2:00 P.M.', val: '2:00 P.M.' },\n  { label: '4:00 P.M.', val: '4:00 P.M.' },\n  ],\n\n  22: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:00 A.M.', val: '8:00 A.M.' },\n  { label: '10:00 A.M.', val: '10:00 A.M.' },\n  { label: '12:00 P.M.', val: '12:00 P.M.' },\n  { label: '2:00 P.M.', val: '2:00 P.M.' },\n  { label: '4:00 P.M.', val: '4:00 P.M.' }, \n  ],\n\n  23: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:20 A.M.', val: '8:20 A.M.' },\n  { label: '10:20 A.M.', val: '10:20 A.M.' },\n  { label: '1:20 P.M.', val: '1:20 P.M.' },\n  { label: '3:30 P.M.', val: '3:30 P.M.' },  \n  ],\n\n  24: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:30 A.M.', val: '8:30 A.M.' },\n  { label: '10:30 A.M.', val: '10:30 A.M.' },\n  { label: '1:30 P.M.', val: '1:30 P.M.' },\n  { label: '3:30 P.M.', val: '3:30 P.M.' },\n  ],\n\n  25: [  \/\/ Bogot\u00e1 Norte (Sucursal 2)\n  { label: '8:00 A.M.', val: '8:00 A.M.' },\n  { label: '10:00 A.M.', val: '10:00 A.M.' },\n  { label: '1:00 P.M.', val: '1:00 P.M.' },\n  { label: '3:00 P.M.', val: '3:00 P.M.' },\n  ]\n \n}\n\/\/ --- DIRECCIONES POR SEDE ---\n\/\/ Reemplaza direcci\u00f3n y link_maps con los datos reales de cada sede\nconst BRANCH_ADDRESSES = [\n  { address: 'Terminal Salitre, Dg. 23 #69 - 11 Local 230-2 M\u00f3dulo 1, Amarillo, Bogot\u00e1',          maps: 'https:\/\/maps.app.goo.gl\/ZaprKVXcXDuPnZzp7' ,\n    phone: '573197602549'\n  },\n  { address: 'Cl. 14 Sur #22 - 48, Antonio Nari\u00f1o, Bogot\u00e1, Cundinamarca',       maps: 'https:\/\/maps.app.goo.gl\/T4NFXP932tw1D2Mb9' ,\n    phone: '573212569215'\n  },\n  { address: 'Centro Comercial Fiesta, Cl. 147 #101 - 56 Local 54, Suba, Bogot\u00e1, Cundinamarca',            maps: 'https:\/\/maps.app.goo.gl\/huT3xRNNmg2nc6jh6' ,\n    phone: '573227827611'\n  },\n  { address: 'Tv. 93 #64G - 07, Bogot\u00e1',        maps: 'https:\/\/maps.app.goo.gl\/NkszxoNfYKM1uJPg6' ,\n    phone: '573142567908'\n  },\n  { address: 'Detr\u00e1s del CC Gran Plaza, Cra. 7A #30D - 05, Soacha, Cundinamarca',              maps: 'https:\/\/maps.app.goo.gl\/1tq1b2VzwZu2gioS7' ,\n    phone: ''\n  },\n  { address: 'Centro Comercial Nova Plaza, Cl. 10 #8a - 12 Local 29, Facatativ\u00e1, Cundinamarca',           maps: 'https:\/\/maps.app.goo.gl\/VqEkMTEdc9JGfHJM9' ,\n    phone: ''\n  },\n  { address: 'Centro comercial Americano, Cra. 38 #74 - 61 Local 106, Suroccidente, Barranquilla, Atl\u00e1ntico',           maps: 'https:\/\/maps.app.goo.gl\/cZZ7HrYngbWtkmc26' ,\n    phone: ''\n  },\n  { address: 'Frente al tr\u00e1nsito, Cra. 46 #82 - 230, Nte. Centro Historico, Barranquilla, Atl\u00e1ntico',        maps: 'https:\/\/maps.app.goo.gl\/o6xfh39WN3M6bbyL9' ,\n    phone: ''\n  },\n  { address: 'Cl. 40 #45 - 21 LOCAL 1, Nte. Centro Historico, Barranquilla, Atl\u00e1ntico', maps: 'https:\/\/maps.app.goo.gl\/wZZMkUukv4nsbVsk8' ,\n    phone: ''\n  },\n  { address: 'Cl. 49 #8B Sur - 03, Metropolitana, Barranquilla, Atl\u00e1ntico',         maps: 'https:\/\/maps.app.goo.gl\/bTYMVZTyCJUjjxWt9' ,\n    phone: ''\n  },\n  { address: 'Frente al tr\u00e1nsito, Cra 3 #57 \u2013 35, Cali, Valle del Cauca',                maps: 'https:\/\/maps.app.goo.gl\/RdKAiqQrqu74UpZdA' ,\n    phone: ''\n  },\n  { address: 'Centro cultural y tur\u00edstico San L\u00e1zaro, Cra. 15 #31, Espinal, Cartagena de Indias, Bol\u00edvar',            maps: 'https:\/\/maps.app.goo.gl\/R4XpCC76M8AhTYaG9' ,\n    phone: ''\n  },\n  { address: 'Carrera 17, Av. California #26 - 112, Manga, Cartagena de Indias, Bol\u00edvar',                     maps: 'https:\/\/maps.app.goo.gl\/8iXPBx9JFHyBSZSA9' ,\n    phone: ''\n  },\n  { address: 'Centro Comercial Ronda Real, Local 144J, Santa Luc\u00eda, Cartagena de Indias, Bol\u00edvar',             maps: 'https:\/\/maps.app.goo.gl\/cNwNeSnxD2zBDupi8' ,\n    phone: ''\n  },\n  { address: 'Edificio Maisa, Cra. 2 #21DN - 100 Local 4 y 5, Popay\u00e1n, Cauca',             maps: 'https:\/\/maps.app.goo.gl\/uoNyKWPcqz9yKn9H8' ,\n    phone: ''\n  },\n  { address: 'Segundo Piso, Centro comercial Dorada Plaza, Carrera 4-5, Cl. 15 #16 Local S201-7, La Dorada, Caldas',             maps: 'https:\/\/maps.app.goo.gl\/mUAjpKwiXZxh9Rgs9' ,\n    phone: ''\n  },\n  { address: 'Barrio Sicomoro, Cra. 40 #04 - 09 Primer Piso, Melgar, Tolima',                maps: 'https:\/\/maps.app.goo.gl\/AD9RP7i92TvbFkcN7' ,\n    phone: ''\n  },\n  { address: 'Cra. 4 #13B - 17 Local 3, LA ESTRELLA, Sincelejo, Sucre',           maps: 'https:\/\/maps.app.goo.gl\/d6wun2Jcau8ycxtC6' ,\n    phone: ''\n  },\n  { address: 'Dentro del tr\u00e1nsito, Cra. 22 #22 - 10 Interior 1, Sampu\u00e9s, Sucre',              maps: 'https:\/\/maps.app.goo.gl\/Xyb9Bt7nycyKTSVEA' ,\n    phone: ''\n  },\n  { address: 'Barrio Para\u00edso, Cra. 19c #37c \u2013 16, Villavicencio, Meta',        maps: 'https:\/\/maps.app.goo.gl\/ndXJuZbtmtQX2xZi9' ,\n    phone: '573223373058'\n  },\n  { address: 'Terminal de Transporte de Honda, Cl. 23 #14 - 16 Local C, Honda, Tolima',               maps: 'https:\/\/maps.app.goo.gl\/JrELETA55qwSnZ6g6' ,\n    phone: ''\n  },\n  { address: 'Cl. 8 #3 - 64 Segundo Piso, Mariquita, Tolima',             maps: 'https:\/\/maps.app.goo.gl\/FeR2tfStr8Df2ory6' ,\n    phone: ''\n  },\n  { address: 'Cl. 35 #20 - 68 Local 204, Armenia, Quind\u00edo',              maps: 'https:\/\/maps.app.goo.gl\/DqGDJuH8xFPh7w867' ,\n    phone: ''\n  },\n  { address: 'Calle 18 #14-44, a media cuadra del transito, Pereira',              maps: 'https:\/\/maps.app.goo.gl\/VZBFJwX9xPkCtk3x5?g_st=ic' ,\n    phone: ''\n  },\n  { address: 'Tv. 21 #26D-16, piso dos, barrio Milan Dosquebradas',         maps: 'https:\/\/maps.app.goo.gl\/NyZR3VRMxGFd31ZN6?g_st=ic' ,\n    phone: ''\n  },\n  { address: 'Cra. 19 #22-40, Manizales',            maps: 'https:\/\/maps.app.goo.gl\/JAJq4omLSk37CAPP8?g_st=ic' ,\n    phone: ''\n  },\n];\n\n\/\/ --- SEDES SIN ATENCI\u00d3N LOS S\u00c1BADOS (\u00edndices 0-based) ---\n\/\/ Las \u00faltimas dos sedes (Dosquebradas=24, Manizales=25) no trabajan s\u00e1bados\nconst NO_SATURDAY_BRANCHES = [17, 18, 20, 21];\n\n\/\/ --- HORARIOS DE S\u00c1BADO POR SEDE ---\n\/\/ Para sedes que s\u00ed trabajan s\u00e1bados. Si una sede no est\u00e1 aqu\u00ed, usa su horario normal.\n\/\/ Formato igual que BRANCH_SCHEDULES.\nconst SATURDAY_SCHEDULES = {\n  0:  [ { label: '6:45 A.M.', val: '6:45 A.M.' }, { label: '8:45 A.M.', val: '8:45 A.M.' }, { label: '10:00 A.M.', val: '10:00 A.M.' }, { label: '10:45 A.M.', val: '10:45 A.M.' } ],\n  1:  [ { label: '7:30 A.M.', val: '7:30 A.M.' }, { label: '8:00 A.M.', val: '8:00 A.M.' }, { label: '9:30 A.M.', val: '9:30 A.M.' }, { label: '10:00 A.M.', val: '10:00 A.M.' } ],\n  2:  [ { label: '8:00 A.M.', val: '8:00 A.M.' }, { label: '9:00 A.M.', val: '9:00 A.M.' }, { label: '10:00 A.M.', val: '10:00 A.M.' } ],\n  3:  [ { label: '8:00 A.M.', val: '8:00 A.M.' }, { label: '9:00 A.M.', val: '9:00 A.M.' }, { label: '10:00 A.M.', val: '10:00 A.M.' } ],\n  4:  [ { label: '8:00 A.M.', val: '8:00 A.M.' }, { label: '9:00 A.M.', val: '9:00 A.M.' }, { label: '10:00 A.M.', val: '10:00 A.M.' } ],\n  5:  [ { label: '8:30 A.M.', val: '8:30 A.M.' }, { label: '9:20 A.M.', val: '9:20 A.M.' }, { label: '10:35 A.M.', val: '10:35 A.M.' } ],\n  6:  [ { label: '8:30 A.M.', val: '8:30 A.M.' }, { label: '10:30 A.M.', val: '10:30 A.M.' } ],\n  7:  [ { label: '8:30 A.M.', val: '8:30 A.M.' }, { label: '10:30 A.M.', val: '10:30 A.M.' } ],\n  8:  [ { label: '8:30 A.M.', val: '8:30 A.M.' }, { label: '10:30 A.M.', val: '10:30 A.M.' } ],\n  9:  [ { label: '8:00 A.M.', val: '8:00 A.M.' }, { label: '10:00 A.M.', val: '10:00 A.M.' } ],\n  10: [ { label: '8:00 A.M.', val: '8:00 A.M.' }, { label: '10:00 A.M.', val: '10:00 A.M.' } ],\n  11: [ { label: '9:00 A.M.', val: '9:00 A.M.' } ],\n  12: [ { label: '7:30 A.M.', val: '7:30 A.M.' }, { label: '8:00 A.M.', val: '8:00 A.M.' }, { label: '9:30 A.M.', val: '9:30 A.M.' }, { label: '10:00 A.M.', val: '10:00 A.M.' } ],\n  13: [ { label: '7:30 A.M.', val: '7:30 A.M.' }, { label: '9:30 A.M.', val: '9:30 A.M.' } ],\n  14: [ { label: '8:20 A.M.', val: '8:20 A.M.' }, { label: '9:20 A.M.', val: '9:20 A.M.' }, { label: '10:20 A.M.', val: '10:20 A.M.' } ],\n  15: [ { label: '8:00 A.M.', val: '8:00 A.M.' }, { label: '9:00 A.M.', val: '9:00 A.M.' }, { label: '10:00 A.M.', val: '10:00 A.M.' } ],\n  16: [ { label: '8:30 A.M.', val: '8:30 A.M.' }, { label: '10:30 A.M.', val: '10:30 A.M.' } ],\n  19: [ { label: '6:30 A.M.', val: '6:30 A.M.' }, { label: '7:00 A.M.', val: '7:00 A.M.' }, { label: '7:30 A.M.', val: '7:30 A.M.' }, { label: '8:00 A.M.', val: '8:00 A.M.' }, { label: '8:30 A.M.', val: '8:30 A.M.' }, { label: '9:00 A.M.', val: '9:00 A.M.' }, { label: '9:30 A.M.', val: '9:30 A.M.' }, { label: '10:00 A.M.', val: '10:00 A.M.' } ],\n  22: [ { label: '8:00 A.M.', val: '8:00 A.M.' }, { label: '10:00 A.M.', val: '10:00 A.M.' } ],\n  23: [ { label: '8:30 A.M.', val: '8:30 A.M.' }, { label: '10:30 A.M.', val: '10:30 A.M.' } ],\n  24: [ { label: '8:00 A.M.', val: '8:00 A.M.' }, { label: '10:00 A.M.', val: '10:00 A.M.' } ],\n  25: [ { label: '8:30 A.M.', val: '8:30 A.M.' }, { label: '10:30 A.M.', val: '10:30 A.M.' } ]\n};\n\n\/\/ ============================================================\n\/\/ L\u00d3GICA \u2014 no necesitas modificar nada debajo de esta l\u00ednea\n\/\/ ============================================================\n\nlet state = {\n  branch: null,\n  date: null,\n  time: null,\n  timeLabel: '',\n  doc: '',\n  phone: '',\n  code: '',\n  type: '',\n  placa: '',\n  \/\/ Se conserva en memoria local para evitar solapamientos en la misma sede y fecha.\n  bookedAppointments: [],\n  savedToGoogleSheets: false\n};\n\n\nlet curYear  = new Date().getFullYear();\nlet curMonth = new Date().getMonth();\n\nconst MONTHS    = ['Enero','Febrero','Marzo','Abril','Mayo','Junio',\n                   'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];\nconst DAY_NAMES = ['Dom','Lun','Mar','Mi\u00e9','Jue','Vie','S\u00e1b'];\n\n\/\/ --- Render sucursales ---\nfunction renderBranches() {\n  document.getElementById('branchesGrid').innerHTML = BRANCHES.map((b, i) => `\n    <div class=\"branch-card${state.branch === i ? ' selected' : ''}\"\n         onclick=\"selectBranch(${i})\">\n      <div class=\"branch-num\">${String(i + 1).padStart(2, '0')}<\/div>\n      <div class=\"branch-name\">${b}<\/div>\n    <\/div>`).join('');\n}\n\nfunction selectBranch(i) {\n  state.branch = i;\n  state.date   = null;\n  state.time   = null;\n  state.timeLabel = '';\n  renderBranches();\n  \/\/ Auto-advance to step 2 (fecha+hora combined)\n  setTimeout(() => goStep(2), 180);\n}\n\n\/\/ --- Render calendario ---\nfunction renderCalendar() {\n  document.getElementById('calMonth').textContent = MONTHS[curMonth] + ' ' + curYear;\n  const grid    = document.getElementById('calGrid');\n  grid.innerHTML = DAY_NAMES.map(d => `<div class=\"cal-day-name\">${d}<\/div>`).join('');\n  const firstDay  = new Date(curYear, curMonth, 1).getDay();\n  const totalDays = new Date(curYear, curMonth + 1, 0).getDate();\n  \/\/ Fecha de hoy en hora Colombia (UTC-5)\n  const _nowUTC = new Date();\n  const _nowCOL = new Date(_nowUTC.getTime() - 5 * 60 * 60 * 1000);\n  const today = new Date(_nowCOL.getUTCFullYear(), _nowCOL.getUTCMonth(), _nowCOL.getUTCDate());\n  const noSaturday = NO_SATURDAY_BRANCHES.includes(state.branch);\n\n  for (let i = 0; i < firstDay; i++) {\n    grid.innerHTML += `<div class=\"cal-day empty\"><\/div>`;\n  }\n\n  for (let d = 1; d <= totalDays; d++) {\n    const key     = curYear + '-' + String(curMonth + 1).padStart(2, '0') + '-' + String(d).padStart(2, '0');\n    const dt      = new Date(curYear, curMonth, d);\n    const isSat   = dt.getDay() === 6;\n    const isHoliday = COLOMBIA_HOLIDAYS.has(key);\n    const isAvail = AVAILABLE_DAYS.includes(key) && dt >= today && !(isSat && noSaturday) && !isHoliday;\n    const isSel   = state.date === key;\n    const isToday = dt.toDateString() === new Date().toDateString();\n\n    let cls = 'cal-day';\n    if (isSel)        cls += ' selected';\n    else if (isAvail) cls += ' available';\n    else              cls += ' disabled';\n    if (isToday)      cls += ' today';\n\n    const onclick = isAvail && !isSel ? `onclick=\"selectDay('${key}')\"` : '';\n    grid.innerHTML += `<div class=\"${cls}\" ${onclick}>${d}<\/div>`;\n  }\n}\n\nfunction changeMonth(dir) {\n  curMonth += dir;\n  if (curMonth < 0)  { curMonth = 11; curYear--; }\n  if (curMonth > 11) { curMonth = 0;  curYear++; }\n  renderCalendar();\n}\n\nfunction selectDay(key) {\n  state.date  = key;\n  state.time  = null;\n  state.timeLabel = '';\n  document.getElementById('btn2Next').disabled = true; \/\/ still need to pick time\n  renderCalendar();\n  \/\/ Show times immediately below calendar\n  document.getElementById('timesSection').style.display = 'block';\n  renderTimes();\n}\n\n\/\/ --- Render horarios por sede (semana vs s\u00e1bado) ---\nfunction renderTimes() {\n  const selectedDate = state.date ? new Date(state.date + 'T12:00:00') : null;\n  const isSaturday   = selectedDate && selectedDate.getDay() === 6;\n  const schedule     = isSaturday\n    ? (SATURDAY_SCHEDULES[state.branch] || BRANCH_SCHEDULES[state.branch])\n    : BRANCH_SCHEDULES[state.branch];\n\n  \/\/ Hora actual en Colombia (UTC-5, usando UTC para evitar desfase del servidor)\n  const nowUTC     = new Date();\n  const nowCOL     = new Date(nowUTC.getTime() - 5 * 60 * 60 * 1000);\n  const todayKey   = nowCOL.getUTCFullYear() + '-'\n    + String(nowCOL.getUTCMonth()+1).padStart(2,'0') + '-'\n    + String(nowCOL.getUTCDate()).padStart(2,'0');\n  const isToday    = state.date === todayKey;\n  const nowMinutes = nowCOL.getUTCHours() * 60 + nowCOL.getUTCMinutes();\n\n  \/\/ Citas previas guardadas (para restricci\u00f3n de solapamiento)\n  \/\/ Se comparan por sede y fecha para no bloquear horarios de otros d\u00edas o sedes.\n  const bookedAppointments = state.bookedAppointments || [];\n\n  document.getElementById('timesGrid').innerHTML = schedule.map(t => {\n    const slotMin = timeToMinutes(t.label);\n\n    \/\/ Restricci\u00f3n 1: mismo d\u00eda, menos de 60 min de anticipaci\u00f3n\n    const tooSoon = isToday && (slotMin - nowMinutes) < 60;\n\n    \/\/ Restricci\u00f3n 2: solapamiento con cita previa (cada cita dura 120 min)\n    const overlaps = bookedAppointments.some(booked => {\n      if (!booked || booked.branch !== state.branch || booked.date !== state.date) return false;\n      const bookedMin = timeToMinutes(booked.timeLabel);\n      return Math.abs(slotMin - bookedMin) < 120;\n    });\n\n    const blocked = tooSoon || overlaps;\n    const selected = state.time === t.val;\n\n    let reason = '';\n    if (tooSoon)   reason = 'Muy pronto';\n    if (overlaps)  reason = 'Cruza con otra cita';\n\n    if (blocked) {\n      return `\n        <div class=\"time-card time-card-blocked\" title=\"${reason}\">\n          <div class=\"time-main\">${t.label}<\/div>\n          <div class=\"time-dur\">${reason}<\/div>\n        <\/div>`;\n    }\n    return `\n      <div class=\"time-card${selected ? ' selected' : ''}\"\n           onclick=\"selectTime('${t.val}','${t.label}')\">\n        <div class=\"time-main\">${t.label}<\/div>\n        <div class=\"time-dur\">Duraci\u00f3n: 2 horas<\/div>\n      <\/div>`;\n  }).join('');\n}\n\nfunction selectTime(val, label) {\n  state.time      = val;\n  state.timeLabel = label;\n  document.getElementById('btn2Next').disabled = false; \/\/ now date+time both chosen\n  renderTimes();\n}\n\n\/\/ --- Validar formulario ---\nfunction checkForm() {\n  const ok = document.getElementById('fDoc').value.trim()   &&\n             document.getElementById('fPhone').value.trim() &&\n             document.getElementById('fCode').value.trim()  &&\n             document.getElementById('fPlaca').value.trim() &&\n             document.getElementById('fType').value;\n  document.getElementById('btn3Next').disabled = !ok;\n}\n\n\/\/ --- Navegaci\u00f3n entre pasos ---\nfunction goStep(n) {\n  [1, 2, 3, 4].forEach(i => {\n    document.getElementById('step' + i).style.display = i === n ? 'block' : 'none';\n  });\n  updateProgress(n);\n  if (n === 2) {\n    renderCalendar();\n    document.getElementById('timesSection').style.display = 'none';\n    updateAddressBar();\n  }\n  if (n === 3) updateAddressBar();\n  if (n === 4) { finalize(); updateAddressBar(); }\n  window.scrollTo({ top: 0, behavior: 'smooth' });\n}\n\nfunction updateProgress(n) {\n  for (let i = 1; i <= 4; i++) {\n    const num = document.getElementById('pn' + i);\n    const lbl = document.getElementById('pl' + i);\n    if (i < n)       { num.className = 'step-num done';   lbl.className = 'step-label'; }\n    else if (i === n){ num.className = 'step-num active'; lbl.className = 'step-label active'; }\n    else             { num.className = 'step-num';         lbl.className = 'step-label'; }\n    if (i < 4) {\n      document.getElementById('pc' + i).className = 'step-connector' + (i < n ? ' done' : '');\n    }\n  }\n}\n\n\/\/ --- Finalizar y confirmar ---\nfunction escapeHtml(value) {\n  return String(value ?? '').replace(\/[&<>'\"]\/g, ch => ({\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#039;'\n  }[ch]));\n}\n\nfunction finalize() {\n  state.doc   = document.getElementById('fDoc').value.trim();\n  state.phone = document.getElementById('fPhone').value.trim();\n  state.code  = document.getElementById('fCode').value.trim();\n  state.placa = document.getElementById('fPlaca').value.trim().toUpperCase();\n  state.type  = document.getElementById('fType').value;\n\n  const sedeInfo = BRANCH_ADDRESSES[state.branch] || { address: '', maps: '#', phone: '' };\n  const dateObj = new Date(state.date + 'T12:00:00');\n  const dateStr = dateObj.toLocaleDateString('es-CO', {\n    weekday: 'long', year: 'numeric', month: 'long', day: 'numeric'\n  });\n\n  \/\/ Resumen\n  const rows = [\n    ['Sucursal',   BRANCHES[state.branch]],\n    ['Fecha',      dateStr],\n    ['Horario',    state.timeLabel],\n    ['Documento',  state.doc],\n    ['Placa',      state.placa],\n    ['Contacto',   state.phone],\n    ['Comparendo', state.code],\n    ['Tipo',       state.type]\n  ];\n  document.getElementById('summaryContent').innerHTML = rows.map(([k, v]) =>\n    '<div class=\"summary-row\">' +\n      '<span class=\"sum-key\">' + escapeHtml(k) + '<\/span>' +\n      '<span class=\"sum-val\">' + escapeHtml(v) + '<\/span>' +\n    '<\/div>'\n  ).join('');\n\n\n  \/\/ Poblar info de sede\n  document.getElementById('sedeInfoName').textContent    = BRANCHES[state.branch];\n  document.getElementById('sedeInfoAddress').textContent = sedeInfo.address;\n  document.getElementById('sedeInfoMaps').href           = sedeInfo.maps;\n\n  \/\/ Guardar horario agendado para restricci\u00f3n de solapamiento\n  if (!state.bookedAppointments) state.bookedAppointments = [];\n  state.bookedAppointments.push({\n    branch: state.branch,\n    date: state.date,\n    timeLabel: state.timeLabel\n  });\n\n  \/\/ Guardar la cita autom\u00e1ticamente en Google Sheets \/ Drive\n  guardarCitaEnGoogleSheets(dateStr, sedeInfo);\n\n}\n\n\n\/\/ --- Guardar cita en Google Sheets \/ Drive ---\nfunction guardarCitaEnGoogleSheets(fechaTexto, sedeInfo) {\n  const url = GOOGLE_SHEETS_WEB_APP_URL;\n\n  if (!url || url.includes('PEGA_AQUI')) {\n    console.warn('Google Sheets no est\u00e1 configurado. Pega la URL del Apps Script en GOOGLE_SHEETS_WEB_APP_URL.');\n    return;\n  }\n\n  if (state.savedToGoogleSheets) return;\n  state.savedToGoogleSheets = true;\n\n  const payload = {\n    token: GOOGLE_SHEETS_TOKEN,\n    fecha_registro: new Date().toLocaleString('es-CO', { timeZone: 'America\/Bogota' }),\n    sucursal: BRANCHES[state.branch],\n    fecha_cita: state.date,\n    fecha: state.date,\n    date: state.date,\n    fecha_cita_texto: fechaTexto,\n    hora: state.timeLabel,\n    documento: state.doc,\n    contacto: state.phone,\n    placa: state.placa,\n    comparendo: state.code,\n    tipo: state.type,\n    direccion_sede: sedeInfo.address,\n    maps: sedeInfo.maps\n  };\n\n  const body = JSON.stringify(payload);\n\n  \/\/ sendBeacon suele funcionar muy bien para env\u00edos simples desde formularios web.\n  if (navigator.sendBeacon) {\n    const blob = new Blob([body], { type: 'text\/plain;charset=UTF-8' });\n    const sent = navigator.sendBeacon(url, blob);\n    if (sent) {\n      console.log('Cita enviada a Google Sheets.');\n      return;\n    }\n  }\n\n  \/\/ Fallback para navegadores donde sendBeacon no est\u00e9 disponible.\n  fetch(url, {\n    method: 'POST',\n    mode: 'no-cors',\n    headers: { 'Content-Type': 'text\/plain;charset=utf-8' },\n    body\n  })\n  .then(() => console.log('Cita enviada a Google Sheets.'))\n  .catch(err => {\n    state.savedToGoogleSheets = false;\n    console.error('No se pudo guardar la cita en Google Sheets:', err);\n  });\n}\n\n\/\/ --- Reset ---\nfunction resetForm() {\n  const prevBooked = state.bookedAppointments || [];\n  state = {\n    branch: null,\n    date: null,\n    time: null,\n    timeLabel: '',\n    doc: '',\n    phone: '',\n    code: '',\n    type: '',\n    placa: '',\n    bookedAppointments: prevBooked,\n    savedToGoogleSheets: false\n  };\n\n  ['fDoc', 'fPhone', 'fCode', 'fPlaca'].forEach(id => {\n    const el = document.getElementById(id);\n    if (el) el.value = '';\n  });\n\n  document.getElementById('fType').value = '';\n  ['btn2Next', 'btn3Next'].forEach(id => {\n    const el = document.getElementById(id);\n    if (el) el.disabled = true;\n  });\n\n  document.getElementById('timesSection').style.display = 'none';\n  document.getElementById('addressBar').style.display = 'none';\n\n  goStep(1);\n  renderBranches();\n}\n\n\/\/ --- Inicializaci\u00f3n ---\nrenderBranches();\n<\/script>\n\n<\/body>\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\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>COVIACOL \u2014 Sistema de Agendamiento 1 Sucursal 2 Fecha y Hora 3 Datos 4 Confirmaci\u00f3n Ver en mapa Selecciona tu sucursal Al elegir la sede pasar\u00e1s autom\u00e1ticamente al siguiente paso Elige la fecha y el horario Selecciona el d\u00eda y luego el horario disponible &#8249; &#8250; Los d\u00edas resaltados est\u00e1n disponibles para agendar Selecciona el [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1603","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.coviacol.com\/index.php\/wp-json\/wp\/v2\/pages\/1603","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.coviacol.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.coviacol.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.coviacol.com\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.coviacol.com\/index.php\/wp-json\/wp\/v2\/comments?post=1603"}],"version-history":[{"count":97,"href":"https:\/\/www.coviacol.com\/index.php\/wp-json\/wp\/v2\/pages\/1603\/revisions"}],"predecessor-version":[{"id":1947,"href":"https:\/\/www.coviacol.com\/index.php\/wp-json\/wp\/v2\/pages\/1603\/revisions\/1947"}],"wp:attachment":[{"href":"https:\/\/www.coviacol.com\/index.php\/wp-json\/wp\/v2\/media?parent=1603"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}