https://sms.sermescro.com/login

Submitted URL:
https://sms.sermescro.com/Redirected
Report Finished:

The outgoing links identified from the page

JavaScript Variables · 83 found

Global JavaScript variables loaded on the window object of a page, are variables declared outside of functions and accessible from anywhere in the code within the current scope

NameType
onbeforetoggleobject
documentPictureInPictureobject
onscrollendobject
$function
jQueryfunction
__core-js_shared__object
coreobject
setImmediatefunction
clearImmediatefunction
regeneratorRuntimeobject

Console log messages · 1 found

Messages logged to the web console

TypeCategoryLog
verbosedom
URL
https://sms.sermescro.com/login
Text
[DOM] Input elements should have autocomplete attributes (suggested: "new-password"): (More info: https://goo.gl/9p2vKq) %o

HTML

The raw HTML body of the page

<!DOCTYPE html><html style="height: 100%" class="fontawesome-i2svg-active fontawesome-i2svg-complete"><head>
    <meta charset="UTF-8">
    <title>Sermes Management System</title>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
                <script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js" integrity="sha256-lSjKY0/srUM9BE3dPm+c4fBo1dky2v27Gdjm2uoZaL0=" crossorigin="anonymous"></script>

        <!-- Librerías para exportar en Excel y PDF a través de los componentes de DevExtreme (ej.: DataGrid) -->

        <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.4.0/polyfill.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/exceljs/4.0.1/exceljs.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.2/FileSaver.min.js"></script>
        <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.3.1/jspdf.umd.min.js"></script>
        <script>
            // This code is used for backwards compatibility with the older jsPDF variable name
            // Read more: https://github.com/MrRio/jsPDF/releases/tag/v2.0.0
            window.jsPDF = window.jspdf.jsPDF;
        </script>

        <!-- DevExtreme theme -->
        <style type="text/css">svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;overflow:visible;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transform-origin:center center;transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom right;transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:bottom left;transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top right;transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;-webkit-transform:scale(.25);transform:scale(.25);-webkit-transform-origin:top left;transform-origin:top left}.fa-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1.25em}.svg-inline--fa.fa-stack-2x{height:2em;width:2.5em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}</style><link rel="stylesheet" type="text/css" href="/CSS/dx.light_24_1_3.css">

        <!-- DevExtreme Quill (required by the HtmlEditor UI component) -->
        <script type="text/javascript" src="/JS/dx-quill_1_7_1.min.js"></script>
        <!-- DevExtreme library -->
        <script type="text/javascript" src="/DevExtreme/licencia.js"></script>
        <script type="text/javascript" src="/JS/dx.all_24_1_3.js"></script>
        <script type="text/javascript" src="/DevExtreme/dx.messages.es.js"></script>
        <script>
            DevExpress.localization.locale(navigator.language);
            DevExpress.config({
                licenseKey: dxLicencia,
                floatingActionButtonConfig: {
                    icon: 'hidepanel',
                    closeIcon: 'showpanel',
                    shading: true,
                    maxSpeedDialActionCount: 7,
                },
                defaultCurrency: "EUR"
            });
        </script>

        <!-- SELECT 2-->
        <link type="text/css" href="/CSS/select2.css" rel="stylesheet">
        <link type="text/css" href="/CSS/select2-bootstrap4.css" rel="stylesheet">
        <script type="text/javascript" src="/JS/select2.js"></script>

        <!-- Latest compiled and minified CSS -->
        <link type="text/css" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/css/bootstrap.min.css" integrity="sha384-Zug+QiDoJOrZ5t4lssLdxGhVrurbmBWopoEl+M6BdEfwnCJZtKxi1KgxUyJq13dy" crossorigin="anonymous">


        <script type="text/javascript" src="/JS/popper.min.js"></script>
        <!-- Latest compiled and minified JavaScript -->
        <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/js/bootstrap.min.js" integrity="sha384-a5N7Y/aK3qNeh15eJKGWxsqtnX/wWdSZSKp+81YjTmS15nvnvxKHuzaWwXHDli+4" crossorigin="anonymous">
        </script>
        <script type="text/javascript" defer="" src="https://use.fontawesome.com/releases/v5.8.1/js/all.js" integrity="sha384-g5uSoOSBd7KkhAMlnQILrecXvzst9TdC09/VM+pjDTCM+1il8RHz5fKANTFFb+gQ" crossorigin="anonymous">

        </script>

        <!-- bootstrap dialog-->
        <link type="text/css" rel="stylesheet" href="/CSS/bootstrap-dialog.css">
        <script type="text/javascript" src="/JS/bootstrap-dialog.js"></script>

        <!-- MASCARAS DE INPUT-->
        <script type="text/javascript" src="/JS/maskedinput.js"></script>

        <!-- DATE PICKER BOOTSTRAP -->
        <link type="text/css" rel="stylesheet" href="/DatePicker/css/bootstrap-datepicker.min.css">
        <script src="/DatePicker/js/bootstrap-datepicker.min.js" type="text/javascript"></script>
        <script src="/DatePicker/locales/bootstrap-datepicker.es.min.js" type="text/javascript"></script>

        <!-- DataTables -->
        <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/bs4/dt-1.10.18/datatables.min.css">
        <script type="text/javascript" src="https://cdn.datatables.net/v/bs4/dt-1.10.18/datatables.min.js"></script>

        <!-- Custom CSS -->
        <link rel="stylesheet" type="text/css" href="/CSS/Personal.css?v=v1.9.6.1">
        <link rel="stylesheet" type="text/css" href="/CSS/sermes.css?v=v1.9.6.1">
        <script type="text/javascript" src="/JS/sermes.js?v=v1.9.6.1"></script>
        <link rel="stylesheet" type="text/css" href="/CSS/menu.css?v=v1.9.6.1">
        <link rel="stylesheet" type="text/css" href="/CSS/scrollbar.css?v=v1.9.6.1">

        <!-- jQuery dirty plugin -->
        <script type="text/javascript" src="/JS/jquery.dirty.js"></script>

        <!-- Custom JS -->
        <script type="text/javascript" src="/JS/validaciones.js?v=v1.9.6.1"></script>
        <link rel="icon" type="image/x-icon" href="/favicon.ico">
</head>

<body style="height: 100% !important;" class="dx-viewport color-fondo-base dx-device-desktop dx-device-generic dx-theme-generic dx-theme-generic-typography dx-color-scheme-light">
<nav class="navbar navbar-expand-lg navbar-dark fixed-top fondo-sermes-nuevo" style="color: white;">
    <a class="navbar-brand" href="/"><img src="/img/Logotipo Sermes-blanco.png" style="height: 25px"></a>
    <ul class="navbar-nav mr-auto">
            </ul>
    <ul class="navbar-nav ml-auto">
            </ul>
</nav>
<div class="container-fluid" style="height: 100%; padding-top: 57px; background-image: url('/img/Imagen login v2.jpg');background-repeat: no-repeat;background-size: cover;" id="nonsession-full-page">
    <div class="row" style="height: 100%">
        <div id="main" class="col-12">
                                    
    
<div>
        <script>
    var azureAuth = localStorage.getItem('AzureAuth')
    if(azureAuth){
        window.location = '/connect/azure?sf_redirect=https://sms.sermescro.com/'
    }
</script>
<div class="container-fluid">
    <form action="/login_check" method="post">
                    <input type="hidden" name="_csrf_token" value="hs-aiBhWR4agEMqBOkZcfNprtp7v3gCfXh_e7KncPKI">
                <div class="card" style="background-color: #0088CC; color: #FFFFFF; width: 50%; margin:auto; margin-top: 3.5%; padding: 4px; font-size: 32px" align="center">
            <span>Sermes Management System</span>
        </div>
        <div class="card" style="width: 50%; margin:auto; padding: 20px">
            <div class="container">
                <div class="py-2">
                    <h3>Inicio de sesión</h3>
                </div>

                                                    
                <div style="display: block" id="login-form">

                                <div class="row py-2">
                    <div class="col-4">
                        <label for="username">Email</label>
                    </div>
                    <div class="col-8">
                        <input type="text" id="username" name="_username" value="" required="required" autocomplete="username" class="form-control">
                    </div>
                </div>
                <div class="row py-2">
                    <div class="col-4">
                        <label for="password">Contraseña</label>
                    </div>
                    <div class="col-8">
                        <input type="password" id="password" name="_password" required="required" autocomplete="current-password" class="form-control">
                    </div>
                </div>

                <div class="row pt-2" align="center">
                    <div class="col-12" align="center">
                        <button type="submit" class="btn btn-primary"><svg class="svg-inline--fa fa-lock fa-w-14" aria-hidden="true" focusable="false" data-prefix="fa" data-icon="lock" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" data-fa-i2svg=""><path fill="currentColor" d="M400 224h-24v-72C376 68.2 307.8 0 224 0S72 68.2 72 152v72H48c-26.5 0-48 21.5-48 48v192c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V272c0-26.5-21.5-48-48-48zm-104 0H152v-72c0-39.7 32.3-72 72-72s72 32.3 72 72v72z"></path></svg><!-- <i class="fa fa-lock"></i> --> Acceder</button>
                        <br>
                        <a href="/resetting/request">¿Ha olvidado su contraseña?</a>
                        <br><br>
                        <a style="font-size: 18px" href="/quejas">Buzón anónimo para quejas / sugerencias / felicitaciones</a>
                    </div>
                </div>
                </div>
                <div class="row py-0">
                    <div class="col-12" align="center">
                        <span style="font-size: 12px">Web optimizada para <strong>Mozilla Firefox</strong> y <strong>Google Chrome</strong></span>
                    </div>
                </div>
            </div>
        </div>
    </form>

    <script>
        $(document).ready(function(){
            $("#change-login").click(function(){
                $("#login-azure").hide();
                $("#login-form").show();
            });
        });
    </script>
</div>
</div>
                    </div>
                </div>
            </div>

            <!-- MODALES -->
            <!-- Error -->
            <div class="modal fade" id="errorModal" tabindex="-1" role="dialog" aria-labelledby="errorModalLabel" aria-hidden="true" style="z-index: 1901">
                <div class="modal-dialog" role="document">
                    <div class="modal-content">
                        <div class="modal-header" style="background-color: #AA3333; color: #FFFFFF">
                            <h5 class="modal-title" id="exampleModalLabel"></h5>
                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                <span aria-hidden="true">×</span>
                            </button>
                        </div>
                        <div class="modal-body">

                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Cerrar</button>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Exito -->
            <div class="modal fade" id="exitoModal" tabindex="-1" role="dialog" aria-labelledby="exitoModalLabel" aria-hidden="true">
                <div class="modal-dialog" role="document">
                    <div class="modal-content">
                        <div class="modal-header" style="background-color: #55AA55; color: #FFFFFF">
                            <h5 class="modal-title" id="exampleModalLabel"></h5>
                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                <span aria-hidden="true">×</span>
                            </button>
                        </div>
                        <div class="modal-body">

                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Cerrar</button>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Warning -->
            <div class="modal fade" id="warningModal" tabindex="-1" role="dialog" aria-labelledby="warningModalLabel" aria-hidden="true">
                <div class="modal-dialog" role="document">
                    <div class="modal-content">
                        <div class="modal-header bg-warning" style="color: #FFFFFF">
                            <h5 class="modal-title" id="exampleModalLabel"></h5>
                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                <span aria-hidden="true">×</span>
                            </button>
                        </div>
                        <div class="modal-body">

                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Cerrar</button>
                        </div>
                    </div>
                </div>
            </div>


            <!-- Confirm -->
            <div class="modal fade" id="confirmModal" tabindex="-1" role="dialog" aria-labelledby="confirmModalLabel" aria-hidden="true">
                <div class="modal-dialog" role="document">
                    <div class="modal-content">
                        <div class="modal-header bg-warning text-white">
                            <h5 class="modal-title" id="exampleModalLabel"></h5>
                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                <span aria-hidden="true">×</span>
                            </button>
                        </div>
                        <div class="modal-body">

                        </div>
                        <div class="modal-footer">
                            <button type="button" id="confirmBtn" class="btn btn-warning" data-dismiss="modal">
                                Aceptar
                            </button>
                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Cerrar</button>
                        </div>
                    </div>
                </div>
            </div>


            <!-- Confirmación de clave -->
            <div class="modal fade" id="confirmacionClaveModal" tabindex="-1" role="dialog" aria-hidden="true">
                <div class="modal-dialog" role="document">
                    <div class="modal-content">
                        <div class="modal-header bg-warning text-white">
                            <h5 class="modal-title">Confirmar clave</h5>
                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                <span aria-hidden="true">×</span>
                            </button>
                        </div>
                        <div class="modal-body">
                            <p>Como medida adicional de seguridad, le rogamos introduzca su clave de acceso a SMS. De esta forma, esta acción quedará vinculada y firmada digitalmente con su usuario de manera única</p>
                            <form onkeydown="return event.key != 'Enter';">
                                <label for="clave">Clave de acceso a SMS</label>
                                <input type="password" class="form-control" name="clave" id="confirmacionClave" placeholder="Introduzca la clave">
                            </form>
                        </div>
                        <div class="modal-footer">
                            <button type="button" id="confirmacionClaveBtn" class="btn btn-warning" data-dismiss="modal">
                                Confirmar
                            </button>
                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Cerrar</button>
                        </div>
                    </div>
                </div>
            </div>


            <!-- Cargando -->
            <div class="modal" id="cargandoModal" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static">
                <div class="spinner"></div>
            </div>

            <div id="loadPanel" class="dx-overlay dx-widget dx-state-invisible dx-visibility-change-handler dx-loadpanel"><div class="dx-overlay-content dx-state-invisible" style="width: 222px; height: 90px;"></div></div>
                            <script>
                    var successBag = '';
                    var errorBag = '';

                    window.onload = () => {
                        $("#contenido").css('margin-top', $("#cabecera").height() - 20);

                                                                        
                        if (successBag !== '') {
                            muestraExitoDx(successBag);
                        }
                        if (errorBag !== '') {
                            muestraErrorDx(errorBag);
                        }
                                            };

                    function muestraErrorDx(msg) {
                        DevExpress.ui.notify({
                            message: msg,
                            type: 'error',
                            displayTime: 3000,
                            position: 'bottom center'
                        });
                    }

                    function muestraExitoDx(msg) {
                        DevExpress.ui.notify({
                            message: msg,
                            type: 'success',
                            displayTime: 3000,
                            position: 'bottom center'
                        });
                    }

                    function alternarVisibilidadCampoDx(componenteDx, nombre, tipo){
                        if(tipo === 'hide'){
                            if (componenteDx !== '') {
                                componenteDx.option('visible', false)
                                $("label[for="+nombre+"]").addClass('dx-state-invisible')
                            } else {
                                $("#"+nombre).addClass('dx-state-invisible')
                            }
                        }else if (tipo === 'show'){
                            if (componenteDx !== '') {
                                componenteDx.option('visible', true)
                                $("label[for="+nombre+"]").removeClass('dx-state-invisible')
                            } else {
                                $("#"+nombre).removeClass('dx-state-invisible')
                            }
                        }
                    }

                    $.mask.definitions['H'] = "[0-2]";
                    $.mask.definitions['M'] = "[0-5]";
                    $(".hora").mask("H9:M9");

                    $.mask.definitions['a'] = "[1-2]";
                    $(".anio").mask("a999");

                    $.mask.definitions['D'] = "[0-3]";
                    $.mask.definitions['#'] = "[0-1]";
                    $.mask.definitions['X'] = "[0-9X]";
                    $(".fecha").mask("D9-#9-a999");
                    $(".fecha-uk").mask("XX/XX/a999");

                    $(".matricula").mask("9999");
                    $(".cp").mask("99999");
                    $(".eudra").mask("9999-999999-99");

                    $(document).ready(function () {
                        $('[data-toggle="tooltip"]').tooltip({html: true});
                    });

                    function muestraError(titulo, msg) {
                        var modal = $("#errorModal");
                        modal.find(".modal-title").html(titulo);
                        modal.find(".modal-body").html(msg);
                        modal.modal('toggle');
                    }

                    function muestraExito(titulo, msg) {
                        var modal = $("#exitoModal");
                        modal.find(".modal-title").html(titulo);
                        modal.find(".modal-body").html(msg);
                        modal.modal('toggle');
                    }

                    function muestraWarning(titulo, msg) {
                        var modal = $("#warningModal");
                        modal.find(".modal-title").html(titulo);
                        modal.find(".modal-body").html(msg);
                        modal.modal('toggle');
                    }

                    function muestraConfirmDx(titulo, msg, action, params){
                        let result = DevExpress.ui.dialog.confirm(msg, titulo);
                        result.done(function(dialogResult) {
                            if (dialogResult) {
                                action(params)
                            }
                        })
                    }

                    function muestraConfirm(titulo, msg, action, params, confirmarClave) {
                        var modal = $("#confirmModal");
                        modal.find(".modal-title").html(titulo);
                        modal.find(".modal-body").html(msg);
                        modal.find('#confirmBtn').off('click')
                        if (confirmarClave) {
                            modal.find('#confirmBtn').on('click', () => muestraConfirmacionClave(action, {data: params}))
                        } else {
                            modal.find('#confirmBtn').on('click', params, action)
                        }

                        modal.modal('toggle');
                    }

                    function confirmarClave(clave, action, params) {
                        muestraCargando(true);
                        var url = '/user/confirmarClave';
                        $.ajax({
                            url: url,
                            data: {clave},
                            type: 'POST',
                            action,
                            params,
                            success: function () {
                                this.action(this.params);
                            },
                            error: function () {
                                muestraError('No se ha podido confirmar la operación', 'La clave que has introducido no coincide con la clave de acceso a SMS.');
                            },
                            complete: function () {
                                muestraCargando(false);
                            }
                        })
                    }

                    function muestraConfirmacionClave(action, params) {
                        var modal = $("#confirmacionClaveModal");
                        modal.find('#confirmacionClaveBtn').off('click');
                        var inputClave = modal.find('#confirmacionClave');
                        modal.find('#confirmacionClaveBtn').on('click', () => {
                            confirmarClave(inputClave.val(), action, params);
                            inputClave.val('');
                        });
                        modal.modal('toggle');
                    }

                    var procesosCargando = 0;
                    function muestraCargando(cargando) {
                        var modal = $('#cargandoModal');
                        cargando ? procesosCargando++ : procesosCargando--;
                        if (procesosCargando > 0) {
                            modal.modal('show');
                        } else {
                            modal.modal('hide');
                        }
                    }

                    const loadPanel = $("#loadPanel").dxLoadPanel({
                        shadingColor: 'rgba(0,0,0,0.4)',
                        position: { of: '#main' },
                        visible: false,
                        showIndicator: true,
                        showPane: true,
                        shading: true,
                        hideOnOutsideClick: false,
                    }).dxLoadPanel('instance');

                    function enviaPeticionAjax(url, data, type = 'GET'){
                        return new Promise(function (resolve,reject) {
                            $.ajax({
                                'url': url,
                                'data': data,
                                'type': type,
                                'success': function (data) {
                                    resolve(data)
                                },
                                'error': function (request, error) {
                                    reject(request)
                                }
                            });
                        });
                    }

                    let callbackAjax = (data) => {
                        if(typeof data.status !== 'undefined'){
                            if (data.status === 'success') {
                                muestraExitoDx(data.msg);
                            } else if (data.status === 'error') {
                                muestraErrorDx(data.msg);
                            }
                        }
                    }

                    function cargarFormModal(url, data){
                        var html = null;
                        loadPanel.show();

                        $.ajax({
                            url: url,
                            data: data,
                            type: 'get',
                            async: false,
                            success: function(data) {
                                var $noCache = $('<input type="hidden" name="nocache"'+$.now()+' />')
                                html = data;
                                html = $(html).append($noCache)
                            },
                            complete: function () {
                                loadPanel.hide();
                            }
                        })

                        return html;
                    }

                    function cargarFormModalScroll(url, data){
                        var html = cargarFormModal(url, data)
                        const scrollView = $('<div />');
                        scrollView.append(html);

                        scrollView.dxScrollView({
                            width: '100%',
                            height: '100%',
                        });

                        return scrollView;
                    }

                    /**
                     * Tramita la petición de submit del formulario con id pasado en formId.
                     *
                     * @param formId
                     * @param datosAdicionales
                     * @returns {null}
                     */
                    function guardarFormModal(formId, datosAdicionales = [])
                    {
                        var form = $("#"+formId)
                        var formData = document.getElementById(formId)
                        var data = new FormData(formData)
                        datosAdicionales.forEach(function (valor){
                            data.append(valor.indice, valor.valor)
                        })
                        var ret = null;
                        $.ajax({
                            url: form.attr('action'),
                            data: data,
                            type: 'post',
                            dataType: 'json',
                            async: false,
                            contentType:false,
                            processData:false,
                            cache:false,
                            success: function(data) {
                                ret = data;
                            },
                            error: function(data) {
                                ret = {
                                    response: 'error',
                                    form: data.responseText,
                                }
                            }
                        })

                        return ret;
                    }

                    /**
                     * Tramita la petición de submit del formulario con id pasado en formId.
                     *
                     * @param formId
                     * @param datosAdicionales
                     * @returns {null}
                     */
                    function guardarFormModalPromise(formId, datosAdicionales = [])
                    {
                        loadPanel.show();
                        var form = $("#"+formId)
                        var formData = document.getElementById(formId)
                        var data = new FormData(formData)
                        datosAdicionales.forEach(function (valor){
                            data.append(valor.indice, valor.valor)
                        })
                        return new Promise(function (resolve,reject) {
                            $.ajax({
                                url: form.attr('action'),
                                'data': data,
                                'type': 'POST',
                                dataType: 'json',
                                contentType:false,
                                processData:false,
                                cache:false,
                                'success': function (data) {
                                    resolve(data)
                                },
                                'error': function (request, error) {
                                    reject(request)
                                },
                                complete: function () {
                                    loadPanel.hide();
                                }
                            });
                        });
                    }

                    function isNotEmpty(value) {
                        return value !== undefined && value !== null && value !== "";
                    }
                </script>

                <script>
                    const idleTimeout = 1200000;
                    const idleWarningTimeout = 1080000;
                    var warningTimeout = null;
                    var logoutTimeout = null;

                    function mostrarAvisoInactividad() {
                        //Obtener último tiempo de actividad
                        $.getJSON("/security/comprobar-inactividad").then((data) => {
                            let lastActivity = new Date(data.data.lastActivity);
                            let currentDate = new Date();
                            let inactivity = currentDate - lastActivity;

                            //Si inactividad es mayor o igual a idleWarningTimeout, mostrar el aviso de inactividad
                            if (inactivity >= idleWarningTimeout) {
                                if (logoutTimeout !== null) {
                                    window.clearTimeout(logoutTimeout);
                                }
                                logoutTimeout = window.setTimeout(forzarLogout, idleTimeout - idleWarningTimeout);

                                //Enviar notificacion push
                                enviarNotificacionPush("Aviso de inactividad", "Se cerrará por inactividad su sesión en SMS en 2 minutos");

                                //Aviso de confirmación de cierre de sesión
                                muestraConfirmDx('Cierre de sesión', 'Hemos detectado que llevas un tiempo ausente. ¿Quieres mantener tu sesión activa? Haz clic en Sí para mantenerla.',
                                    () => {
                                        $.getJSON("/security/mantener-sesion");
                                        window.clearTimeout(logoutTimeout);
                                        window.clearTimeout(warningTimeout);
                                        warningTimeout = window.setTimeout(mostrarAvisoInactividad, idleWarningTimeout);
                                    }
                                );
                            } else {
                                window.clearTimeout(warningTimeout);
                                warningTimeout = window.setTimeout(mostrarAvisoInactividad, idleWarningTimeout - inactivity);
                            }
                        });
                    }

                    function forzarLogout() {
                        $.getJSON("/security/comprobar-inactividad").then((data) => {
                            let logoutLastActivity = new Date(data.data.lastActivity);
                            let logoutCurrentDate = new Date();
                            let logoutInactivity = logoutCurrentDate - logoutLastActivity;

                            if (logoutInactivity >= idleTimeout) {
                                console.log("Sesión caducada por inactividad. Forzando logout...");
                                location.reload();
                            } else if (logoutInactivity >= idleWarningTimeout) {
                                window.clearTimeout(logoutTimeout);
                                logoutTimeout = window.setTimeout(forzarLogout, idleTimeout - logoutInactivity);
                            } else {
                                window.clearTimeout(warningTimeout);
                                warningTimeout = window.setTimeout(mostrarAvisoInactividad, idleWarningTimeout - logoutInactivity);
                            }
                        });
                    }

                    warningTimeout = window.setTimeout(mostrarAvisoInactividad, idleWarningTimeout);

                </script>


                <script type="text/javascript" src="/DevExtreme/groupSelectionHelper.js?v=v1.9.6.1"></script>
                <script type="text/javascript" src="/JS/notificationHelper.js?v=v1.9.6.1"></script>
                <script type="text/javascript" src="/JS/plegarSecciones.js?v=v1.9.6.1"></script>
                <script type="text/javascript" src="/JS/cookies.js?v=v1.9.6.1"></script>
                <script type="text/javascript" src="/JS/observers.js?v=v1.9.6.1"></script>
            

</body></html>