{"title":"Google 🌐","description":"\u003c!-- Buscador combinado: Google + Verificación SKU Genesis1 --\u003e\n\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n\u003cdiv id=\"busqueda-completa\" style=\"max-width: 900px; margin: 0 auto; padding: 20;\n            border-radius: 12px; box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n            background-color: #ffffff; border: 1px solid #eee;\n            font-family: 'Segoe UI', sans-serif;\"\u003e\n\n  \u003c!-- Título --\u003e\n  \u003ch2 style=\"text-align: center; font-size: 16px; color: #333; margin: 0;\"\u003e\n    🔍 Busca en la web | y selecciona el codigo\n  \u003c\/h2\u003e\n\n  \u003c!-- Buscador de Google Custom Search --\u003e\n  \u003cdiv class=\"gcse-search\" style=\"margin: 0; line-height: 0;\"\u003e\n\n\u003c!-- Script de Google Custom Search --\u003e\n\u003cscript async src=\"https:\/\/cse.google.com\/cse.js?cx=a7a0ac5fbd20542ae\"\u003e\u003c\/script\u003e\n\n\u003c!-- Script para agregar “número de parte” antes de buscar --\u003e\n\u003cscript\u003e\nwindow.addEventListener('load', () =\u003e {\n  let input = null;\n\n  const intentarCapturarInput = () =\u003e {\n    input = document.querySelector('input.gsc-input');\n    if (!input) return false;\n\n    input.addEventListener('keydown', (e) =\u003e {\n      if (e.key === 'Enter') {\n        e.preventDefault();                      \/\/ Evita el envío inmediato\n        let val = input.value.trim();\n        if (!\/número de parte\/i.test(val)) {\n          input.value = val + ' número de parte'; \/\/ Añade texto clave\n        }\n        setTimeout(() =\u003e {\n          const btn = document.querySelector('input.gsc-search-button');\n          if (btn) btn.click();\n        }, 50);\n      }\n    });\n    return true;\n  };\n\n  let intentos = 0;\n  const intervalo = setInterval(() =\u003e {\n    if (intentarCapturarInput() || intentos++ \u003e= 20) clearInterval(intervalo);\n  }, 1000);\n});\n\u003c\/script\u003e\n\n\u003c!-- Detectar texto seleccionado como SKU y buscar en la barra principal --\u003e\n\u003cscript\u003e\ndocument.addEventListener('mouseup', () =\u003e {\n  const txt = window.getSelection().toString().trim();\n  const m = txt.match(\/\\b[A-Z0-9.-]{4,15}\\b\/i);\n  if (m) {\n    const sku = m[0].toUpperCase().replace(\/-\/g, '');\n    window.location.href = `\/search?q=${encodeURIComponent(sku)}`;\n  }\n});\n\u003c\/script\u003e\n\n  \u003c\/div\u003e\n  \u003cbr\u003e\n    \u003ch2 style=\"text-align: center; font-size: 14px; color: #bdbdbd; margin: 0;\"\u003e\n    Ejemplo. filtro de aire ram 700 2015 interfil Enter\n  \u003c\/h2\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  \/\/ === 1. Función para pintar en rojo SKUs y \"número de parte\" ===\n \/\/ function resaltarSKUyNumeroDeParte() {\n\/\/   const resaltados = document.querySelectorAll('.gsc-control-cse b');\n\n\/\/   resaltados.forEach(el =\u003e {\n\/\/     const txt = el.textContent.trim();\n\/\/     const esNumeroDeParte = \/^n(ú|u)mero\\s+de\\s+parte(s)?$\/i.test(txt);\n\/\/     const esSKU = \/^[A-Z0-9.-]{4,15}$\/i.test(txt);\n\n\/\/     if (esNumeroDeParte || esSKU) {\n\/\/       el.style.color = 'red';\n\/\/       el.style.fontWeight = 'bold';\n\/\/     }\n\/\/   });\n\/\/ }\n\n\n  \/\/ === 2. Observador para detectar resultados de búsqueda ===\n  const observer = new MutationObserver(() =\u003e {\n    const contenedorResultados = document.querySelector('.gsc-resultsbox-visible');\n    if (contenedorResultados) {\n      contenedorResultados.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      resaltarSKUyNumeroDeParte(); \/\/ Aquí aplicamos el resaltado\n    }\n  });\n\n  const target = document.querySelector('#busqueda-completa');\n  if (target) {\n    observer.observe(target, {\n      childList: true,\n      subtree: true\n    });\n  }\n\u003c\/script\u003e\n\n\u003cscript\u003e\n  \/\/ Observamos cambios en el DOM para detectar cuando aparece el input\n  const observerPlaceholder = new MutationObserver((mutations, obs) =\u003e {\n    const input = document.querySelector('input.gsc-input');\n    if (input) {\n      input.placeholder = ''; \/\/ Ponemos el placeholder\n      input.style.textAlign = 'right'; \/\/ Alineamos texto a la derecha\n\n      \/\/ También estilo para placeholder CSS (varios navegadores)\n      const style = document.createElement('style');\n      style.textContent = `\n        input.gsc-input::placeholder {\n          text-align: right !important;\n          direction: rtl !important;\n          color: #555;\n          font-style: italic;\n        }\n      `;\n      document.head.appendChild(style);\n\n      obs.disconnect(); \/\/ Dejamos de observar para no sobrecargar\n    }\n  });\n\n  observerPlaceholder.observe(document.body, {\n    childList: true,\n    subtree: true\n  });\n\u003c\/script\u003e\n\n\u003cscript\u003e\n  function buscarSeleccion() {\n    const txt = window.getSelection().toString().trim();\n    const m = txt.match(\/\\b[A-Z0-9.-]{4,15}\\b\/i);\n    if (m) {\n      const sku = m[0].toUpperCase().replace(\/-\/g, '');\n      window.location.href = `\/search?q=${encodeURIComponent(sku)}`;\n    }\n  }\n\n  document.addEventListener('mouseup', buscarSeleccion);\n  document.addEventListener('touchend', buscarSeleccion);\n\u003c\/script\u003e\n\n\u003c!-- ===== Overlay + Modal para los códigos detectados ===== --\u003e\n\u003cstyle\u003e\n  #overlay-codigos {\n    position: fixed;\n    top: 40px;\n    right: 20px;\n    background: #fff;\n    border: 2px solid #1a73e8;\n    border-radius: 10px;\n    width: 200px;\n    max-height: 80vh;\n    overflow: auto;\n    box-shadow: 0 6px 20px rgba(0, 0, 0, .25);\n    padding: 12px;\n    font-family: 'Segoe UI', sans-serif;\n    font-size: 13px;\n    z-index: 9999;\n    display: none;\n  }\n\n  #overlay-codigos .cerrar {\n    position: absolute;\n    top: 25px;\n    right: 10px;\n    font-weight: bold;\n    cursor: pointer;\n    color: red;\n    font-size: 20px;\n  }\n  \n  #overlay-codigos .cerrar:hover {\n    color: #000;\n  }\n\n  #codigos-flotante h4 {\n    margin: 0 0 6px 0;\n    font-size: 14px;\n    text-align: center;\n  }\n\n  #codigos-flotante ul {\n    margin: 0;\n    padding: 0;\n    list-style: none;\n  }\n\n  #codigos-flotante li {\n    padding: 4px 6px;\n    margin: 2px 0;\n    cursor: pointer;\n    border-radius: 6px;\n    transition: background .2s;\n    text-align: center;\n  }\n\n  #codigos-flotante li:hover {\n    background: #f1f8ff;\n  }\n\n  #codigos-flotante li img {\n    max-width: 100%;\n    margin-top: 6px;\n    border-radius: 4px;\n  }\n\n  #overlay-codigos {\n  display: none !important;\n}\n\u003c\/style\u003e\n\n\u003cdiv id=\"overlay-codigos\"\u003e\n  \u003cspan class=\"cerrar\" onclick=\"document.getElementById('overlay-codigos').style.display='none'\"\u003e×\u003c\/span\u003e\n  \u003cdiv id=\"codigos-flotante\"\u003e\n    \u003ch4 style=\"font-size: 12px;\"\u003eDoble click para buscar\u003c\/h4\u003e\n    \u003cul\u003e\u003c\/ul\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  \/\/ ========== Lista de palabras a ignorar ==========\n  const palabrasIgnoradas = [\n    'filtro','encuentra','aceite','refaccion','parte','pieza','producto','buscar','precio',\n    'marca','categoría','cantidad','descripción','cotizar','stock','existencia','valor','comprar',\n    'oferta','disponible','nuevo','usado','original','repuesto','detalle','detalles','agregar',\n    'modelo','código','referencia','consultar','imagen','motor','cliente','catálogo',\n    'ram','chevrolet','volkswagen','ford','nissan','honda','kia','mazda','jeep','dodge','gm',\n    'mercadolibre','ml','grupofuentes','autozone','refaccionaria','motores','ebay','amazon','genesis1',\n    'com','mx','net','org','html','php','htm','https','http','www'\n  ];\n\n  \/\/ ========== Valida si es un código válido ==========\n  function esCodigoValido(c) {\n    if (!c || c.length \u003c 4 || c.length \u003e 15) return false;\n    if (c.includes('.')) return false;\n    if (\/^\\d{4}$\/.test(c)) return false;\n    if (\/^[a-zA-Z]{4,}$\/.test(c)) return false;\n    if (palabrasIgnoradas.includes(c.toLowerCase())) return false;\n    return \/^[A-Z0-9.-]{4,15}$\/i.test(c);\n  }\n\n  \/\/ ========== Mostrar overlay y devolver \u003cul\u003e ==========\n  function asegurarFlotante() {\n    const overlay = document.getElementById('overlay-codigos');\n    overlay.style.display = 'block';\n    return overlay.querySelector('ul');\n  }\n\n  \/\/ ========== Extrae y pinta los códigos detectados con sus imágenes ==========\n  function extraerCodigos() {\n    const lista = asegurarFlotante();\n    const codigos = new Map();\n\n    \/\/ Selecciona todos los resultados de Google\n    const resultados = document.querySelectorAll('.gsc-control-cse .gs-webResult');\n\n    resultados.forEach(res =\u003e {\n      const texto = res.textContent;\n      const codigosEnResultado = new Set();\n\n      \/\/ Buscar después de “número de parte”\n      const rgNumParte = \/n(ú|u)mero\\s+de\\s+parte\\s*[:\\-\\s]*([A-Z0-9.-]{4,15})\/ig;\n      let m;\n      while ((m = rgNumParte.exec(texto)) !== null) {\n        const code = m[2].toUpperCase().replace(\/-\/g, '');\n        if (esCodigoValido(code)) codigosEnResultado.add(code);\n      }\n\n      \/\/ Buscar códigos sueltos\n      const palabras = texto.match(\/\\b[A-Z0-9.-]{4,15}\\b\/ig) || [];\n      palabras.forEach(p =\u003e {\n        const code = p.toUpperCase().replace(\/-\/g, '');\n        if (esCodigoValido(code)) codigosEnResultado.add(code);\n      });\n\n      \/\/ Obtener la imagen del resultado (si tiene)\n      const imgElem = res.querySelector('img');\n      let urlImg = imgElem ? imgElem.src : null;\n\n      \/\/ Asociar cada código con esa imagen\n      codigosEnResultado.forEach(code =\u003e {\n        if (!codigos.has(code)) {\n          codigos.set(code, urlImg);\n        }\n      });\n    });\n\n    \/\/ Ordenar códigos por longitud y alfabéticamente\n    const arr = [...codigos.entries()]\n      .sort((a, b) =\u003e a[0].length - b[0].length || a[0].localeCompare(b[0]));\n\n    lista.innerHTML = '';\n\n    if (arr.length === 0) {\n      lista.innerHTML = '\u003cli style=\"color:#999;\"\u003e(ninguno)\u003c\/li\u003e';\n      return;\n    }\n\n    arr.forEach(([code, urlImg]) =\u003e {\n      const li = document.createElement('li');\n      li.style.textAlign = 'center';\n      li.textContent = code;\n\n      if (urlImg) {\n        const img = document.createElement('img');\n        img.src = urlImg;\n        img.alt = `Imagen de ${code}`;\n        img.onerror = () =\u003e { img.style.display = 'none'; };\n        li.appendChild(document.createElement('br'));\n        li.appendChild(img);\n      }\n\n      li.onclick = () =\u003e navigator.clipboard.writeText(code).then(() =\u003e {\n        li.style.background = '#dff0d8';\n      });\n\n      li.ondblclick = () =\u003e {\n        window.location.href = '\/search?q=' + encodeURIComponent(code);\n      };\n\n      lista.appendChild(li);\n    });\n  }\n\n  \/\/ ========== Espera resultados de búsqueda para ejecutarse ==========\n  const obs = new MutationObserver(() =\u003e {\n    if (document.querySelector('.gsc-resultsbox-visible')) {\n      extraerCodigos();\n    }\n  });\n\n  window.addEventListener('load', () =\u003e {\n    const target = document.querySelector('.gsc-control-cse');\n    if (target) obs.observe(target, { childList: true, subtree: true });\n  });\n\u003c\/script\u003e\n\n\u003cstyle\u003e\n\/* ===== Ajustes responsivos para pantallas pequeñas (vertical y horizontal) ===== *\/\n@media (max-width: 600px) {\n  #overlay-codigos {\n    left: auto !important;        \/* desactiva left *\/\n    right: 10px !important;       \/* pegado a la derecha *\/\n    width: 48vw !important;\n    top: 322px !important;\n    max-height: 55vh !important;\n    padding: 8px !important;\n    border-width: 1px !important;\n    border-radius: 10px !important;\n    box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2) !important;\n    font-size: 12px !important;\n  }\n\n  #overlay-codigos .cerrar {\n    font-size: 18px !important;\n    top: 4px !important;\n    right: 6px !important;\n  }\n\n  #codigos-flotante h4 {\n    font-size: 13px !important;\n    margin-bottom: 6px !important;\n  }\n\n  #codigos-flotante li {\n    padding: 6px !important;\n    margin: 3px 0 !important;\n    font-size: 12px !important;\n    border-bottom: 1px solid #ddd !important;\n    padding-bottom: 6px !important;\n    margin-bottom: 6px !important;\n  }\n\n  #codigos-flotante li:last-child {\n    border-bottom: none !important;\n    margin-bottom: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  #codigos-flotante li img {\n    max-width: 70% !important;\n    height: auto !important;\n    margin-top: 4px !important;\n    border-radius: 4px !important;\n  }\n}\n\n@media (max-width: 480px), (max-height: 380px) {\n  #overlay-codigos {\n    left: auto !important;\n    right: 8px !important;\n    width: 48vw !important;\n    top: 322px !important;\n    max-height: 55vh !important;\n    padding: 6px !important;\n    font-size: 11px !important;\n  }\n\n  #overlay-codigos .cerrar {\n    font-size: 16px !important;\n  }\n\n  #codigos-flotante h4 {\n    font-size: 12px !important;\n  }\n\n  #codigos-flotante li {\n    font-size: 11px !important;\n    padding: 5px !important;\n    border-bottom: 1px solid #ddd !important;\n    padding-bottom: 6px !important;\n    margin-bottom: 6px !important;\n  }\n\n  #codigos-flotante li:last-child {\n    border-bottom: none !important;\n    margin-bottom: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  #codigos-flotante li img {\n    max-width: 100% !important;\n    margin-top: 4px !important;\n  }\n}\n\n\/* Forzar que todo quede sin espacios *\/\n.gsc-control-cse,\n.gsc-control-cse * {\n  margin: 0 !important;\n  padding: 0 !important;\n}\n\n\/* Input del buscador con altura forzada *\/\ninput.gsc-input {\n  height: 48px !important;\n  line-height: 48px !important;\n  padding: 12px !important;\n  font-size: 14px !important;\n  color: #000 !important;\n  border-radius: 8px !important;\n  border: 1px solid #ccc !important;\n  width: 100% !important;\n  text-align: right !important;\n  box-sizing: border-box !important;\n}\n\n.gsc-input-box {\n  height: 48px !important;\n}\n\ninput.gsc-input::placeholder{\n  text-align:right !important;\n  direction:rtl !important;\n  color:#aaa !important;\n  font-style: italic !important;\n}\n\n\/* Oculta placeholder al enfocar *\/\n\/* escribe de izq a derecha: *\/\ninput.gsc-input:focus::placeholder{\n  color: transparent !important;\n}\n\ninput.gsc-input:focus{\n  text-align: left !important;\n  direction: ltr !important;\n}\n\n  \n\/* Botón del buscador *\/\ninput.gsc-search-button{\n  background:#1a73e8 !important;\n  color:#fff !important;\n  border:none !important;\n  padding:10px 20px !important;\n  border-radius:8px !important;\n  font-weight:bold !important;\n  cursor:pointer !important;\n  margin:0 !important;\n}\ninput.gsc-search-button:hover {\n  background:#125ab3 !important;\n}\n\n @media (max-width: 600px) {\n  input.gsc-input {\n  background-color: #fff !important;  \/* Fondo blanco *\/\n  color: #000 !important;             \/* Texto negro *\/\n}\n\n\n  input.gsc-input::placeholder {\n    color: #000 !important;             \/* Texto negro *\/\n    background-color: transparent !important;\n    font-style: italic !important;\n  }\n}\n\n  \n\u003c\/style\u003e\n\n  \u003cscript\u003e\n  \/\/ Detecta clic fuera del modal para cerrarlo\n  document.addEventListener('click', function(event) {\n    const overlay = document.getElementById('overlay-codigos');\n    if (!overlay) return;\n\n    \/\/ Si el modal está visible y el clic NO es dentro del modal\n    if (overlay.style.display === 'block' \u0026\u0026 !overlay.contains(event.target)) {\n      overlay.style.display = 'none';\n    }\n  });\n\u003c\/script\u003e\n\n  \u003cscript\u003e\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n\n  const url = window.location.href;\n\n  const botonCotizador = document.querySelector(\".boton-cotizador-container\");\n  const searchContainer = document.getElementById(\"search-container\");\n  const dropdownContainer = document.getElementById(\"dropdown-container\");\n  const floatingSearch = document.querySelector(\".floating-search-container\");\n\n  \/\/ 🔹 Detecta el DIV verde que envuelve el select\n  const dropdownWrapper = document.querySelector('#dropdown-container')?.closest('div[style*=\"background-color\"]');\n\n  if (url.includes(\"\/pages\/mayoreo\")) {\n\n    \/\/ 🔴 OCULTAR en esa página específica\n    if (botonCotizador) botonCotizador.style.display = \"none\";\n    if (searchContainer) searchContainer.style.display = \"none\";\n    if (dropdownContainer) dropdownContainer.style.display = \"none\";\n    if (dropdownWrapper) dropdownWrapper.style.display = \"none\";\n    if (floatingSearch) floatingSearch.style.display = \"none\";\n\n  } else {\n\n    \/\/ 🟢 MOSTRAR en otras páginas\n    if (botonCotizador) botonCotizador.style.display = \"block\";\n    if (searchContainer) searchContainer.style.display = \"block\";\n    if (dropdownContainer) dropdownContainer.style.display = \"block\";\n    if (dropdownWrapper) dropdownWrapper.style.display = \"block\";\n    if (floatingSearch) floatingSearch.style.display = \"block\";\n\n  }\n\n});\n\u003c\/script\u003e\n\n\u003cstyle\u003e\n\/* Contenedor relativo *\/\n.search-wrapper {\n  position: relative;\n  display: inline-block;\n  width: 160%;\n  max-width: 828px;\n}\n\n\/* Input *\/\n.search-wrapper input.gsc-input {\n  width: 100% !important;\n  padding-right: 35px !important; \/* espacio para la X *\/\n  box-sizing: border-box;\n}\n\n\/* NUESTRA X personalizada *\/\n.custom-clear-btn {\n  position: absolute;\n  right: 10px;\n  top: 50%;\n  transform: translateY(-50%);\n  font-size: 30px;\n  color: #red;\n  cursor: pointer;\n  user-select: none;\n}\n\n.custom-clear-btn:hover {\n  color: #000;\n}\n\n\/* 📱 SOLO CELULAR *\/\n@media (max-width: 600px) {\n\n  .search-wrapper {\n    position: relative;\n    display: block;        \/* que ocupe toda la línea *\/\n    width: 120% !important;\n    max-width: 120% !important;\n    margin: 0 auto;\n  }\n\n}\n\n\u003c\/style\u003e\n\n\u003cscript\u003e\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n\n  \/\/ Espera a que Google cargue el input\n  const interval = setInterval(function() {\n\n    const input = document.querySelector(\"input.gsc-input\");\n\n    if (input \u0026\u0026 !document.querySelector(\".custom-clear-btn\")) {\n\n      \/\/ Crear contenedor\n      const wrapper = document.createElement(\"div\");\n      wrapper.className = \"search-wrapper\";\n      input.parentNode.insertBefore(wrapper, input);\n      wrapper.appendChild(input);\n\n      \/\/ Crear botón X\n      const clearBtn = document.createElement(\"span\");\n      clearBtn.className = \"custom-clear-btn\";\n      clearBtn.innerHTML = \"×\";\n      wrapper.appendChild(clearBtn);\n\n      \/\/ Acción limpiar\n      clearBtn.addEventListener(\"click\", function(){\n        input.value = \"\";\n        input.focus();\n      });\n\n      clearInterval(interval);\n    }\n\n  }, 300);\n\n});\n\u003c\/script\u003e\n\n  \u003cstyle\u003e\n\/* Oculta la X original de Google *\/\n.gsst_a {\n  display: none !important;\n}\n\u003c\/style\u003e\n","products":[],"url":"https:\/\/genesis1.mx\/collections\/buscar-en-google.oembed","provider":"Genesis","version":"1.0","type":"link"}