function middlewareEvent(elementsEvent) {

    $.each(elementsEvent, function (key) { // Para cada uno de los elementos hace un recorrido

        var elementEvent = elementsEvent.eq(key),
            eventos = (typeof elementEvent.data("event") == "undefined") ? undefined : elementEvent.data("event").split("&&&"); // El separador &&& indica que hay mas de un evento

        // Según el número de eventos que se encuenten en el DATA-EVENT se realiza un bucle
        $.each(eventos, function (indexEvent) { // Recorre cada uno de los eventos asociados a un elemento
            var tipeEvent = eventos[indexEvent]; // Indica el evento a manejar actualmente (click, dblclick, submit, change, etc.)
            // Elimina el mismo evento asociado previamente
            elementEvent.off(tipeEvent, asignarEvento);
            // Creación del evento
            elementEvent.on(tipeEvent, asignarEvento);
        }); // Cierre de bucle
    });
}


// Función de asignación de elementos
function asignarEvento(e) {
    e.preventDefault();
    eventosGenerales(e); // Asigna la función principal de Ajax
}


// Función general de procesamiento
function eventosGenerales(e) {

    var containerMax = $("#containerMax"),
        tipeEvent = e.type,
        elementEvent = $(e.delegateTarget);
    nx = elementEvent.data("event").split("&&&").indexOf(tipeEvent),
        routeEvent = (typeof elementEvent.data("route") == "undefined") ? "" : elementEvent.data("route").split("&&&")[nx],
        subRoutesEvent = (typeof routeEvent == "") ? [""] : routeEvent.split("|||"),
        tablesLiged = (typeof elementEvent.data("tables_liged") == "undefined") ? undefined : elementEvent.data("tables_liged").toString().split("&&&"),
        noms = (typeof elementEvent.data("nom") == "undefined") ? undefined : elementEvent.data("nom").toString().split("&&&"),
        estados = (typeof elementEvent.data("estado") == "undefined") ? undefined : elementEvent.data("estado").toString().split("&&&"),
        references = (typeof elementEvent.data("reference") == "undefined") ? undefined : elementEvent.data("reference").toString().split("&&&"),
        fields = (typeof elementEvent.data("field") == "undefined") ? undefined : elementEvent.data("field").toString().split("&&&"),
        actionsSave = (typeof elementEvent.data("action_save") == "undefined") ? undefined : elementEvent.data("action_save").toString().split("&&&"),
        tablesLiged = (typeof tablesLiged == "undefined") ? undefined : tablesLiged[nx].toString().split("|||"); // Indica distintas tablas a actualizar por evento en dado caso de ser requerido

    for (incrRoute = 0; incrRoute < subRoutesEvent.length; incrRoute++) { // Bucle para las sub-rutas

        var routeEventClear = subRoutesEvent[incrRoute].split("_").join(""),
            functionEvent = subRoutesEvent[incrRoute].split("_")[0],
            moduleEvent = subRoutesEvent[incrRoute].replace(functionEvent + "_", "");

        switch (functionEvent) {
            case "SeeSection":
                (function () {

                    // Si existe el item indicado en la barra de navegacion y no se quiere recargar un modal
                    if (containerMax.find("." + routeEventClear).length > 0 && elementEvent.data("temporal_off") != true) {

                        // Ocultar todos los items
                        containerMax.children("div").hide();
                        // Seleccionar el ítem indicado
                        containerMax.find("." + routeEventClear).show();

                    } else { // Si se desea recargar una seccion o dicha seccion NO existe
                        
                        containerMax.find("." + routeEventClear).remove();

                        var uniqnumber = uniqid();
                        notificacion("show", "info", "Cargando sección de " + nomLegibleSection(moduleEvent) + "...", "", uniqnumber);

                        // Hacer peticion para crear un div que contenga la información
                        $.get(
                            routeEventClear, {
                            _token: $('meta[name="csrf-token"]').attr('content'),
                            id_reference: elementEvent.data("reference")
                        }
                        ).done(function (response) {

                            // Ocultar todos los items
                            containerMax.children("div").hide();
                            // Crea un sectino con la información
                            containerMax.append(response);
                            // Seleccionar el elemento deseado
                            containerMax.find("." + routeEventClear).show();

                            containerMax.find("." + routeEventClear).find("select").not(".exceptionSelect2").select2();
                            // containerMax.find("." + routeEventClear + " .formCreate").find("select").not(".exceptionSelect2").select2();

                            middlewareEvent(containerMax.find("." + routeEventClear + " .btnEvent").add(containerMax.find("." + routeEventClear + " .formEvent")));

                            tablaDinamica(
                                $(".SeeSection" + moduleEvent + " .dinamicTable")
                            );

                            eliminarModal($("#sectionModalsD"));

                            inputDates(); // Aciva los inputs tipo fecha



                        }).fail(function (response) {

                            if (response.status == 403) {
                                notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                            } else {
                                notificacion("normal", "error", "Error al cargar la sección de " + nomLegibleSection(moduleEvent));
                            }

                        }).always(function (sasas) {

                            // console.log(sasas);
                            let elementsRefresh = elementEvent.data("elements_changed");
                            if (elementsRefresh) {
                                arrayElements = elementsRefresh.split("&&&");
                                for (xs = 0; xs < arrayElements.length; xs++) {
                                    $("#" + arrayElements[xs]).change();
                                }
                            }

                            notificacion("hide", "info", null, null, uniqnumber);
                        });
                    }

                }());
                break;

            case "SeeIndex": // Se paso a una funcion externa por ser llamada muchas veces
                (function () {
                    if (tipeEvent == "change") { // Si el evento fue un change
                        indexLoad(moduleEvent, tablesLiged, elementEvent.data("objjson"));
                    } else if (tipeEvent == "click") { // Si el evento fue un click
                        indexLoad(moduleEvent, tablesLiged);
                    } else {
                        alert("Evento no identificado...");
                    }
                }());
                break;

            case "FilterCapGraph": // Se paso a una funcion externa por ser llamada muchas veces
                (function () {
                    filterCapGraph(elementEvent);
                }());
                break;

            case "DinamicModal":
                (function () {

                    // Si la sección tiene un modal sin guardar;
                    if ($("#sectionModalsD").html() != "") {
                        $("#sectionModalsD").html("");
                    }

                    var uniqnumberModal = uniqid();
                    elementEvent.prop("disabled", true);
                    notificacion("show", "info", "Cargando información de ventana emergente ...", "", uniqnumberModal);

                    $.get(
                        "Get" + routeEventClear, {
                        _token: $('meta[name="csrf-token"]').attr('content'),
                        id_reference: elementEvent.data("reference")
                    }
                    ).done(function (htmlModal) {

                        // Abrir modal sin fondo
                        $("#sectionModalsD").html(htmlModal);
                        // Aplicar caja flexible para el modal
                        $("#sectionModalsD .modal").modal({
                            backdrop: 'static',
                            keyboard: false,
                            show: true
                        });

                        if (elementEvent.data("modal_estatico") != true) {
                            $("#sectionModalsD .modal-content").resizable();
                            $("#sectionModalsD .modal-content").draggable();
                        }

                        inputDates(
                            $("#sectionModalsD").find('.fecha_digitacion'),
                            "basico_hora"
                        );

                        middlewareEvent($("#sectionModalsD .btnEvent").add($("#sectionModalsD .formEvent")));

                        switch (routeEventClear) {
                            case "DinamicModalInformeFinal":
                                activeGoogleChart();
                                generarGraficoB1();
                                generarGraficoB2();
                                generarGraficoB3();
                                generarGraficoB4();
                                break;
                            case "DinamicModalInformeFinalEP15":
                                activeGoogleChart();
                                generarGraficosEP15();
                                break;
                        }

                    }).fail(function (response) {
                        if (response.status == 403) {
                            notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                        } else {
                            notificacion("normal", "error", "Error al generar reporte", "Por favor verifique el diligenciamiento de los valores estadísticos para el analito o en su defecto inicie sesión e inténtelo nuevamente...");
                        }
                    }).always(function (sazxz) {
                        // console.log(sazxz);
                        notificacion("hide", "info", null, null, uniqnumberModal);
                        elementEvent.prop("disabled", false);

                    });

                }());
                break;

            case "AddFila":
                (function () {
                    switch (moduleEvent) {
                        case "ResultadoCorrida":
                            addFilaTable(
                                $("#tbl_gestion_resultados tbody tr:last"),
                                "ResultadoCorrida"
                            );
                            break;

                        case "Result":
                            agregarFilaResult();
                            break;
                    }
                }());
                break;

            case "LoadExcel":
                (function () {
                    switch (moduleEvent) {
                        case "ResultadoCorrida":
                            loadExcelResultsCorrida(
                                $("#tbl_gestion_resultados tbody tr:last"),
                                "ResultadoCorrida"
                            );
                            break;
                        case "ResultadoEP15":
                            loadExcelResultsEP15();
                            break;
                    }
                }());
                break;

            case "CancelModal":
                (function () {
                    if (elementEvent.data("preguntaantes") == true) {
                        Swal.fire({
                            title: "¿Seguro de cerrar la ventana? Puede que los cambios no se guarden",
                            icon: 'warning',
                            showCancelButton: true,
                            confirmButtonColor: '#d33',
                            cancelButtonColor: 'rgba(78, 87, 93, 0.81)',
                            confirmButtonText: 'Si, cerrar ventana',
                            focusConfirm: false,
                            focusCancel: true
                        }).then((result) => {
                            if (result.value) {
                                eliminarModal($("#sectionModalsD"));
                            }
                        });
                    } else {
                        eliminarModal($("#sectionModalsD"));
                    }
                }());
                break;

            case "RemoveTempFileTable":

                Swal.fire({
                    title: '¿Está seguro de eliminar ' + noms[nx] + '?',
                    icon: 'warning',
                    showCancelButton: true,
                    confirmButtonColor: '#d33',
                    cancelButtonColor: 'rgba(78, 87, 93, 0.81)',
                    confirmButtonText: 'Si, eliminar!',
                    focusConfirm: false,
                    focusCancel: true
                }).then((result) => {
                    if (result.value) {
                        elementEvent.parents("tr").remove();
                    }
                });

                break;

            case "SeeIndexAsignation":
                (function () {
                    var tableLiged = elementEvent.data("table_liged");
                    indexLoadAsignation(moduleEvent, tableLiged);
                }());
                break;

            case "SeeGrafica":
                (function () {

                    var filtrosActivos = $(".filtrosGrafica:checked").length;

                    if (filtrosActivos == 0) { // Si no hay ni una gráfica activa
                        elementEvent.prop("checked", true); // Activar el elemento nuevamente
                        notificacion("normal", "info", "Debe haber por lo menos una gráfica activa");
                    }

                    var input_liged = $(elementEvent.data("input_liged"));

                    if (elementEvent.prop("checked") == true) { // Si el elemento esta activado, active el contenedor relacionado
                        input_liged.show();
                    } else {
                        input_liged.hide(); // Si no esta activado que lo oculte

                    }
                }());
                break;

            case "Store":
                (function () {

                    var form = elementEvent, // El mismo elemento del evento es el form
                        descCampNew,
                        formSzArray = form.serializeArray(),
                        dataHTTP = {};

                    gestionEnvioForm(form, "deshabilitar");

                    descCampNew = descCampGet(form, moduleEvent);

                    $(formSzArray).each(function (index, obj) {
                        dataHTTP[obj.name] = obj.value;
                    });

                    dataHTTP._token = $('meta[name="csrf-token"]').attr('content');

                    $.post(
                        routeEventClear,
                        dataHTTP
                    ).done(function (response) {

                        var elementForm = form.find("select").add(form.find("input"));
                        notificacion("normal", "success", "Registro exitoso", "Nuevo campo de " + nomLegibleSection(moduleEvent) + ": '" + descCampNew + "'");

                        if (typeof tablesLiged != "undefined") {
                            indexLoad(moduleEvent, tablesLiged, elementEvent.data("objjson"));
                        }

                        // Si la funcion lo require, cerrar el modal
                        if (elementEvent.data("close_modal") == true) {
                            eliminarModal($("#sectionModalsD"));
                        }

                        form.find(".contMessage").html(""); // Vaciar todos los mensajes de validación
                        form.find("select").add(form.find("input")).removeClass("is-invalid");

                        // Vaciar cada uno de los elementos del formulario correspondiente
                        elementForm.each(function (index, val) {

                            if (elementForm.eq(index).hasClass("notClear")) {
                                // No realizar la limpieza
                            } else {
                                if (elementForm.eq(index).get(0).tagName == "SELECT") {
                                    elementForm.eq(index).find("option").eq(0).prop("selected", true);
                                    elementForm.eq(index).change();
                                } else {
                                    elementForm.eq(index).val("");
                                }
                            }
                        });

                    }).fail(function (response) {

                        if (response.status == 422) { // Validaciones Backend
                            impresionError(form, response, "registrar");
                        } else if (response.status == 403) {
                            notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                        } else {
                            notificacion("normal", "error", "Registro fallido", "No se ha podido registrar '" + descCampNew + "' como " + nomLegibleSection(moduleEvent));
                        }

                    }).always(function (responseAjax) {
                        console.log(responseAjax);
                        gestionEnvioForm(form, "habilitar");
                    });
                }());
                break;

            case "UpdateModal": // Actualizacion desde modal
                (function () {

                    var form = elementEvent, // El mismo elemento del evento es el form
                        descCampNew,
                        formSzArray = form.serializeArray(),
                        dataHTTP = {};

                    gestionEnvioForm(form, "deshabilitar");

                    descCampNew = descCampGet(form, moduleEvent);

                    $(formSzArray).each(function (index, obj) {
                        dataHTTP[obj.name] = obj.value;
                    });

                    dataHTTP._token = $('meta[name="csrf-token"]').attr('content');
                    dataHTTP.id = elementEvent.data("reference");

                    $.ajax({
                        url: routeEventClear,
                        type: 'put',
                        data: dataHTTP
                    }).done(function (response) {

                        var elementForm = form.find("select").add(form.find("input"));
                        notificacion("normal", "success", "Actualización exitosa", "Se ha actualizado la información para " + noms[nx]);

                        if (typeof tablesLiged != "undefined") {
                            indexLoad(moduleEvent, tablesLiged, elementEvent.data("objjson"));
                        }

                        // Si la funcion lo require, cerrar el modal
                        if (elementEvent.data("close_modal") == true) {
                            eliminarModal($("#sectionModalsD"));
                        }

                        form.find(".contMessage").html(""); // Vaciar todos los mensajes de validación
                        form.find("select").add(form.find("input")).removeClass("is-invalid");

                        // Vaciar cada uno de los elementos del formulario correspondiente
                        elementForm.each(function (index, val) {

                            if (elementForm.eq(index).hasClass("notClear")) {
                                // No realizar la limpieza
                            } else {
                                if (elementForm.eq(index).get(0).tagName == "SELECT") {
                                    elementForm.eq(index).find("option").eq(0).prop("selected", true);
                                    elementForm.eq(index).change();
                                } else {
                                    elementForm.eq(index).val("");
                                }
                            }
                        });

                    }).fail(function (response) {

                        if (response.status == 422) { // Validaciones Backend
                            impresionError(form, response, "registrar");
                        } else if (response.status == 403) {
                            notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                        } else {
                            notificacion("normal", "error", "Registro fallido", "No se ha podido actualizar '" + descCampNew + "' como " + nomLegibleSection(moduleEvent));
                        }

                    }).always(function (responseAjax) {
                        console.log(responseAjax);
                        gestionEnvioForm(form, "habilitar");
                    });
                }());
                break;

            case "ChangeResult":
                (function () {
                    let trPadre = elementEvent.parents("tr");
                    trPadre.find(".fa-pen").remove(); // Eliminar el elemento de edicion si existe
                    trPadre.find("td").eq(0).append($('<i class="ml-2 text-primary fas fa-pen"></i>'));
                    trPadre.removeClass("tr_modificar"); // Eliminar clase si existe
                    trPadre.addClass("tr_modificar");
                }());
                break;

            case "StoreNivelEP15":
                (function () {
                    var form = elementEvent,
                        descCampNew,
                        obj_json_nvl = [],
                        cont_niveles = form.find(".consolidado_nivel");

                    reemplazarDecimalesNivelEP15(cont_niveles);

                    if (validarInfoNivelConfigEP15(cont_niveles)) { // Si la validación es satisfactoria
                        for (xdf = 0; xdf < cont_niveles.length; xdf++) {
                            let cont_nivel_act = cont_niveles.eq(xdf);
                            obj_json_nvl.push({
                                nivel: (xdf + 1),
                                analito_ep15: form.find(".reference").val(),
                                sigma_r: cont_nivel_act.find(".sigma_r").val(),
                                sigma_wl: cont_nivel_act.find(".sigma_wl").val(),
                                smp_porcentaje: cont_nivel_act.find(".smp_porcentaje").val(),
                                media_inserto: cont_nivel_act.find(".media_inserto").val(),
                                de_inserto: cont_nivel_act.find(".de_inserto").val(),
                                u_incertidumbre: cont_nivel_act.find(".u_incertidumbre").val(),
                                k: cont_nivel_act.find(".k").val(),
                                smp_unidad: cont_nivel_act.find(".smp_unidad").val(),
                                valor_diana: cont_nivel_act.find(".valor_diana").val(),
                                media_gpar: cont_nivel_act.find(".media_gpar").val(),
                                de_gpar: cont_nivel_act.find(".de_gpar").val(),
                                n_lab_gpar: cont_nivel_act.find(".n_lab_gpar").val(),
                                // cvr: cont_nivel_act.find(".cvr").val(),
                                // cvi: cont_nivel_act.find(".cvi").val(),
                                // limite_s: cont_nivel_act.find(".limite_s").val(),
                                // limite_i: cont_nivel_act.find(".limite_i").val()
                            });
                        }


                        let dataHTTP = {
                            obj_json_nvl: obj_json_nvl
                        }
                        gestionEnvioForm(form, "deshabilitar");
                        dataHTTP._token = $('meta[name="csrf-token"]').attr('content');

                        console.log(dataHTTP);

                        $.post(
                            routeEventClear,
                            dataHTTP
                        ).done(function (response) {
                            notificacion("normal", "success", "Configuración exitosa", "Se han guardado las configuraciones de manera satisfactoria");
                            eliminarModal($("#sectionModalsD"));
                        }).fail(function (response) {

                            if (response.status == 403) {
                                notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                            } else {
                                notificacion("normal", "error", "Registro fallido", "No se han podido almacenar los resultados, por favor intente nuevamente...");
                            }

                        }).always(function (responseAjax) {
                            console.log(responseAjax);
                            gestionEnvioForm(form, "habilitar");
                        });
                    }

                }());
                break;

            case "StoreResultsEP15":
                (function () {
                    var form = elementEvent, // El mismo elemento del evento es el form
                        descCampNew,
                        dataHTTP = {
                            registro: [],
                            modificacion: []
                        },
                        trs = form.find("table tbody tr"),
                        continueValidate = true;

                    reemplazarDecimalesEP15(trs);

                    $.each(trs, function (index, val) {

                        let trActual = trs.eq(index);
                        let fecha = trActual.find(".fecha"),
                            concentracion_1 = trActual.find(".concentracion_1"),
                            concentracion_2 = trActual.find(".concentracion_2"),
                            concentracion_3 = trActual.find(".concentracion_3"),
                            concentracion_4 = trActual.find(".concentracion_4");
                        concentracion_5 = trActual.find(".concentracion_5");

                        if (typeof trActual.data("reference") == "undefined") { // Registro
                            if (validarResultadoComparacionEP15(concentracion_1, concentracion_2, concentracion_3, concentracion_4, concentracion_5)) { // Si la validacion es exitosa
                                dataHTTP.registro.push({
                                    nivel_id_nivel: trActual.data("num_nivel"),
                                    analito_ep15: trActual.parents("table").data("reference_canalito_ep15"),
                                    num_corrida: trActual.data("num_corrida"),
                                    fecha: fecha.val(),
                                    concentracion_1: concentracion_1.val(),
                                    concentracion_2: concentracion_2.val(),
                                    concentracion_3: concentracion_3.val(),
                                    concentracion_4: concentracion_4.val(),
                                    concentracion_5: concentracion_5.val()
                                });
                            } else {
                                return continueValidate = false;
                            }
                        } else { // Modificacion
                            if (validarResultadoComparacionEP15(concentracion_1, concentracion_2, concentracion_3, concentracion_4, concentracion_5)) { // Si la validacion es exitosa
                                dataHTTP.modificacion.push({
                                    reference_id: trActual.data("reference"),
                                    nivel_id_nivel: trActual.data("num_nivel"),
                                    analito_ep15: trActual.parents("table").data("reference_canalito_ep15"),
                                    num_corrida: trActual.data("num_corrida"),
                                    fecha: fecha.val(),
                                    concentracion_1: concentracion_1.val(),
                                    concentracion_2: concentracion_2.val(),
                                    concentracion_3: concentracion_3.val(),
                                    concentracion_4: concentracion_4.val(),
                                    concentracion_5: concentracion_5.val()
                                });
                            } else {
                                return continueValidate = false;
                            }
                        }
                    });

                    if (continueValidate) {
                        const datosAtipidos = grubbs($(".tbl_gestion_resultados_ep15 tbody"))
                        if (datosAtipidos === false) { // No hay valores atípicos
                            continuarEjecucionStore();
                        } else {
                            values = []
                            const { camposAtipicos, n, limite_inf, limite_sup, de, f_grubbs, media } = datosAtipidos
                            const camposAtipicosPlanos = camposAtipicos.flat(1);
                            $(".input-validado-alerta").removeClass("input-validado-alerta");
                            camposAtipicosPlanos.forEach(campo => {
                                values.push(campo.val())
                                // al ser un dato atipico el valor del campo se envia vacio
                                campo.val("")
                            })

                            dataHTTP = {
                                registro: [],
                                modificacion: []
                            }

                            $.each(trs, function (index, val) {

                                let trActual = trs.eq(index);
                                let fecha = trActual.find(".fecha"),
                                    concentracion_1 = trActual.find(".concentracion_1"),
                                    concentracion_2 = trActual.find(".concentracion_2"),
                                    concentracion_3 = trActual.find(".concentracion_3"),
                                    concentracion_4 = trActual.find(".concentracion_4");
                                concentracion_5 = trActual.find(".concentracion_5");

                                if (typeof trActual.data("reference") == "undefined") { // Registro
                                    if (validarResultadoComparacionEP15(concentracion_1, concentracion_2, concentracion_3, concentracion_4, concentracion_5)) { // Si la validacion es exitosa
                                        dataHTTP.registro.push({
                                            nivel_id_nivel: trActual.data("num_nivel"),
                                            analito_ep15: trActual.parents("table").data("reference_canalito_ep15"),
                                            num_corrida: trActual.data("num_corrida"),
                                            fecha: fecha.val(),
                                            concentracion_1: concentracion_1.val(),
                                            concentracion_2: concentracion_2.val(),
                                            concentracion_3: concentracion_3.val(),
                                            concentracion_4: concentracion_4.val(),
                                            concentracion_5: concentracion_5.val()
                                        });
                                    } else {
                                        return continueValidate = false;
                                    }
                                } else { // Modificacion
                                    if (validarResultadoComparacionEP15(concentracion_1, concentracion_2, concentracion_3, concentracion_4, concentracion_5)) { // Si la validacion es exitosa
                                        dataHTTP.modificacion.push({
                                            reference_id: trActual.data("reference"),
                                            nivel_id_nivel: trActual.data("num_nivel"),
                                            analito_ep15: trActual.parents("table").data("reference_canalito_ep15"),
                                            num_corrida: trActual.data("num_corrida"),
                                            fecha: fecha.val(),
                                            concentracion_1: concentracion_1.val(),
                                            concentracion_2: concentracion_2.val(),
                                            concentracion_3: concentracion_3.val(),
                                            concentracion_4: concentracion_4.val(),
                                            concentracion_5: concentracion_5.val()
                                        });
                                    } else {
                                        return continueValidate = false;
                                    }
                                }
                            })





                            console.log("campos atipidows aplanados", camposAtipicosPlanos);
                            for (da = 0; da < camposAtipicosPlanos.length; da++) {
                                camposAtipicosPlanos[da].addClass("input-validado-alerta");
                            }
                            let nCamposAtipicos = 0;
                            const filasEstadisticasArray = camposAtipicos.map((campAr, index) => {
                                if (campAr.length !== 0) {
                                    if (campAr.length > 0) {
                                        nCamposAtipicos += campAr.length;
                                    }
                                    return `
                                        <tr>
                                        <th>Nivel ${index + 1}</td>
                                        <td>${media[index].toFixed(2)}</td>
                                        <td>${f_grubbs[index]}</td>
                                        <td>${n[index]}</td>
                                        <td>${de[index].toFixed(2)}</td>
                                        <td>${limite_inf[index].toFixed(2)}</td>
                                        <td>${limite_sup[index].toFixed(2)}</td>
                                        </tr>`
                                }
                            })
                            const filasEstadisticasString = filasEstadisticasArray.join("")
                            let text = "¿Está seguro de guardar todos los datos? V2M recomienda vaciar los campos resaltados.";
                            let showConfirmButton = true;
                            if (nCamposAtipicos > 2) {
                                text = "No se pueden registrar más de 2 datos atipicos por nivel, por favor vacíe los campos resaltados.";
                                showConfirmButton = false;
                            }
                            Swal.fire({
                                title: "Alerta de datos atípicos por Grubbs",
                                text,
                                icon: 'warning',
                                showCancelButton: true,
                                showConfirmButton,
                                confirmButtonColor: '#d33',
                                cancelButtonColor: 'rgba(78, 87, 93, 0.81)',
                                confirmButtonText: 'Omitir y guardar',
                                focusConfirm: false,
                                focusCancel: true,
                                footer: `
                                    <table class='table table-sm table-borderless m-0 text-center'>
                                        <thead>
                                            <tr>
                                                <th colspan="8" style="text-align: center;">
                                                    Datos atípicos por Grubbs
                                                    <br>
                                                    <span style="color: red;">
                                                        ${values.join(", ")}
                                                    </span>
                                                </th>
                                            </tr>
                                            <tr class='font-weight-bold table-secondary'>
                                                <th colspan="8" style="text-align: center;">
                                                    <span style="color: cornflowerblue;">Limite de Grubbs</span> <span style="color: cornflowerblue;">=</span> <span style="color: orange;">Media</span> <span style="color: cornflowerblue;">±</span> <span style="color: plum;">Grubbs</span> <span style="color: cornflowerblue;">*</span> <span style="color: green">Desviación estándar</span>
                                                </th>
                                            </tr>
                                            <tr>
                                                <th style="width: 12%;">
                                                </th>
                                                <th style="vertical-align: middle;">
                                                    Media
                                                </th>
                                                <th>
                                                    Factor Grubbs
                                                </th>
                                                <th>
                                                    Número de Datos
                                                </th>
                                                <th>
                                                    Desviación Estandar
                                                </th>
                                                <th>
                                                    Límite Inferior
                                                </th>
                                                <th>
                                                    Límite Superior
                                                </th>
                                            </tr>
                                        </thead>
                                        <tbody>
                                        ${filasEstadisticasString}
                                        </tbody>
                                    </table>`,
                                width: 700

                            }).then((eleccion) => {
                                if (eleccion.value) { // Si el usuario desea continuar
                                    continuarEjecucionStore($(this));
                                }
                            });
                        }

                        function continuarEjecucionStore() {
                            gestionEnvioForm(form, "deshabilitar");
                            dataHTTP._token = $('meta[name="csrf-token"]').attr('content');
                            dataHTTP.validacion_back = true;

                            $.post(
                                routeEventClear,
                                dataHTTP
                            ).done(function (response) {
                                notificacion("normal", "success", "Registro exitoso", "Se han ingresado los resultados satisfactoriamente");
                                eliminarModal($("#sectionModalsD"));
                            }).fail(function (response) {

                                if (response.status == 403) {
                                    notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                                } else {
                                    notificacion("normal", "error", "Registro fallido", "No se han podido almacenar los resultados, por favor intente nuevamente...");
                                }

                            }).always(function (responseAjax) {
                                console.log(responseAjax);
                                gestionEnvioForm(form, "habilitar");
                            });
                        }
                    }
                }());
                break;
            case "StoreResults":
                (function () {

                    var form = elementEvent, // El mismo elemento del evento es el form
                        descCampNew,
                        dataHTTP = {
                            registro: [],
                            modificacion: []
                        },
                        trs = form.find("table tbody tr"),
                        continueValidate = true;

                    reemplazarDecimales(trs);

                    $.each(trs, function (index, val) {

                        let trActual = trs.eq(index);

                        if (trActual.hasClass("tr_registrar") || trActual.hasClass("tr_modificar")) {

                            let fecha = trActual.find(".fecha"),
                                codigo_paciente = trActual.find(".codigo_paciente"),
                                resultado_m1c1 = trActual.find(".resultado_m1c1"),
                                resultado_m1c2 = trActual.find(".resultado_m1c2"),
                                resultado_m2c1 = trActual.find(".resultado_m2c1"),
                                resultado_m2c2 = trActual.find(".resultado_m2c2");

                            if (trActual.hasClass("tr_registrar")) {
                                if (validarResultadoComparacion(resultado_m1c1, resultado_m1c2, resultado_m2c1, resultado_m2c2)) { // Si la validacion es exitosa
                                    dataHTTP.registro.push({
                                        id: null,
                                        id_corrida_analito: trActual.parents("table").data("reference_corrida"),
                                        fecha: fecha.val(),
                                        codigo_paciente: codigo_paciente.val(),
                                        resultado_m1c1: resultado_m1c1.val(),
                                        resultado_m1c2: resultado_m1c2.val(),
                                        resultado_m2c1: resultado_m2c1.val(),
                                        resultado_m2c2: resultado_m2c2.val()
                                    });
                                } else {
                                    return continueValidate = false;
                                }
                            } else if (trActual.hasClass("tr_modificar")) {
                                if (validarResultadoComparacion(resultado_m1c1, resultado_m1c2, resultado_m2c1, resultado_m2c2)) { // Si la validacion es exitosa
                                    dataHTTP.modificacion.push({
                                        id: trActual.data("reference"),
                                        id_corrida_analito: trActual.parents("table").data("reference_corrida"),
                                        fecha: fecha.val(),
                                        codigo_paciente: codigo_paciente.val(),
                                        resultado_m1c1: resultado_m1c1.val(),
                                        resultado_m1c2: resultado_m1c2.val(),
                                        resultado_m2c1: resultado_m2c1.val(),
                                        resultado_m2c2: resultado_m2c2.val()
                                    });
                                } else {
                                    return continueValidate = false;
                                }
                            }
                        }
                    });


                    if (continueValidate) {
                        gestionEnvioForm(form, "deshabilitar");
                        dataHTTP._token = $('meta[name="csrf-token"]').attr('content');
                        $.post(
                            routeEventClear,
                            dataHTTP
                        ).done(function (response) {

                            notificacion("normal", "success", "Registro exitoso", "Se han ingresado los resultados satisfactoriamente");
                            eliminarModal($("#sectionModalsD"));

                        }).fail(function (response) {

                            if (response.status == 403) {
                                notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                            } else {
                                notificacion("normal", "error", "Registro fallido", "No se han podido almacenar los resultados, por favor intente nuevamente...");
                            }

                        }).always(function (responseAjax) {
                            console.log(responseAjax);
                            gestionEnvioForm(form, "habilitar");
                        });
                    }

                }());
                break;

            case "ExportReport":
                exportacionReporte(elementEvent, elementEvent.data("reference"));
                break;

            case "ExportReportEP15":
                exportacionReporteEP15(elementEvent, elementEvent.data("reference"));
                break;

            case "StoreAsignation":
                (function () {

                    var form = elementEvent, // El mismo elemento del evento es el form
                        descCampNew,
                        formElements = form.find("select[name]").add(form.find("input[name]")),
                        dataHTTP = {};

                    $(formElements).each(function (index, obj) {
                        dataHTTP[obj.name] = formElements.eq(index).val()
                    });


                    gestionEnvioForm(form, "deshabilitar");

                    dataHTTP._token = $('meta[name="csrf-token"]').attr('content');

                    descCampNew = descCampGet(form, moduleEvent);

                    $.post(
                        routeEventClear,
                        dataHTTP
                    ).done(function (response) {

                        notificacion("normal", "success", "Asignación exitosa", "Se han asignado un@ o más " + nomLegibleSection(moduleEvent));
                        var tableLiged = elementEvent.data("table_liged");
                        indexLoadAsignation(moduleEvent, tableLiged);

                        form.find(".contMessage").html(""); // Vaciar todos los mensajes de validación
                        form.find(".clearVal").val([]).change();

                        form.find("select").add(form.find("input")).removeClass("is-invalid");

                    }).fail(function (response) {

                        if (response.status == 422) { // Validaciones Backend
                            impresionError(form, response, "registrar");
                        } else if (response.status == 403) {
                            notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                        } else {
                            notificacion("normal", "error", "Registro fallido", "No se ha podido registrar '" + descCampNew + "' como " + nomLegibleSection(moduleEvent));
                        }

                    }).always(function (responseAjax) {
                        console.log(responseAjax);
                        gestionEnvioForm(form, "habilitar");
                    });
                }());

                break;

            case "ChangeStatus":
                (function () {
                    Swal.fire({
                        title: 'Confirmación de cambio de estado',
                        text: '¿Está seguro de cambiar el estado de ' + noms[nx] + ' a ' + estados[nx] + '?',
                        icon: 'warning',
                        showCancelButton: true,
                        confirmButtonColor: '#d33',
                        cancelButtonColor: 'rgba(78, 87, 93, 0.81)',
                        confirmButtonText: 'Si, actualizar!',
                        focusConfirm: false,
                        focusCancel: true
                    }).then((result) => {
                        if (result.value) {
                            (function () {
                                $.ajax({
                                    url: routeEventClear,
                                    type: 'put',
                                    data: {
                                        id: references[nx],
                                        _token: $('meta[name="csrf-token"]').attr('content')
                                    }
                                }).done(function () {
                                    notificacion("normal", "warning", "Actualización de estado exitosa", "Se ha actualizado a " + estados[nx] + " para " + noms[nx]);

                                    indexLoad(moduleEvent, tablesLiged, elementEvent.data("objjson"));
                                }).fail(function (response) {

                                    if (response.status == 403) {
                                        notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                                    } else {
                                        notificacion("normal", "error", "Actualización de estado fallida", "No se ha podido actualizar a " + estados[nx] + " para " + noms[nx]);
                                    }
                                }).always(function (sdsgdg) {
                                    console.log(sdsgdg);
                                });
                            }());
                        }
                    })
                }());
                break;

            case "Destroy":
                (function () {

                    Swal.fire({
                        title: '¿Está seguro de eliminar ' + noms[nx] + '?',
                        text: "TODA la información que se encuentre relacionada también se borrará!",
                        icon: 'warning',
                        showCancelButton: true,
                        confirmButtonColor: '#d33',
                        cancelButtonColor: 'rgba(78, 87, 93, 0.81)',
                        confirmButtonText: 'Si, eliminar!',
                        focusConfirm: false,
                        focusCancel: true
                    }).then((result) => {
                        if (result.value) {
                            (function () {
                                $.ajax({
                                    url: routeEventClear,
                                    type: 'delete',
                                    data: {
                                        id: references[nx],
                                        _token: $('meta[name="csrf-token"]').attr('content')
                                    }
                                }).done(function () {

                                    notificacion("normal", "warning", "Eliminación exitosa", "Se eliminó toda la información relacionada de " + noms[nx] + ", el cual estaba como " + nomLegibleSection(moduleEvent));
                                    indexLoad(moduleEvent, tablesLiged, elementEvent.data("objjson"), elementEvent.parents("tr"));

                                }).fail(function (response) {
                                    if (response.status == 403) {
                                        notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                                    } else {
                                        notificacion("normal", "error", "Eliminación fallida", "Para el campo de " + nomLegibleSection(moduleEvent) + ": " + noms[nx]);
                                    }
                                }).always(function (ewfwefsf) {
                                    console.log(ewfwefsf);
                                });
                            }());
                        }
                    });
                }());
                break;


            case "ChangeStatusClient":
                (function () {
                    Swal.fire({
                        title: '¿Está seguro de actualizar a' + noms[nx] + '?',
                        text: "TODA la información que se encuentre relacionada también se borrará!",
                        icon: 'warning',
                        showCancelButton: true,
                        confirmButtonColor: '#d33',
                        cancelButtonColor: 'rgba(78, 87, 93, 0.81)',
                        confirmButtonText: 'Si, actualizar!',
                        focusConfirm: false,
                        focusCancel: true
                    }).then((result) => {
                        if (result.value) {
                            (function () {
                                $.ajax({
                                    url: routeEventClear,
                                    type: 'post',
                                    data: {
                                        id: references[nx],
                                        _token: $('meta[name="csrf-token"]').attr('content')
                                    }
                                }).done(function () {

                                    notificacion("normal", "success", "Actualización exitosa", "Se actualizó el estado de " + noms[nx]);
                                    indexLoad(moduleEvent, tablesLiged, elementEvent.data("objjson"), elementEvent.parents("tr"));

                                }).fail(function (response) {
                                    if (response.status == 403) {
                                        notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                                    } else {
                                        notificacion("normal", "error", "Actualización fallida", "Para el campo de "+ nomLegibleSection(moduleEvent) + ": estado");
                                    }
                                }).always(function (ewfwefsf) {
                                    console.log(ewfwefsf);
                                });
                            }());
                        }
                    });
                }());
                break;

            case "DestroyAsignation":
                (function () {

                    Swal.fire({
                        title: '¿Está seguro de eliminar ' + noms[nx] + '?',
                        text: "TODA la información que se encuentre relacionada también se borrará!",
                        icon: 'warning',
                        showCancelButton: true,
                        confirmButtonColor: '#d33',
                        cancelButtonColor: 'rgba(78, 87, 93, 0.81)',
                        confirmButtonText: 'Si, eliminar!',
                        focusConfirm: false,
                        focusCancel: true
                    }).then((result) => {
                        if (result.value) {
                            (function () {

                                $.ajax({
                                    url: routeEventClear,
                                    type: 'delete',
                                    data: {
                                        id: references[nx],
                                        _token: $('meta[name="csrf-token"]').attr('content')
                                    }
                                }).done(function () {

                                    notificacion("normal", "warning", "Eliminación exitosa", "Se eliminó toda la información relacionada de " + noms[nx] + ", el cual estaba como " + nomLegibleSection(moduleEvent));

                                    var tableLiged = elementEvent.data("table_liged");
                                    indexLoadAsignation(moduleEvent, tableLiged);

                                }).fail(function (response) {
                                    if (response.status == 403) {
                                        notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                                    } else {
                                        notificacion("normal", "error", "Eliminación fallida", "Para el campo de " + nomLegibleSection(moduleEvent) + ": " + noms[nx]);
                                    }
                                }).always(function (ewfwefsf) {
                                    console.log(ewfwefsf);
                                });
                            }());
                        }
                    });
                }());
                break;

            case "SeeEdit":
                (function () {
                    var loader = $(
                        '<div class="spinner-border spinner-border-sm text-secondary" role="status">' +
                        '<span class="sr-only">Loading...</span>' +
                        '</div>'
                    );

                    var originalField = elementEvent.html();
                    var originalFieldText = elementEvent.text();

                    elementEvent.html(loader);

                    $.ajax({
                        url: routeEventClear,
                        type: 'get',
                        data: {
                            id: references[nx],
                            campo: fields[nx],
                            _token: $('meta[name="csrf-token"]').attr('content')
                        }
                    }).done(function (response) {

                        // Se agrega clase de edición
                        elementEvent.addClass("editingForm");

                        // Se imprime el input editable
                        elementEvent.html(response);

                        elementEvent.find("select").not(".exceptionSelect2").select2(); // Activar busqueda para selects

                        // Enfocar el primer elemento de entrada del formulario
                        elementEvent.find("input").add(elementEvent.find("select")).eq(0).focus();

                        // Elementos a actualizar
                        var elementsUpdate = $(".SeeSection" + moduleEvent + " .btnEvent").add($(".SeeSection" + moduleEvent + " .formEvent"));
                        elementsUpdate = elementsUpdate.not(".editingForm");

                        // Se actualiza la seleccion de eventos
                        middlewareEvent(elementsUpdate);

                        inputDates(); // Verifica cada uno de los inputs que se encuentren dentro del section

                        // Se asigna el valor predeterminado para luego poder ser utilizado
                        elementEvent.data("original_field", originalField);
                        elementEvent.data("original_field_text", originalFieldText);

                        // Se elimina el evento para ver mientras se esta editando
                        elementEvent.off(tipeEvent);

                    }).fail(function (response) {

                        if (response.status == 403) {
                            notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                        } else {
                            notificacion("normal", "error", "Modo de edición fallido", "No pudo activar el modo para " + originalFieldText + " como " + nomLegibleSection(moduleEvent));
                        }

                        // Se reestablece contenido del item
                        elementEvent.html(originalField);

                    }).always(function (saddf) {
                        console.log(saddf);
                    });

                }());
                break;

            case "Update":
                (function () {

                    if ((tipeEvent == "keyup" && e.which == 27) || actionsSave[nx] == "false") {

                        show("html", elementEvent.parents("td"), tipeEvent); // Listar el valor guardado previamente en el DOM HTML

                    } else if ((tipeEvent == "submit" || tipeEvent == "click") && actionsSave[nx] == "true") {

                        var td_cambio = elementEvent.parents("td"),
                            form = elementEvent.add(elementEvent.parents("form")).eq(0),
                            elementTdFather = elementEvent.parents("td"),
                            formSzArray = form.serializeArray(),
                            dataHTTP = {},
                            elementForm = form.find("select").add(form.find("input")).eq(0),
                            tipeSelectionEntry = elementForm.get(0).tagName,
                            campUpgrade = (tipeSelectionEntry == "SELECT") ? elementForm.find("option[value='" + formSzArray[0]["value"] + "']").text() : formSzArray[0]["value"];

                        $(formSzArray).each(function (index, obj) {
                            dataHTTP[obj.name] = obj.value;
                        });

                        dataHTTP._token = $('meta[name="csrf-token"]').attr('content'),
                            dataHTTP.id = references[nx],
                            dataHTTP.campo = fields[nx];

                        $.ajax({
                            url: routeEventClear,
                            type: 'put',
                            data: dataHTTP
                        }).done(function () {

                            elementTdFather.html(elementTdFather.data("original_field"));

                            notificacion("normal", "success", "Actualización exitosa", "Se actualizó el campo " + dataHTTP.campo);

                            // Eliminar la clase de formulario en edición
                            elementEvent.removeClass("editingForm");
                            show("ajax", elementTdFather, tipeEvent); // Listar el valor guardado previamente en el DOM HTML

                        }).fail(function (response) {
                            if (response.status == 422) { // Validaciones Backend
                                impresionError(form, response, "modificar");
                            } else if (response.status == 403) {
                                notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                            } else {
                                notificacion("normal", "error", "Actualización fallida", "No se pudo actualizar el campo " + dataHTTP.campo + " de " + elementTdFather.data("original_field_text") + " a " + dataHTTP.valor_cambio + ", como " + nomLegibleSection(moduleEvent));
                                show("ajax", elementTdFather, tipeEvent); // Listar el valor guardado previamente en el DOM HTML
                            }

                        }).always(function (wefesws) {
                            console.log(wefesws);
                        });
                    }
                }());
                break;

            case "SeeList":
                (function () {
                    var id_filtro;

                    if (elementEvent.data("ligamiento_select_padre") == undefined) { // Si no es necesario que sus resultados estén filtrados
                        id_filtro = undefined;
                    } else if (elementEvent.parents("form").find("." + elementEvent.data("select_padre")).eq(0).val() == "") { // Si es necesario filtrar mediante un selector padre, pero este tiene una opnción sin valor
                        id_filtro = "0";
                    } else { // Si desde el DOM se especifica que los resultados son filtrados
                        id_filtro = elementEvent.parents("form").find("." + elementEvent.data("select_padre")).eq(0).val()
                    }

                    let selectsLiged = elementEvent.data("select_liged").split("&&&"); // Obtiene un array con los elementos dependientes del padre
                    let selectLigedSub = selectsLiged[incrRoute];

                    var uniqnumber = uniqid();
                    notificacion("show", "info", "Cargando contenido de la lista de " + nomLegibleSection(moduleEvent) + "...", "", uniqnumber);

                    $.get(
                        routeEventClear, {
                        id: id_filtro,
                        _token: $('meta[name="csrf-token"]').attr('content')
                    },
                        function () { }
                    ).done(function (httpRP) {

                        elementEvent.parents("form").find("." + selectLigedSub).html(httpRP);
                        if (elementEvent.data("force_change") == true) {
                            elementEvent.parents("form").find("." + selectLigedSub).change();
                        }

                    }).fail(function (response) {
                        if (response.status == 403) {
                            notificacion("normal", "error", "No cuenta con los permisos necesarios...");
                        } else {
                            notificacion("normal", "error", "Error al referescar el contenido de la lista de " + nomLegibleSection(moduleEvent));
                        }

                    }).always(function (cscsdfergq) {
                        // console.log(cscsdfergq);
                        notificacion("hide", "info", null, null, uniqnumber);
                    });

                }());
                break;

            default:
                break;
        }
    }
}
