$(function () { // Pantalla 2 según etapa procesal. tipo: 'radio' | 'checkbox'. "Otra" salta la pantalla 2. const ETAPAS = { 'Conciliación': { titulo: 'Conciliación', pregunta: '7. Acuerdo conciliación *', tipo: 'radio', opciones: ['Audiencia de conciliación', 'Pretensión del CCL', 'Constancia de no conciliación', 'Convenio'] }, 'Escrita': { titulo: 'Escrita', pregunta: '7. Acuerdo etapa escrita *', tipo: 'radio', opciones: ['Contestación', 'Réplica', 'Contrarréplica'] }, 'Oral': { titulo: 'Oral', pregunta: '7. Acuerdo etapa oral *', tipo: 'radio', opciones: ['Acta mínima preliminar', 'Acta mínima incidental', 'Acta mínima juicio', 'Sentencia'] }, 'Ejecución': { titulo: 'Ejecución', pregunta: '7. Acuerdo etapa ejecución *', tipo: 'radio', opciones: ['Auto de requerimiento de pago y embargo', 'Diligencia de pago y embargo'] }, 'Amparo': { titulo: 'Amparo', pregunta: '7. Acuerdo etapa amparo *', tipo: 'radio', opciones: ['Escrito inicial de amparo', 'Recepción del amparo', 'Notificación del amparo', 'Radicación del amparo por el colegiado', 'Resolución de la suspensión', 'Resolución del amparo'] }, 'Otra': null }; const MAX_MB = 10; const EXT_OK = ['doc','docx','xls','xlsx','ppt','pptx','pdf','jpg','jpeg','png','gif','mp4','mov','avi','mp3','wav']; let actual = 1; const $frm = $('#frm'); const etapaSel = () => $('input[name=etapa]:checked').val(); const esOtra = () => etapaSel() === 'Otra'; function marcar($campo, msg) { $campo.toggleClass('invalido', !!msg).find('.error').first().text(msg || ''); return !msg; } // ---------- Validaciones por pantalla ---------- function validar(p) { let ok = true; if (p === 1) { const RE_NOMBRE = /^[A-Za-zÁÉÍÓÚÜÑáéíóúüñ .'-]+$/; const nombre = $.trim($('#nombre').val()); ok = marcar($('#nombre').closest('.campo'), !nombre ? 'Escribe el/los nombre(s).' : nombre.length < 2 ? 'Escribe al menos 2 caracteres.' : !RE_NOMBRE.test(nombre) ? 'Usa solo letras y espacios.' : '') && ok; const apPat = $.trim($('#apellido_paterno').val()); ok = marcar($('#apellido_paterno').closest('.campo'), !apPat ? 'Escribe el apellido paterno.' : apPat.length < 2 ? 'Escribe al menos 2 caracteres.' : !RE_NOMBRE.test(apPat) ? 'Usa solo letras y espacios.' : '') && ok; const apMat = $.trim($('#apellido_materno').val()); ok = marcar($('#apellido_materno').closest('.campo'), apMat && !RE_NOMBRE.test(apMat) ? 'Usa solo letras y espacios.' : '') && ok; ok = marcar($('[data-grupo=juicio]'), $('input[name=juicio]:checked').length ? '' : 'Selecciona el tipo de juicio.') && ok; const exp = $.trim($('#expediente').val()); ok = marcar($('#expediente').closest('.campo'), !exp ? 'Escribe el número de expediente.' : !/^[A-Za-z0-9\/\-. ]{3,30}$/.test(exp) ? 'Usa letras, números, "/" o "-" (3 a 30 caracteres).' : '') && ok; ['ciudad', 'estado'].forEach(id => { const v = $.trim($('#' + id).val()); ok = marcar($('#' + id).closest('.campo'), !v ? 'Este campo es obligatorio.' : !/^[A-Za-zÁÉÍÓÚÜÑáéíóúüñ .'-]{2,60}$/.test(v) ? 'Usa solo letras y espacios.' : '') && ok; }); ok = marcar($('[data-grupo=etapa]'), etapaSel() ? '' : 'Selecciona la etapa procesal.') && ok; } if (p === 2) { ok = marcar($('[data-grupo=acuerdo_etapa]'), $('#opcionesEtapa input:checked').length ? '' : 'Selecciona al menos una opción.') && ok; if (etapaSel() === 'Escrita') { const fecha = $('#fecha_audiencia_preliminar').val(); ok = marcar($('[data-grupo=fecha_audiencia]'), fecha ? '' : 'Indica la fecha de audiencia preliminar.') && ok; } } if (p === 3) { const files = archivosSeleccionados; let msg = ''; if (!files.length) msg = 'Carga al menos un archivo.'; else { const malo = files.find(f => f.size > MAX_MB * 1024 * 1024 || EXT_OK.indexOf(f.name.split('.').pop().toLowerCase()) < 0); if (malo) msg = 'Revisa "' + malo.name + '": tamaño o tipo no permitido.'; } ok = marcar($('[data-grupo=archivo]'), msg) && ok; const obs = $.trim($('#observaciones').val()); ok = marcar($('#observaciones').closest('.campo'), esOtra() && !obs ? 'Con etapa "Otra", indica qué documento subes.' : '') && ok; } if (!ok) $('.pantalla.activa .invalido').first()[0].scrollIntoView({ behavior: 'smooth', block: 'center' }); return ok; } // ---------- Navegación ---------- function construirPantalla2() { const cfg = ETAPAS[etapaSel()]; $('#tituloEtapa').text(cfg.titulo); $('#preguntaEtapa').text(cfg.pregunta); const html = cfg.opciones.map(o => '').join(''); $('#opcionesEtapa').html(html); const esEscrita = etapaSel() === 'Escrita'; $('#campoFechaAudiencia').prop('hidden', !esEscrita); if (!esEscrita) $('#fecha_audiencia_preliminar').val(''); } function ir(p) { actual = p; $('.pantalla').removeClass('activa').filter('[data-pantalla=' + p + ']').addClass('activa'); $('#pasos li').each(function () { const n = +$(this).data('p'); $(this).toggleClass('activo', n === p).toggleClass('hecho', n < p); }); $('#btnAtras').prop('hidden', p === 1); $('#btnSiguiente').prop('hidden', p === 3); $('#btnEnviar').prop('hidden', p !== 3); $('#lblObs').text(esOtra() ? '8. Observaciones *' : '8. Observaciones'); window.scrollTo({ top: 0, behavior: 'smooth' }); } $('#btnSiguiente').on('click', function () { if (!validar(actual)) return; if (actual === 1) { if (esOtra()) { $('#pasoEtapa').addClass('oculto'); return ir(3); } $('#pasoEtapa').removeClass('oculto'); construirPantalla2(); return ir(2); } ir(3); }); $('#btnAtras').on('click', function () { ir(actual === 3 && !esOtra() ? 2 : 1); }); // Si cambia la etapa, se reinicia el camino alterno $('input[name=etapa]').on('change', function () { $('#opcionesEtapa').empty(); $('#campoFechaAudiencia').prop('hidden', true); $('#fecha_audiencia_preliminar').val(''); $('#pasoEtapa').toggleClass('oculto', esOtra()); }); // Limpia errores al escribir $frm.on('input change', '.invalido input', function () { $(this).closest('.campo').removeClass('invalido'); }); // ---------- Archivos (múltiples, acumulables) ---------- let archivosSeleccionados = []; function pintarLista() { const $ul = $('#listaArchivos').empty(); archivosSeleccionados.forEach((f, i) => { const malo = f.size > MAX_MB * 1024 * 1024 || EXT_OK.indexOf(f.name.split('.').pop().toLowerCase()) < 0; $('