www2.alsaferrol.es
Open in
urlscan Pro
212.163.31.177
Public Scan
Submitted URL: http://www2.alsaferrol.es/
Effective URL: https://www2.alsaferrol.es/
Submission: On July 23 via manual from ES — Scanned from ES
Effective URL: https://www2.alsaferrol.es/
Submission: On July 23 via manual from ES — Scanned from ES
Form analysis
4 forms found in the DOMName: loginForm — POST https://www2.alsaferrol.es/web/bus/home?p_p_id=BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_javax.portlet.action=busplusLoginAction&p_auth=cgOVEeUd
<form class="form ng-pristine ng-invalid ng-invalid-required ng-valid-pattern" id="loginForm" name="loginForm" method="post"
action="https://www2.alsaferrol.es/web/bus/home?p_p_id=BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_javax.portlet.action=busplusLoginAction&p_auth=cgOVEeUd"
novalidate="" data-ng-submit="manageSubmit($event)" autocomplete="off">
<!-- Post Action -->
<input type="hidden" name="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_postLoginRedirect" id="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_postLoginRedirect" value="">
<input type="hidden" name="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_postLoginRedirectUrl" id="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_postLoginRedirectUrl" value="">
<fieldset>
<!-- componente login google -->
<div class="row">
<div class="col-xs-12 px-0" ng-class="{'col-md-6 col-md-offset-3': !isPopupLogin}">
<div class="g_id_signin" data-type="standard" data-shape="rectangular" data-theme="outline" data-text="signin_with" data-size="large" data-width="285" data-locale="es_ES" data-logo_alignment="left">
<div class="S9gUrf-YoZ4jf" style="position: relative;">
<div>
<div tabindex="0" role="button" aria-labelledby="button-label" class="nsm7Bb-HzV7m-LgbsSe hJDwNd-SxQuSe i5vt6e-Ia7Qfc uaxL4e-RbRzK" style="width:285px; max-width:400px; min-width:min-content;">
<div class="nsm7Bb-HzV7m-LgbsSe-MJoBVe"></div>
<div class="nsm7Bb-HzV7m-LgbsSe-bN97Pc-sM5MNb ">
<div class="nsm7Bb-HzV7m-LgbsSe-Bz112c"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" class="LgbsSe-Bz112c">
<g>
<path fill="#EA4335" d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"></path>
<path fill="#4285F4" d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"></path>
<path fill="#FBBC05" d="M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z"></path>
<path fill="#34A853" d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"></path>
<path fill="none" d="M0 0h48v48H0z"></path>
</g>
</svg></div><span class="nsm7Bb-HzV7m-LgbsSe-BPrWId">Iniciar sesión con Google</span><span class="L6cTce" id="button-label">Iniciar sesión con Google</span>
</div>
</div>
</div><iframe
src="https://accounts.google.com/gsi/button?type=standard&shape=rectangular&theme=outline&text=signin_with&size=large&width=285&logo_alignment=left&client_id=1095897870165-1bvb91t0n687k6l037s2ltfh9j4rtrga.apps.googleusercontent.com&iframe_id=gsi_256218_15731&as=TR1DVXqyg5lRgxrlgubDiQ&hl=es_ES"
allow="identity-credentials-get" id="gsi_256218_15731" title="Botón Iniciar sesión con Google" style="display: block; position: relative; top: 0px; left: 0px; height: 0px; width: 0px; border: 0px;"></iframe>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-xs-12" ng-class="{'col-md-6 col-md-offset-3': !isPopupLogin}">
<p class="google-o"><strong class="google-o__text">o</strong></p>
</div>
</div>
<!-- fin componente login google -->
<!-- Form fields -->
<div class="form-row row">
<!-- Bloque para el input DocumentNumber -->
<div class="col-xs-12" ng-class="{'col-md-6 col-md-offset-3': !isPopupLogin}">
<div class="form-group">
<label for="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_busplusDocumentNumber">NIF / NIE / Pasaporte/Email<span class="asterisco">*</span>
<!-- ngIf: showErrorMessage(loginForm._BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_userName) -->
</label>
<input id="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_busplusDocumentNumber" name="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_userName" type="text"
placeholder="Introduce tu documento de identidad o email" class="form-control ng-pristine ng-invalid ng-invalid-required"
data-ng-class="{'invalid-field': showErrorMessage(loginForm._BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_userName)}" data-ng-model="documentNumber" data-required="" data-ng-focus="">
<div class="error-container ng-hide" data-ng-show="showErrorMessage(loginForm._BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_userName)">
<small class="error-message" data-ng-show="loginForm._BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_userName.$error.required">Campo requerido.</small>
</div>
</div>
</div>
</div> <!-- row -->
<div class="form-row row">
<!-- Bloque para el input Password -->
<div class="col-xs-12" ng-class="{'col-md-6 col-md-offset-3': !isPopupLogin}">
<div class="form-group">
<label for="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_busplusPassword">Contraseña<span class="asterisco">*</span>
<!-- ngIf: showErrorMessage(loginForm._BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_password) -->
</label>
<input id="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_busplusPassword" name="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_password" type="password" placeholder="Introduce tu contraseña"
class="form-control ng-pristine ng-invalid ng-invalid-required" data-ng-class="{'invalid-field': showErrorMessage(loginForm._BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_password)}" data-ng-model="password"
data-required="" data-ng-focus="">
<div id="show_password" data-ng-class="revealedPassword_formLogin() ? 'icn-eye c-password__icon--slash' : 'icn-eye'" class="c-password__icon icn-eye ng-hide" type="image" data-ng-show="showButtonRevealPassword_formLogin()"
data-ng-click="mostrarContrasena_formLogin($event)" title="Ver contraseña">
<span class="ui-hidden-accessible">Ver contraseña</span>
</div>
<div class="error-container ng-hide" data-ng-show="showErrorMessage(loginForm._BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_password)">
<small class="error-message" data-ng-show="loginForm._BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_password.$error.required">Campo requerido.</small>
</div>
</div>
</div>
</div><!-- row -->
<div class="form-row row">
<div class="col-xs-12" ng-class="{'col-md-6 col-md-offset-3': !isPopupLogin}">
<!-- Esta parte no debe ser visible en el paso 3 - Fin -->
<!-- Recordar en futuras visitas -->
<div class="rememberLogin-container">
<input id="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_rememberMe" class="ui-hidden-accessible" name="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_rememberMe" type="checkbox" value="true" checked="">
<label class="label-checkbox checkbox-altocontraste" for="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_rememberMe"> Recuérdame para futuras visitas </label>
</div>
</div>
</div><!-- row -->
<div class="form-row row">
<div class="col-xs-12" ng-class="{'col-md-6 col-md-offset-3': !isPopupLogin}">
<button type="submit" class="btn btn-primary">Entrar</button>
</div>
</div> <!-- row -->
<div class="form-row row">
<div class="col-xs-12" ng-class="{'col-md-6 col-md-offset-3': !isPopupLogin}">
<!-- Recuperar contraseña: Esta parte no debe ser visible en el paso 3 -->
<!-- ngIf: !isThirdStep() -->
<div class="recoverPass-container mt-3 ng-scope" data-ng-if="!isThirdStep()">
<script type="text/javascript">
params["isTestEnvironment"] = ""; // indica si estamos en entorno de desarrollo o produccion
params["jsonDateFormat"] = "yyyy/MM/dd hh:mm:ss";
params["timestamp"] = "1721093672000";
params["responsive992"] = "991";
params["responsive768"] = "767";
params["groupId"] = "21643679";
params["contextPath"] = '/o/Alsa-portlet';
params["validNamePattern"] = "^[0-9a-zA-Zá-úÁ-ÚñÑÄËÏÖÜäëïöüàèìòùÀÈÌÒÙªº\\-\\s\\.]*$";
//Si existe busplususer y no ha sido pasado como parámetro
//Informacion para contenidos en ventanas emergentes de condiciones de compra, etc
params["newsletterConditions"] = '21690005';
//Constantes globales (se usaran en controladores y templates con constants.PASSPORT)
//tipos de documentos a mostrar en los combos
constants["PASSPORT"] = 0;
constants["NIF"] = 1;
constants["NIE"] = 2;
if (params["activeGoogleTag"] == "true") {
if ('') {
alsa_GA.busplusAutoLogin('');
}
$(document).ready(function() {
alsa_GA.externalLinksInit();
});
}
</script>
<script src="https://estaticos.alsa.es/o/Alsa-portlet/busplus/busplusresetpassword/app/busplusresetpassword-min.js?t=1721093672000" type="text/javascript"></script>
<!-- <script src="https://estaticos.alsa.es/o/Alsa-portlet/busplus/busplusresetpassword/app/newPasswordFormApp.js?t=1721093672000" type="text/javascript"></script> -->
<!-- <script src="https://estaticos.alsa.es/o/Alsa-portlet/busplus/busplusresetpassword/app/newPasswordFormAppController.js?t=1721093672000" type="text/javascript"></script> -->
<!-- <script src="https://estaticos.alsa.es/o/Alsa-portlet/busplus/busplusresetpassword/app/recoverPasswordApp.js?t=1721093672000" type="text/javascript"></script> -->
<!-- <script src="https://estaticos.alsa.es/o/Alsa-portlet/busplus/busplusresetpassword/app/recoverPasswordDirective.js?t=1721093672000" type="text/javascript"></script> -->
<!-- <script src="https://estaticos.alsa.es/o/Alsa-portlet/busplus/busplusresetpassword/app/recoverPasswordService.js?t=1721093672000" type="text/javascript"></script> -->
<script src="https://estaticos.alsa.es/o/Alsa-portlet/busplus/busplusresetpassword/app/recoverPasswordService.js?t=1721093672000" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="https://estaticos.alsa.es/o/Alsa-portlet/busplus/busplusresetpassword/css/recover-password.css?t=1721093672000">
<script type="text/javascript">
params["namespaceRecoverPassword"] = "_BusplusLoginPortlet_WAR_Alsaportlet_";
params["RESET_PASSWORD_SHOW_SMS"] = 'true';
i18n.addTranslation('busplus.recover-password.title', '¿Has olvidado tu contraseña?');
i18n.addTranslation('busplus.recover-password.question', 'Escribe tu número de documento NIF,NIE, Pasaporte.');
i18n.addTranslation('busplus.recharge-card.document-number', 'Número de documento');
i18n.addTranslation('busplus.recover-password.question.email-empty', 'Tu usuario no tiene un email asociado. Por favor, introduce los siguientes datos de tu usuario y una dirección de email para hacerte llegar tu contraseña.');
i18n.addTranslation('busplus.login.error-email-message', 'Usuario sin dirección de email.');
i18n.addTranslation('busplus.login.error-email-message2', 'La fecha de nacimiento introducida no coincide con la del usuario. Por favor inténtelo de nuevo.');
i18n.addTranslation('busplus.recover-password.id-placeholder', 'NIF/NIE/Pasaporte');
i18n.addTranslation('busplus.recover-password.send-password', 'Recuperar contraseña');
i18n.addTranslation('busplus.recover-password.password-sent', 'Te hemos enviado un email con tu nueva contraseña.');
i18n.addTranslation('busplus.recover-password.can-change',
'Mira tu bandeja de correo y si no lo encuentras, revisa la bandeja de correo no deseado o spam. Si quieres modificar la nueva contraseña que te hemos enviado, entra en la sección "Tu perfil", dentro de tu Alsa Plus.');
i18n.addTranslation('busplus.login.error-message', 'Credenciales incorrectas.');
i18n.addTranslation('busplus.login.error-message.email-empty', 'busplus.login.error-message.email-empty');
i18n.addTranslation('busplus.login.unknown-error-message', 'Error desconocido durante el login. Por favor inténtalo más tarde.');
i18n.addTranslation('busplus.email.info.body-part1', 'Revisa tu bandeja de entrada, valida tu email para completar el registro Alsa Plus');
i18n.addTranslation('busplus.document-number.label', 'NIF / NIE / Pasaporte');
i18n.addTranslation('busplus.birth-date.label', 'Fecha de nacimiento');
i18n.addTranslation('general.label.day', 'Día');
i18n.addTranslation('general.label.month', 'Mes');
i18n.addTranslation('general.label.year', 'Año');
i18n.addTranslation('busplus.email.label', 'Email');
i18n.addTranslation('zz23.busplus.recover-password.password-sent', 'Si tus datos son correctos, recibirás un email para crear una nueva contraseña');
i18n.addTranslation('zz23.busplus.recover-password.can-change',
'Solo tienes que hacer clic en el enlace que aparece en el email y crear una nueva contraseña. Si no encuentras el mail en la bandeja de entrada, revisa la bandeja de correo no deseado o spam.');
i18n.addTranslation('zz23.busplus.recover-password.can-change.note', 'IMPORTANTE: Recuerda que este enlace solo tiene una validez de 30 minutos desde que recibes el email.');
i18n.addTranslation('zzz01.alsaplus.login.lost-password-question', '¿Olvidaste tu contraseña?');
i18n.addTranslation('validation.required-field', 'Campo requerido.');
i18n.addTranslation('zzz05.validation.password.secure', 'Introduce una contraseña segura: al menos 8 caracteres que incluyan una mayúscula, una minúscula y un número.');
i18n.addTranslation('validation.not-match', 'Los campos no coinciden');
i18n.addTranslation('busplus.profile.password.new', 'Nueva contraseña');
i18n.addTranslation('busplus.profile.password.new.repeat', 'Confirmar la nueva contraseña');
i18n.addTranslation('zzz05.recover-password.do.not.remember.email.phonenumber', 'No recuerdo el email ni el teléfono asociado');
i18n.addTranslation('zzz05.recover-password.verify.sms', 'Código de verificación recibido');
i18n.addTranslation('zzz05.recover-password.verify.sms.message', 'Si tus datos son correctos, recibirás un sms con un código de acceso de un sólo uso');
i18n.addTranslation('zzz05.recover-password.can.not.contact', '¡Parece que no podemos contactar contigo!');
i18n.addTranslation('zzz05.recover-password.refill.form', 'Por favor, rellena este formulario para que podamos ayudarte.');
i18n.addTranslation('zzz05.recover-password.contact.alsaplus', 'Contacto Alsa Plus');
i18n.addTranslation('general.navigation.close', 'Cerrar');
i18n.addTranslation('zzz05.recover-password.select.how', 'Selecciona cómo prefieres restablecer tu contraseña');
i18n.addTranslation('zzz05.recover-password.sms', 'Mensaje de texto (SMS)');
i18n.addTranslation('zzz01.alsaplus.change-password', 'Cambiar contraseña');
i18n.addTranslation('zzz05.general.resend', 'Reenviar');
i18n.addTranslation('zzz03.registered-user.registry.success.explanation', 'Tus datos se han guardado correctamente');
i18n.addTranslation('contactForm.error.title', 'Se ha producido un error');
i18n.addTranslation('zzz05.reset-password.retries.left1', 'Código de verificación erróneo, te queda/n');
i18n.addTranslation('zzz05.reset-password.retries.left2', '\ intento/s.');
i18n.addTranslation('zzz05.reset-password.sms.active', 'Ya tienes un código de verificación activo, revisa en tu teléfono e introduce el código de verificación');
i18n.addTranslation('zzz05.reset-password.no.retries', 'Ya no te quedan intentos, vuelve a enviar el SMS');
i18n.addTranslation('zzz05.reset-password.resend.sms', 'Código de verificación erróneo, ya no te quedan intentos, vuelve a enviar el SMS.');
i18n.addTranslation('zzz05.reset-password.sms.timeout', 'Código de verificación expirado. Vuelve a solicitar el envío SMS.');
</script>
<div id="recoverPasswordApp">
<data-sag-alsa-recover-password
data-recover-password-url="https://www2.alsaferrol.es/web/bus/home?p_p_id=BusplusLoginPortlet_WAR_Alsaportlet&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=AjaxRecoverPassword&p_p_cacheability=cacheLevelPage&p_p_auth=ECv0vmwH"
data-recover-password-reset-email-url="https://www2.alsaferrol.es/web/bus/home?p_p_id=BusplusLoginPortlet_WAR_Alsaportlet&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=AjaxRecoverPasswordResetEmail&p_p_cacheability=cacheLevelPage&p_p_auth=ECv0vmwH"
data-recover-password-sms-url="https://www2.alsaferrol.es/web/bus/home?p_p_id=BusplusLoginPortlet_WAR_Alsaportlet&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=AjaxRecoverPasswordSMS&p_p_cacheability=cacheLevelPage&p_p_auth=ECv0vmwH"
data-recover-password-check-verification-code-url="https://www2.alsaferrol.es/web/bus/home?p_p_id=BusplusLoginPortlet_WAR_Alsaportlet&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=AjaxRecoverPasswordCheckVerificationCode&p_p_cacheability=cacheLevelPage&p_p_auth=ECv0vmwH"
data-recover-password-reset-password-url="https://www2.alsaferrol.es/web/bus/home?p_p_id=BusplusLoginPortlet_WAR_Alsaportlet&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=AjaxRecoverPasswordResetPassword&p_p_cacheability=cacheLevelPage&p_p_auth=ECv0vmwH"
class="ng-isolate-scope">
<a href="#" data-ng-click="init('recoverPasswordModal')" class="recoverPass-container-link">
<strong data-ng-bind="i18n.t('zzz01.alsaplus.login.lost-password-question')" class="ng-binding">¿Olvidaste tu contraseña?</strong>
</a>
<div class="sag-modal fade" id="recoverPasswordModal" aria-labelledby="recoverPasswordModal-title" role="dialog" aria-describedby="recoverPasswordModal-desc" tabindex="-1" aria-hidden="true">
<div class="sag-modal-dialog sag-modal-dialog--medium pb-3">
<data-ng-form role="form" name="recoverForm" id="recoverForm" class="recover-password ng-pristine ng-valid-required ng-valid ng-valid-pattern" data-ng-model="formRecovery" novalidate="" data-isolate-form="">
<div class="sag-modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true"></span> <span class="sr-only ng-binding" data-ng-bind="i18n.t('general.navigation.close')">Cerrar</span>
</button>
<h2 id="recoverPasswordModal-title" class="sag-modal-title sag-modal-title--azul recover-password__modal-title">
<strong data-ng-bind="i18n.t('busplus.recover-password.title')" class="ng-binding">¿Has olvidado tu contraseña?</strong>
</h2>
</div>
<div class="sag-modal-content">
<div class="sag-modal-body" id="recoverPasswordModal-desc" aria-live="assertive">
<!-- Formulario de reset de contaseña -->
<!-- ngIf: RESET_PASSWORD_SHOW_SMS -->
<!-- Formulario reset contraseña SIN SMS -->
<!-- ngIf: !RESET_PASSWORD_SHOW_SMS -->
<div data-ng-if="!RESET_PASSWORD_SHOW_SMS" class="ng-scope">
<div data-ng-show="(data == '' && !showContactFormRedirect) || (data != '' && data.messageError)" class="ng-hide">
<!-- formulario para solicitar nueva password con dni (el usuario tiene email asociado) -->
<p data-ng-bind="i18n.t('busplus.recover-password.question')" class="ng-binding">Escribe tu número de documento NIF,NIE, Pasaporte.</p>
<!-- ngIf: data == '' || (data.messageError!='email-empty' && data.messageError!='email-empty-error') -->
<div class="form-group ng-scope" data-ng-if="data == '' || (data.messageError!='email-empty' && data.messageError!='email-empty-error')">
<div data-ng-show="data.messageError" class="bg-danger ng-hide">
<p data-ng-bind="data.messageError" class="ng-binding"></p>
</div>
<label for="account-recovery" data-ng-bind="i18n.t('busplus.recharge-card.document-number')" class="ng-binding">Número de documento</label>
<input type="text" name="account-recovery" class="form-control ng-pristine ng-valid" id="account-recovery" autocomplete="off" placeholder="NIF/NIE/Pasaporte" data-ng-model="formRecovery.userIdentifier"
data-ng-disabled="loading" capitalize="">
</div><!-- end ngIf: data == '' || (data.messageError!='email-empty' && data.messageError!='email-empty-error') -->
<!-- formulario para solicitar nueva password con fecha nacimiento y nif (el usuario NO tiene email asociado) -->
<!-- ngIf: data != '' && (data.messageError=='email-empty' || data.messageError=='email-empty-error') -->
</div>
</div><!-- end ngIf: !RESET_PASSWORD_SHOW_SMS -->
<!-- Mensaje de success al seleccionar el reset por email -->
<div data-ng-show="data != ''" class="">
<div data-ng-show="data.message" class="ng-hide">
<h3 data-ng-bind="i18n.t(data.message)" class="ng-binding">Undefined translation: undefined</h3>
<p data-ng-bind="i18n.t(data.message2)" class="ng-binding">Undefined translation: undefined</p>
<p data-ng-bind="i18n.t(data.messageNote)" class="ng-binding">Undefined translation: undefined</p>
</div>
</div>
<div data-ng-show="showContactFormRedirect" class="ng-hide">
<p data-ng-bind="i18n.t('zzz05.recover-password.can.not.contact')" class="sag-modal-text ng-binding">¡Parece que no podemos contactar contigo!</p>
<p data-ng-bind="i18n.t('zzz05.recover-password.refill.form')" class="sag-modal-text ng-binding">Por favor, rellena este formulario para que podamos ayudarte.</p>
<p>
<a href="/contacto/alsaplus" class="sag-modal-text d-flex align-items-center">
<span class="c-icn--form">
<i class="icn-check-c"></i>
<span class="c-icn--form__lines"></span>
</span>
<span data-ng-bind="i18n.t('zzz05.recover-password.contact.alsaplus')" class="ng-binding">Contacto Alsa Plus</span>
</a>
</p>
<p class="text-right mb-0">
<button type="button" class="btn btn-primary" data-dismiss="modal" data-ng-click="updateShowContactFormRedirect(false)">
<span data-ng-bind="i18n.t('general.navigation.close')" class="ng-binding">Cerrar</span>
</button>
</p>
</div>
<!-- Formulario para rellenar el codigo de verificacion recibido por SMS -->
<div data-ng-show="sendSmsData != '' && verificatedCodeData == ''" class="ng-hide">
<!-- <object data="sms-verification-code-form.html"></object> -->
<p class="sag-modal-text ng-binding" data-ng-bind="i18n.t('zzz05.recover-password.verify.sms.message')">Si tus datos son correctos, recibirás un sms con un código de acceso de un sólo uso</p>
<p class="recover-pass__verify-sms-text"><strong data-ng-bind="i18n.t('zzz05.recover-password.verify.sms')" class="ng-binding">Código de verificación recibido</strong></p>
<data-ng-form role="form" name="checkVerificationCodeForm" data-ng-model="formCheckVerificationCode" novalidate="" data-isolate-form="" class="ng-pristine ng-invalid ng-invalid-required">
<div class="row mx-0">
<div class="recover-pass__digit-container d-flex mb-3 col-md-6 col-md-offset-3 px-0">
<input class="digit-input recover-pass__digit-input ng-pristine ng-invalid ng-invalid-required" type="text" id="userVerificationCode1" name="userVerificationCode1"
data-ng-model="formCheckVerificationCode.userVerificationCode1" pattern="/^[0-9]$/" maxlength="1" required="" autocomplete="off" data-ng-keydown="handleKeyDown($event, 1)">
<input class="digit-input recover-pass__digit-input ng-pristine ng-invalid ng-invalid-required" type="text" id="userVerificationCode2" name="userVerificationCode2"
data-ng-model="formCheckVerificationCode.userVerificationCode2" pattern="/^[0-9]$/" maxlength="1" required="" autocomplete="off" data-ng-keydown="handleKeyDown($event, 2)">
<input class="digit-input recover-pass__digit-input ng-pristine ng-invalid ng-invalid-required" type="text" id="userVerificationCode3" name="userVerificationCode3"
data-ng-model="formCheckVerificationCode.userVerificationCode3" pattern="/^[0-9]$/" maxlength="1" required="" autocomplete="off" data-ng-keydown="handleKeyDown($event, 3)">
<input class="digit-input recover-pass__digit-input ng-pristine ng-invalid ng-invalid-required" type="text" id="userVerificationCode4" name="userVerificationCode4"
data-ng-model="formCheckVerificationCode.userVerificationCode4" pattern="/^[0-9]$/" maxlength="1" required="" autocomplete="off" data-ng-keydown="handleKeyDown($event, 4)">
<input class="digit-input recover-pass__digit-input ng-pristine ng-invalid ng-invalid-required" type="text" id="userVerificationCode5" name="userVerificationCode5"
data-ng-model="formCheckVerificationCode.userVerificationCode5" pattern="/^[0-9]$/" maxlength="1" required="" autocomplete="off" data-ng-keydown="handleKeyDown($event, 5)">
<input class="digit-input recover-pass__digit-input ng-pristine ng-invalid ng-invalid-required" type="text" id="userVerificationCode6" name="userVerificationCode6"
data-ng-model="formCheckVerificationCode.userVerificationCode6" pattern="/^[0-9]$/" maxlength="1" required="" autocomplete="off" data-ng-keydown="handleKeyDown($event, 6)">
</div>
</div>
<div data-ng-show="dataVerificationCode != '' || sendSmsData != ''" class="mb-3">
<div data-ng-show="dataVerificationCode.remainingAttempts" class="error-container ng-hide">
<small data-ng-bind="i18n.t('zzz05.reset-password.retries.left1') + ' ' + dataVerificationCode.remainingAttempts + i18n.t('zzz05.reset-password.retries.left2')" class="error-message ng-binding">Código de verificación
erróneo, te queda/n intento/s.</small>
</div>
<div data-ng-show="dataVerificationCode.message || sendSmsData.message" class="error-container ng-hide">
<small data-ng-bind="dataVerificationCode.message || sendSmsData.message" class="error-message ng-binding"></small>
</div>
</div>
<div class="text-right">
<button type="button" class="btn btn-lg btn-primary mt-3" data-ng-click="checkVerificationCode()">
<span data-ng-bind="i18n.t('ok')" class="ng-binding">Aceptar</span>
</button>
</div>
<!-- ngIf: showResendSMS -->
</data-ng-form>
</div>
<div data-ng-show="verificatedCodeData != '' && passwordResetMessage == ''" class="ng-hide">
<!-- <object data="reset-password-form.html"></object>-->
<!-- Formulario de reset de contraseña -->
<p class="sag-modal-text ng-binding" data-ng-bind="i18n.t('zzz01.alsaplus.change-password')">Cambiar contraseña</p>
<data-ng-form role="form" name="passwordResetForm" data-ng-model="passwordResetForm" novalidate="" data-isolate-form="" class="ng-pristine ng-invalid ng-invalid-required ng-invalid-pattern">
<div class="new-pass-form">
<div class="form-group">
<label data-ng-bind="i18n.t('busplus.profile.password.new')" class="ng-binding">Nueva contraseña</label>
<div class="input-with-icon">
<input id="newPassword" type="password" name="newPassword" data-ng-model="passwordResetForm.newPassword" ng-pattern="/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/" required=""
class="ng-pristine ng-invalid ng-invalid-required ng-invalid-pattern">
<i class="c-password__icon icn-eye" data-ng-class="showPassword ? 'icn-eye c-password__icon--slash' : 'icn-eye'" data-ng-click="showPassword = !showPassword"></i>
</div>
<div class="error-container ng-hide" data-ng-show="showErrorMessage(passwordResetForm.newPassword)">
<small class="error-message ng-binding" data-ng-show="passwordResetForm.newPassword.$error.required" data-ng-bind="i18n.t('validation.required-field')">Campo requerido.</small>
</div>
</div>
<div class="form-group">
<label data-ng-bind="i18n.t('busplus.profile.password.new.repeat')" class="ng-binding">Confirmar la nueva contraseña</label>
<div class="input-with-icon">
<input id="newPasswordRepeat" type="password" name="newPasswordRepeat" data-ng-model="passwordResetForm.newPasswordRepeat" ng-pattern="/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/" required=""
class="ng-pristine ng-invalid ng-invalid-required ng-invalid-pattern">
<i class="c-password__icon icn-eye" data-ng-class="showPasswordRepeat ? 'icn-eye c-password__icon--slash' : 'icn-eye'" data-ng-click="showPasswordRepeat = !showPasswordRepeat"></i>
</div>
<div class="error-container ng-hide" data-ng-show="showErrorMessage(passwordResetForm.newPasswordRepeat)">
<small class="error-message ng-binding" data-ng-show="passwordResetForm.newPasswordRepeat.$error.required" data-ng-bind="i18n.t('validation.required-field')">Campo requerido.</small>
</div>
</div>
<div class="error-container ng-hide" data-ng-show="resetPasswordData.passwordPatternError">
<small class="error-message ng-binding" data-ng-bind="i18n.t('zzz05.validation.password.secure')">Introduce una contraseña segura: al menos 8 caracteres que incluyan una mayúscula, una minúscula y un número.</small>
</div>
<div class="error-container">
<small class="error-message ng-binding ng-hide" data-ng-show="resetPasswordData.passwordMismatchError" data-ng-bind="i18n.t('validation.not-match')">Los campos no coinciden</small>
</div>
</div>
<div class="recover-pass-button button-blue text-right">
<button data-ng-click="resetPassword()" type="submit" class="btn btn-primary ng-binding" data-ng-bind="i18n.t('ok')">Aceptar</button>
</div>
</data-ng-form>
</div>
<div data-ng-show="passwordResetMessage != ''" class="">
<p class="sag-modal-text ng-binding" data-ng-bind="i18n.t(passwordResetMessage)">Undefined translation: undefined</p>
<p class="text-right mb-0">
<button type="button" class="btn btn-primary ng-binding" data-dismiss="modal" data-ng-bind="i18n.t('ok')">Aceptar</button>
</p>
</div>
</div>
<div class="sag-modal-footer">
<div class="recover-pass-button button-blue">
<!-- ngIf: (data == '' && sendSmsData == '' && !showContactFormRedirect) || (sendSmsData == '' && !data.message && data.messageError!='email-empty' && data.messageError!='email-empty-error' && !showContactFormRedirect) -->
<!-- ngIf: data != '' && (data.messageError=='email-empty' || data.messageError=='email-empty-error') -->
<div data-ng-show="data != '' && data.message" class="ng-hide">
<button type="button" class="btn btn-primary mb-3 ng-binding" data-dismiss="modal" data-ng-bind="i18n.t('ok')">Aceptar</button>
</div>
<!-- ngIf: (data == '' || data.messageError) && sendSmsData == '' && verificatedCodeData == '' && !showContactFormRedirect -->
</div>
</div>
</div>
<!-- /.modal-content -->
</data-ng-form>
</div>
<!-- /.modal-dialog -->
</div>
<!-- /.modal -->
</data-sag-alsa-recover-password>
</div>
</div><!-- end ngIf: !isThirdStep() -->
</div>
</div>
<!-- Esta parte no debe ser visible en el paso 3, ni cuando se mostrando tambien la pagina de registro -->
<!-- ngIf: !isThirdStep() && !isRenderModeBoth -->
<div data-ng-if="!isThirdStep() && !isRenderModeBoth" class="form-row row login-register ng-scope">
<div class="form-group col-xs-12" ng-class="{'col-md-6 col-md-offset-3': !isPopupLogin}">
<span class="link-register">
<strong class="link-register-slogan">¿No eres cliente Alsa Plus?</strong>
<a href="https://www2.alsaferrol.es/web/bus/alsaplus-login/registro?p_p_id=BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_IMjszzHEduc8&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_auth=jcfyrB2f">Regístrate</a>
</span>
</div>
</div><!-- end ngIf: !isThirdStep() && !isRenderModeBoth --><!-- row -->
<!-- Esta parte no debe ser visible en el paso 3 - Fin -->
</fieldset>
</form>
Name: _BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_loginGoogleForm — POST https://www2.alsaferrol.es/web/bus/home?p_p_id=BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_javax.portlet.action=busplusLoginGoogleAction&p_auth=cgOVEeUd
<form class="form ng-pristine ng-valid" id="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_loginGoogleForm" name="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_loginGoogleForm" method="post"
action="https://www2.alsaferrol.es/web/bus/home?p_p_id=BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_javax.portlet.action=busplusLoginGoogleAction&p_auth=cgOVEeUd"
enctype="application/x-www-form-urlencoded" novalidate="">
<input type="hidden" id="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_credential" name="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_credential">
<input type="hidden" name="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_postLoginRedirect" id="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_postLoginRedirect" value="">
<input type="hidden" name="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_postLoginRedirectUrl" id="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_postLoginRedirectUrl" value="">
<input type="hidden" name="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_googleRememberLogin" id="_BusplusLoginPortlet_WAR_Alsaportlet_INSTANCE_utilityMiscLogin_googleRememberLogin">
</form>
Name: journeySearchForm — POST https://www2.alsaferrol.es/web/bus/checkout?p_p_id=PurchasePortlet_WAR_Alsaportlet&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&_PurchasePortlet_WAR_Alsaportlet_javax.portlet.action=searchJourneysAction&p_auth=cgOVEeUd
<form name="journeySearchForm" id="journeySearchForm"
action="https://www2.alsaferrol.es/web/bus/checkout?p_p_id=PurchasePortlet_WAR_Alsaportlet&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&_PurchasePortlet_WAR_Alsaportlet_javax.portlet.action=searchJourneysAction&p_auth=cgOVEeUd"
data-ng-submit="false" aria-label="Buscador" method="post" role="form" class="ng-pristine ng-invalid ng-invalid-required" novalidate="novalidate">
<div id="journeySearchDivContainer" class="search-general new-search" data-test-id="journeySearchDivContainer" data-ng-view="">
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_code" name="code" value="">
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_serviceType" name="serviceType" value="">
<input type="hidden" value="0" name="accessible">
<style>
@media (min-width: 768px) {
input::-webkit-calendar-picker-indicator,
input::-webkit-inner-spin-button {
display: none;
}
input[name="numPassengers"] {
cursor: pointer !important;
}
#journeySearchForm button {
border: none;
border-radius: 0;
padding: 0;
color: #363738;
background: none;
width: 100%;
}
}
</style>
<script type="text/javascript">
i18n.addTranslation("zz22.accessibility.field.required", "Campo obligatorio");
params["ajaxUpdateFavoriteStation"] =
'https://www2.alsaferrol.es/web/bus/home?p_p_id=JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=AjaxUpdateFavoriteStation&p_p_cacheability=cacheLevelPage';
i18n.addTranslation("zzz06.favorite-stations.error.generic", 'Ha ocurrido un error, inténtalo más tarde');
i18n.addTranslation("zzz06.favorite-stations.error.max-origins", 'Has alcanzado el máximo de orígenes favoritos');
i18n.addTranslation("zzz06.favorite-stations.error.max-destinations", 'Has alcanzado el máximo de destinos favoritos');
i18n.addTranslation("zz17.journey.passengerType.ADULT.comment", 'De 26 a 59 años');
i18n.addTranslation("zz13.journey.passengerType.YOUNG.comment", 'De 12 a 25 años');
i18n.addTranslation("zz13.journey.passengerType.SENIOR.comment", 'Más de 60 años');
i18n.addTranslation("zz13.journey.passengerType.CHILD.comment", 'De 4 a 11 años');
i18n.addTranslation("zz13.journey.passengerType.BABY.comment", 'Hasta los 3 años');
i18n.addTranslation("zzz06.journey.passengerType.ADULT.busnautic-comment", 'De 30 a 64 años');
i18n.addTranslation("zzz06.journey.passengerType.YOUNG.busnautic-comment", 'De 7 a 29 años');
i18n.addTranslation("zzz06.journey.passengerType.SENIOR.busnautic-comment", 'Más de 65 años');
i18n.addTranslation("zzz06.journey.passengerType.CHILD.busnautic-comment", 'De 4 a 6 años');
i18n.addTranslation("zzz06.journey.passengerType.BABY.busnautic-comment", 'De 1 a 3 años');
// WA-6094
params["isInitiallyBusNautic"] = 'false'
params["busNauticDestinations"] = ["10529", "10528"]
</script>
<div style="left: -9999px; position: absolute; color: #fff">
<!-- LISTADO DE ERRORES ACCESIBLE -->
<!-- Origen -->
<!-- ngIf: showErrorMessage(journeySearchForm.originStationNameId) && !origen -->
<!-- Destino -->
<!-- ngIf: showErrorMessage(journeySearchForm.destinationStationNameId) && !destino -->
<!-- Fecha Ida -->
<!-- ngIf: (showErrorMessage(journeySearchForm._departureDate) && journeySearchForm.originStationNameId.$valid && journeySearchForm.destinationStationNameId.$valid) && !ida -->
<!-- Fecha Vuelta -->
<!-- ngIf: (showErrorMessage(journeySearchForm._returnDate) && (journeySearchForm._departureDate.$valid && journeySearchForm.destinationStationNameId.$valid)
&& (!$scope.search.travelType.open_return && !$scope.search.travelType.outward) && !vuelta) -->
</div>
<!-- Modal journeyNotAvailableNowModal -->
<div class="sag-modal sag-modal--youngPromo fade" id="journeyNotAvailableNowModal" role="dialog">
<div class="sag-modal-dialog">
<div class="sag-modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true"></span><span class="sr-only">form.modal.close</span></button>
<h2>Billete no disponible en web</h2>
</div>
<div class="sag-modal-content">
<div class="sag-modal-body" id="journeyNotAvailableNowModal-desc">
<div class="row">
<div class="col-xs-12">
<p>La compra de servicios a partir de las 21:00 deberá realizarse en el bus</p>
</div>
</div>
</div>
<div class="sag-modal-footer">
<button type="button" class="btn btn-primary btn-primary-bck" data-dismiss="modal">Lo entiendo</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<div class="responsive-search" data-back-button-history="">
<div class="form-group first icn-journey-background">
<!-- Origen -->
<div id="contenedor-origen" class="col-md-12 aller-retour-responsive">
<label for="_originStationNameId_">Origen</label>
<button id="_originStationNameId_" type="button" data-ng-click="launchSlideForm($event, journeySearchForm.originStationNameId, 'origen', 'originStationNameField')"
data-ng-keypress="launchSlideForm($event, journeySearchForm.originStationNameId, 'origen', 'originStationNameField', 'letter')" aria-label="Origen. Campo obligatorio" title="Pulse para escribir el origen">
<!-- ngIf: originStationName == '' --><span data-ng-if="originStationName == ''" class="ng-scope">Escribe el origen</span><!-- end ngIf: originStationName == '' -->
<!-- ngIf: originStationName != '' -->
</button>
<input type="hidden" data-ng-model="originStationName" value="" name="originStationNameId" required="" data-same-as="previousOriginName" data-original="originStationName" readonly="readonly" disabled="disabled"
data-test-id="originStationNameLink" class="ng-pristine ng-invalid ng-invalid-required ng-valid-same-as">
<div class="error-container ng-hide" data-ng-show="showErrorMessage(journeySearchForm.originStationNameId)">
<small class="error-message" data-ng-show="journeySearchForm.originStationNameId.$error.required">Campo requerido.</small>
<small class="error-message ng-hide" data-ng-show="journeySearchForm.originStationNameId.$error.sameAs && !journeySearchForm.originStationNameId.$error.required">Origen no válido</small>
</div>
</div>
<div class="simula-screen">
<div class="form-group first animate-show-hide horizontal ng-hide origin" data-ng-show="origen == true" data-click-outside="origen">
<a class="volver icons" data-ng-click="closeSlideForm($event,'origen','originStationNameField')" data-ng-keypress="closeSlideForm($event,'origen','originStationNameField')" aria-label="Volver" tabindex="0"><span class="origen icn-arrow-left icons-color"></span></a>
<div class="col-md-12 aller-retour-responsive">
<div class="responsive-screen">
<span class="valida-input">
<input type="text" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_originStationNameId" name="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_originStationNameId"
data-ng-model="originStationName" class="form-control ng-pristine ng-valid ui-autocomplete-input" data-test-id="originStationName" role="textbox" placeholder="Escribe el origen" aria-label="Escribe el origen"
data-close-focus="_originStationNameId_" data-focus="originStationNameField" autocomplete="off">
</span>
</div>
</div>
<a class="cerrar icons visible_992" data-ng-click="closeSlideForm($event,'origen','originStationNameField')" data-ng-keypress="closeSlideForm($event,'origen','originStationNameField')" aria-label="Cerrar Escribe el origen" tabindex="0"><span class="icn-close icons-color"></span></a>
</div>
</div>
<!-- Boton switch entre origen y destino -->
<a data-ng-click="(journeySearchForm.originStationNameId.$invalid || journeySearchForm.destinationStationNameId.$invalid || disableSwitchButton)?false:switchStationsForm($event)" data-ng-keypress="(journeySearchForm.originStationNameId.$invalid || journeySearchForm.destinationStationNameId.$invalid || disableSwitchButton)?false:switchStationsForm($event)" role="link" class="icn-up-down-arrow" data-ng-class="{'disabled': disableSwitchButton}" id="angularSwitchStations" title="Intercambiar origen y destino" tabindex="0" aria-label="Intercambiar origen y destino">
<span class="ui-hidden-accessible">Intercambiar origen y destino</span>
</a>
<!-- Destino -->
<div class="col-md-12 aller-retour-responsive" id="contenedor-destino">
<label id="destinationId" for="_destinationStationNameId_">Destino</label>
<button id="_destinationStationNameId_" type="button" class="destination" data-ng-click="launchSlideForm($event, journeySearchForm.destinationStationNameId, 'destino', 'destinationStationNameField')"
data-ng-keypress="launchSlideForm($event, journeySearchForm.destinationStationNameId, 'destino', 'destinationStationNameField', 'letter')" data-ng-disabled="journeySearchForm.originStationNameId.$invalid"
aria-label="Destino. Campo obligatorio" title="Pulse para escribir el destino" disabled="disabled">
<!-- ngIf: destinationStationName == '' --><span data-ng-if="destinationStationName == ''" class="ng-scope">Escribe el destino</span><!-- end ngIf: destinationStationName == '' -->
<!-- ngIf: destinationStationName != '' -->
</button>
<input type="hidden" data-ng-model="destinationStationName" value="" name="destinationStationNameId" data-test-id="destinationStationNameLink" data-same-as="previousDestinationName" data-original="destinationStationName" readonly="readonly"
disabled="disabled" required="" class="ng-pristine ng-invalid ng-invalid-required ng-valid-same-as">
<div class="error-container ng-hide" data-ng-show="showErrorMessage(journeySearchForm.destinationStationNameId) && journeySearchForm.originStationNameId.$valid">
<small class="error-message" data-ng-show="journeySearchForm.destinationStationNameId.$error.required">Campo requerido.</small>
<small class="error-message ng-hide" data-ng-show="journeySearchForm.destinationStationNameId.$error.sameAs && !journeySearchForm.destinationStationNameId.$error.required">Destino no válido</small>
</div>
</div>
<div class="simula-screen destination-screen">
<div class="form-group first animate-show-hide horizontal ng-hide destination" data-ng-show="destino == true" data-click-outside="destino">
<a class="volver icons" data-ng-click="closeSlideForm($event,'destino','destinationStationNameField')" aria-label="Volver"><span class="icn-arrow-left icons-color"></span></a>
<div class="col-md-12 aller-retour-responsive">
<div class="responsive-screen">
<span class="valida-input">
<input type="text" placeholder="Escribe el destino" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_destinationStationNameId" class="form-control destinaton-input ng-pristine ng-valid ui-autocomplete-input"
data-test-id="destinationStationName" role="textbox" data-ng-model="destinationStationName" aria-label="Escribe el destino" data-close-focus="_destinationStationNameId_" data-focus="destinationStationNameField" autocomplete="off">
</span>
</div>
</div>
<a class="cerrar icons visible_992" data-ng-click="closeSlideForm($event,'destino','destinationStationNameField')" data-ng-keypress="closeSlideForm($event,'destino','destinationStationNameField')" aria-label="Cerrar Escribe el destino" tabindex="0"><span class="icn-close icons-color"></span></a>
</div>
</div>
<div class="alsaspam" aria-hidden="true">
<label for="alsaspam">Debes aceptar las condiciones de compra y política de privacidad*</label>
<input type="checkbox" id="alsaspam" name="alsaspam">
</div>
<!-- input hidden originId -->
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_originStationId" name="originStationId" data-ng-value="originStationId" value="">
<!-- input hidden originStationSimplifiedName -->
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_originStationSimplifiedName" name="originStationSimplifiedName" data-ng-value="originStationSimplifiedName" value="">
<!-- input hidden originStationIsMoveliaStop -->
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_originStationIsMoveliaStop" name="originStationIsMoveliaStop" data-ng-value="originStationIsMoveliaStop" value="">
<!-- input hidden destinationId -->
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_destinationStationId" name="destinationStationId" data-ng-value="destinationStationId" value="">
<!-- input hidden destinationStationSimplifiedName -->
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_destinationStationSimplifiedName" name="destinationStationSimplifiedName" data-ng-value="destinationStationSimplifiedName" value="">
<!-- input hidden destinationStationIsMoveliaStop -->
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_destinationStationIsMoveliaStop" name="destinationStationIsMoveliaStop" data-ng-value="destinationStationIsMoveliaStop" value="">
</div>
<div id="unfoldJourneySearch" data-ng-show="!journeySearchStartsUnfolded && !journeySearchActuallyUnfolded" class="boton button-blue ng-hide">
<button data-ng-disabled="journeySearchForm.originStationNameId.$invalid || journeySearchForm.destinationStationNameId.$invalid" name="unfoldJourneySearchForm" id="unfoldJourneySearchForm" data-test-id="unfoldJourneySearchForm"
class="unfoldJourneySearchForm" data-ng-click="unfoldJourneySearch($event); launchSlideForm($event, journeySearchForm._departureDate, 'ida', 'departureDateField', 'number');" disabled="disabled">
<span>Buscar por fechas</span>
</button>
</div>
<div id="secondPartJourneySearchForm" data-ng-show="journeySearchStartsUnfolded || journeySearchActuallyUnfolded" class="">
<!-- BLOQUE DE FECHAS -->
<div class="form-group second icn-calendar">
<div class="ida-vuelta">
<!-- Fecha de Ida -->
<div id="containerOutwardDate" class="col-md-6 ida disabled" data-ng-class="{'disabled':journeySearchForm.originStationNameId.$invalid || journeySearchForm.destinationStationNameId.$invalid}">
<label for="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_departureDate_bt">Fecha de ida</label>
<div data-test-id="departureDateLink">
<button id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_departureDate_bt" type="button" data-ng-disabled="journeySearchForm.originStationNameId.$invalid || journeySearchForm.destinationStationNameId.$invalid"
data-ng-click="(journeySearchForm.originStationNameId.$invalid || journeySearchForm.destinationStationNameId.$invalid)?false:launchSlideForm($event, journeySearchForm._departureDate, 'ida', 'departureDateField', 'number')"
data-ng-keypress="(journeySearchForm.originStationNameId.$invalid || journeySearchForm.destinationStationNameId.$invalid)?false:launchSlideForm($event, journeySearchForm._departureDate, 'ida', 'departureDateField', 'number')"
aria-label="Fecha de ida. 23/07/2024" title="Pulse para escribir la fecha de ida" disabled="disabled">
<!-- ngIf: departureDate == '' || departureDate == undefined -->
<!-- ngIf: departureDate != '' --><span class="icn-angle-down ng-binding ng-scope" data-ng-if="departureDate != ''" data-ng-bind="formatterDateToString(departureDate)">Mar., 23 Jul.</span><!-- end ngIf: departureDate != '' -->
</button>
<input class="departureDateNoClick ng-pristine ng-valid hasDatepicker" type="hidden" data-ng-model="departureDate" value="23/07/2024" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_departureDate"
name="departureDate" readonly="">
</div>
<div class="error-container ng-hide" data-ng-show="(showErrorMessage(journeySearchForm._departureDate) && journeySearchForm.originStationNameId.$valid && journeySearchForm.destinationStationNameId.$valid)">
<small class="error-message ng-hide" data-ng-show="journeySearchForm._departureDate.$error.required">Campo requerido.</small>
<small class="error-message ng-hide" data-ng-show="journeySearchForm._departureDate.$error.dateformat && !journeySearchForm._departureDate.$error.required">Formato de fecha incorrecto.</small>
<small class="error-message ng-hide" data-ng-show="journeySearchForm._departureDate.$error.compareDate && !journeySearchForm._departureDate.$error.required && !journeySearchForm._departureDate.$error.dateformat">Fecha
anterior a la actual.</small>
</div>
</div>
<div class="simula-screen">
<div class="form-group second date ida animate-show-hide horizontal ng-hide" data-ng-show="ida == true" data-click-outside="ida">
<a class="volver icons" data-ng-click="closeSlideForm($event,'ida')" data-ng-keypress="closeSlideForm($event,'ida')" aria-label="Volver" data-test-id="closeDepartureDateMobile" tabindex="0">
<span class="icn-arrow-left icons-color"></span>
</a>
<div class="ida-vuelta">
<div class="responsive-screen">
<span class="valida-input">
<label for="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890__departureDate_bt">Fecha de ida</label>
<input type="text" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890__departureDate_bt" name="_departureDate" data-today="" data-compare-date="" data-original="departureDate"
data-ng-disabled="CONSTANTS.RESPONSIVE_768 > windowResolution" placeholder="dd/mm/aaaa" value="23/07/2024" class="form-control ng-pristine ng-valid ng-valid-required ng-valid-compare-date" title="Formato de fecha dd/mm/aaaa"
data-date-from="" data-test-id="departureDate" data-date-to="" data-ng-model="departureDate" required="" data-close-focus="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_departureDate_bt"
data-focus="departureDateField" autocomplete="off">
</span>
</div>
</div>
<!-- ngIf: ida == true -->
</div>
</div>
<!-- Fecha de Vuelta -->
<div class="col-md-6 returnDate disabled" id="containerReturnDate"
data-ng-class="{'disabled':journeySearchForm.originStationNameId.$invalid || journeySearchForm._departureDate.$invalid || journeySearchForm.destinationStationNameId.$invalid || blockTrain || mustDestinationReturnOnSameDate, 'train':blockTrain}">
<!-- vuelta -->
<!-- ngIf: !search.travelType.open_return -->
<div data-ng-if="!search.travelType.open_return" class="ng-scope">
<label for="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890__returnDate_bt">Fecha de vuelta</label>
<button id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890__returnDate_bt" tabindex="-1" type="button" class="add-return"
data-ng-disabled="journeySearchForm.originStationNameId.$invalid || journeySearchForm.departureDate.$invalid || journeySearchForm.destinationStationNameId.$invalid || blockTrain || disabled || mustDestinationReturnOnSameDate"
data-ng-click="(journeySearchForm.originStationNameId.$invalid || journeySearchForm._departureDate.$invalid || journeySearchForm.destinationStationNameId.$invalid || blockTrain || mustDestinationReturnOnSameDate)?false:launchOpenReturn($event, 'journeySearchForm','_returnDate', 'vuelta', 'returnDateField')"
data-ng-keydown="(journeySearchForm.originStationNameId.$invalid || journeySearchForm._departureDate.$invalid || journeySearchForm.destinationStationNameId.$invalid || blockTrain || mustDestinationReturnOnSameDate)?false:launchOpenReturn($event, 'journeySearchForm','_returnDate', 'vuelta', 'returnDateField', 'number')"
data-test-id="returnDateLink" aria-label="Fecha de vuelta. " title="Pulse para escribir la fecha de vuelta" disabled="disabled">
<!-- ngIf: returnDate == '' || returnDate == undefined --><span data-ng-if="returnDate == '' || returnDate == undefined" class="ng-scope">Añadir vuelta</span><!-- end ngIf: returnDate == '' || returnDate == undefined -->
<!-- ngIf: returnDate != '' -->
</button>
</div><!-- end ngIf: !search.travelType.open_return -->
<!-- vuelta abierta -->
<!-- ngIf: search.travelType.open_return -->
<!-- "aspa" para borrar la fecha de vuelta -->
<!-- ngIf: journeySearchForm._departureDate.$valid && journeySearchForm.originStationNameId.$valid && journeySearchForm.destinationStationNameId.$valid && !search.travelType.outward && returnDate != undefined && !mustDestinationReturnOnSameDate -->
<input data-ng-model="returnDate" type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890__returnDate" name="returnDate" value="" data-date-from="" data-date-to="" readonly=""
class="ng-pristine ng-valid hasDatepicker">
<div class="error-container ng-hide" data-ng-show="(showErrorMessage(journeySearchForm._returnDate) && (journeySearchForm._departureDate.$valid && journeySearchForm.destinationStationNameId.$valid)
&& (!$scope.search.travelType.open_return && !$scope.search.travelType.outward))">
<small class="error-message ng-hide" data-ng-show="journeySearchForm._returnDate.$error.required">Campo requerido.</small>
<small class="error-message ng-hide" data-ng-show="journeySearchForm._returnDate.$error.dateformat && !journeySearchForm._returnDate.$error.required">Formato de fecha incorrecto.</small>
<small class="error-message ng-hide" data-ng-show="journeySearchForm._returnDate.$error.compareDate && !journeySearchForm._returnDate.$error.required && !journeySearchForm._returnDate.$error.dateformat">Fecha anterior
a la de salida.</small>
</div>
</div>
<div class="simula-screen">
<div class="form-group second date animate-show-hide horizontal ng-hide responsive-screen return" data-ng-show="vuelta == true" data-click-outside="vuelta">
<a class="volver icons" data-ng-click="closeSlideForm($event,'vuelta')" data-ng-keypress="closeSlideForm($event,'vuelta')" aria-label="Volver" data-test-id="closeReturnDateMobile" tabindex="0"><span class="icn-arrow-left icons-color"></span></a>
<div class="ida-vuelta">
<div class="close-date">
<span class="valida-input">
<label for="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_returnDate">Fecha de vuelta</label>
<input data-ng-model="returnDate" title="Formato de fecha dd/mm/aaaa" placeholder="dd/mm/aaaa" data-dateformat="returnDate" aria-label="Fecha de vuelta" data-ng-disabled="CONSTANTS.RESPONSIVE_768 > windowResolution" type="text"
id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_returnDate" data-compare-date="23/07/2024" data-original="returnDate" name="_returnDate" value="" data-test-id="returnDate"
class="form-control ng-pristine ng-valid-compare-date ng-valid ng-valid-required" data-date-from="" data-date-to="" data-ng-required="search.travelType.value == 'RETURN'" aria-hidden="true"
data-close-focus="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890__returnDate" data-focus="returnDateField" autocomplete="off">
</span>
</div>
</div>
<!-- ngIf: vuelta == true -->
</div>
</div>
</div>
</div>
<!-- FIN BLOQUE DE FECHAS -->
<div class="absolute-and-flex">
<div class="form-group second bloquePassengersResponsive icn-seat">
<div class="passengers iosFixed">
<a class="numPassengers" title="Pasajeros" data-ng-click="togglePassengers($event)" data-ng-keypress="togglePassengers($event)" tabindex="0" aria-label="Pasajeros: 1 Adulto (De 26 a 59 años)" data-test-id="numTotalPassengers" role="button">
<label>Pasajeros</label>
<span role="region" aria-live="polite" id="passengersDescription" class="num ng-binding" data-ng-bind="getDescriptionPassengerType()">1 Adulto (De 26 a 59 años)</span>
<span class="icn-angle-down hidden-xs hidden-sm"></span>
<span class="icn-angle-down hidden-md hidden-lg"></span>
</a>
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_locationMode" name="locationMode" value="">
<div class="error-container ng-hide" data-ng-show="journeySearchForm.numPassengers.$error.isZero">
<small class="error-message ng-hide" data-ng-show="journeySearchForm.numPassengers.$error.isZero">Campo requerido.</small>
</div>
</div>
<div class="simula-screen">
<div class="form-group second bloquePassengersResponsive animate-show-hide horizontal ng-hide responsive-screen" data-ng-show="passengerOn == true" data-click-outside="paxNum" data-test-id="passengerInputsContainer">
<div class="form-group row" id="passengersListInputs" tabindex="0" style="visibility: visible;">
<!-- ngRepeat: passengerType in passengerTypes track by $index --><!-- ngIf: passengerType.isVisible -->
<div class="passenger-type ng-scope" data-ng-repeat="passengerType in passengerTypes track by $index" data-on-finish-render="ngRepeatFinished" data-ng-init="paxIndex = $index" data-ng-if="passengerType.isVisible">
<data-sag-alsa-pax-types pax-type="passengerType.passengerType" pax-name="passengerType.passengerNameJourneySearch" pax-age="passengerType.age" pax-comment="passengerType.passengerComment" pax-is-adult="passengerType.isAdult"
pax-last-amount="passengerType.lastAmount" pax-list-index="$index" initial-root-passengers="initialPassengers" pax-constraints="" class="ng-isolate-scope">
<div class="pax-container" data-test-id="passengerType-row" id="JourneySearchPaxType_1" data-test-passenger-type="1">
<div class="col-xs-12 col-md-12 passenger d-flex align-items-center">
<div class="passenger-cal d-flex justify-content-between align-items-center">
<!-- ngIf: ( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) -->
<!-- ngIf: (numPaxType>0 && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) --><a href="#" data-ng-if="(numPaxType>0 && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) )" data-ng-click="subsPax($event)" data-ng-keypress="subsPax($event)" data-ng-keydown="keyboardController($event);" aria-label="Eliminar un Adultos" data-test-id="subsPassenger" class="simula-less-active icn-minus ng-scope" tabindex="0" role="button" aria-hidden="false"></a><!-- end ngIf: (numPaxType>0 && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) -->
<div class="passengerTypeNum ng-binding" data-ng-class="{'zero':numPaxType==0}" data-test-id="numPassengers" aria-controls="passengersDescription">1</div>
<!-- ngIf: ($root.paxTotalNum>=maxPassengers || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) -->
<!-- ngIf: ($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) --><a href="#" data-ng-if="($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) )" tabindex="0" data-ng-click="addPax($event)" data-ng-keypress="addPax($event)" data-ng-keydown="keyboardController($event);" aria-label="Añadir un Adultos" data-test-id="addPassenger" class="simula-more-active icn-plus ng-scope" role="button" aria-hidden="false"></a><!-- end ngIf: ($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) -->
</div>
<div class="passenger-text">
<label for="<portlet:namespace/>passengerType-1" class="ng-binding">Adultos</label>
<div class="passengerComment ng-binding" id="passengerComment_1">De 26 a 59 años</div>
<!-- <div class="passengerComment" id="passengerCommentInfo_{{paxType}}"></div> -->
<input type="hidden" class="input-mini form-control" name="passengerType-1" id="<portlet:namespace/>passengerType-1" value="1" data-adult="true" data-test-id="passengerType-1" title="Pasajeros de tipo Adultos. ">
</div>
</div>
</div>
</data-sag-alsa-pax-types>
</div><!-- end ngIf: passengerType.isVisible --><!-- end ngRepeat: passengerType in passengerTypes track by $index --><!-- ngIf: passengerType.isVisible -->
<div class="passenger-type ng-scope" data-ng-repeat="passengerType in passengerTypes track by $index" data-on-finish-render="ngRepeatFinished" data-ng-init="paxIndex = $index" data-ng-if="passengerType.isVisible">
<data-sag-alsa-pax-types pax-type="passengerType.passengerType" pax-name="passengerType.passengerNameJourneySearch" pax-age="passengerType.age" pax-comment="passengerType.passengerComment" pax-is-adult="passengerType.isAdult"
pax-last-amount="passengerType.lastAmount" pax-list-index="$index" initial-root-passengers="initialPassengers" pax-constraints="" class="ng-isolate-scope">
<div class="pax-container" data-test-id="passengerType-row" id="JourneySearchPaxType_4" data-test-passenger-type="4">
<div class="col-xs-12 col-md-12 passenger d-flex align-items-center">
<div class="passenger-cal d-flex justify-content-between align-items-center">
<!-- ngIf: ( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) --><i data-ng-if="( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') )" title="Eliminar un Jóvenes" tabindex="-1" data-test-id="subsPassenger" class="simula-less icn-minus ng-scope" aria-hidden="true"></i><!-- end ngIf: ( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) -->
<!-- ngIf: (numPaxType>0 && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) -->
<div class="passengerTypeNum ng-binding zero" data-ng-class="{'zero':numPaxType==0}" data-test-id="numPassengers" aria-controls="passengersDescription">0</div>
<!-- ngIf: ($root.paxTotalNum>=maxPassengers || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) -->
<!-- ngIf: ($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) --><a href="#" data-ng-if="($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) )" tabindex="0" data-ng-click="addPax($event)" data-ng-keypress="addPax($event)" data-ng-keydown="keyboardController($event);" aria-label="Añadir un Jóvenes" data-test-id="addPassenger" class="simula-more-active icn-plus ng-scope" role="button" aria-hidden="false"></a><!-- end ngIf: ($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) -->
</div>
<div class="passenger-text">
<label for="<portlet:namespace/>passengerType-4" class="ng-binding">Jóvenes</label>
<div class="passengerComment ng-binding" id="passengerComment_4">De 12 a 25 años</div>
<!-- <div class="passengerComment" id="passengerCommentInfo_{{paxType}}"></div> -->
<input type="hidden" class="input-mini form-control" name="passengerType-4" id="<portlet:namespace/>passengerType-4" value="0" data-adult="true" data-test-id="passengerType-4" title="Pasajeros de tipo Jóvenes. ">
</div>
</div>
</div>
</data-sag-alsa-pax-types>
</div><!-- end ngIf: passengerType.isVisible --><!-- end ngRepeat: passengerType in passengerTypes track by $index --><!-- ngIf: passengerType.isVisible -->
<div class="passenger-type ng-scope" data-ng-repeat="passengerType in passengerTypes track by $index" data-on-finish-render="ngRepeatFinished" data-ng-init="paxIndex = $index" data-ng-if="passengerType.isVisible">
<data-sag-alsa-pax-types pax-type="passengerType.passengerType" pax-name="passengerType.passengerNameJourneySearch" pax-age="passengerType.age" pax-comment="passengerType.passengerComment" pax-is-adult="passengerType.isAdult"
pax-last-amount="passengerType.lastAmount" pax-list-index="$index" initial-root-passengers="initialPassengers" pax-constraints="" class="ng-isolate-scope">
<div class="pax-container" data-test-id="passengerType-row" id="JourneySearchPaxType_5" data-test-passenger-type="5">
<div class="col-xs-12 col-md-12 passenger d-flex align-items-center">
<div class="passenger-cal d-flex justify-content-between align-items-center">
<!-- ngIf: ( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) --><i data-ng-if="( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') )" title="Eliminar un Mayores" tabindex="-1" data-test-id="subsPassenger" class="simula-less icn-minus ng-scope" aria-hidden="true"></i><!-- end ngIf: ( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) -->
<!-- ngIf: (numPaxType>0 && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) -->
<div class="passengerTypeNum ng-binding zero" data-ng-class="{'zero':numPaxType==0}" data-test-id="numPassengers" aria-controls="passengersDescription">0</div>
<!-- ngIf: ($root.paxTotalNum>=maxPassengers || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) -->
<!-- ngIf: ($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) --><a href="#" data-ng-if="($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) )" tabindex="0" data-ng-click="addPax($event)" data-ng-keypress="addPax($event)" data-ng-keydown="keyboardController($event);" aria-label="Añadir un Mayores" data-test-id="addPassenger" class="simula-more-active icn-plus ng-scope" role="button" aria-hidden="false"></a><!-- end ngIf: ($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) -->
</div>
<div class="passenger-text">
<label for="<portlet:namespace/>passengerType-5" class="ng-binding">Mayores</label>
<div class="passengerComment ng-binding" id="passengerComment_5">Más de 60 años</div>
<!-- <div class="passengerComment" id="passengerCommentInfo_{{paxType}}"></div> -->
<input type="hidden" class="input-mini form-control" name="passengerType-5" id="<portlet:namespace/>passengerType-5" value="0" data-adult="true" data-test-id="passengerType-5" title="Pasajeros de tipo Mayores. ">
</div>
</div>
</div>
</data-sag-alsa-pax-types>
</div><!-- end ngIf: passengerType.isVisible --><!-- end ngRepeat: passengerType in passengerTypes track by $index --><!-- ngIf: passengerType.isVisible -->
<div class="passenger-type ng-scope" data-ng-repeat="passengerType in passengerTypes track by $index" data-on-finish-render="ngRepeatFinished" data-ng-init="paxIndex = $index" data-ng-if="passengerType.isVisible">
<data-sag-alsa-pax-types pax-type="passengerType.passengerType" pax-name="passengerType.passengerNameJourneySearch" pax-age="passengerType.age" pax-comment="passengerType.passengerComment" pax-is-adult="passengerType.isAdult"
pax-last-amount="passengerType.lastAmount" pax-list-index="$index" initial-root-passengers="initialPassengers" pax-constraints="" class="ng-isolate-scope">
<div class="pax-container" data-test-id="passengerType-row" id="JourneySearchPaxType_2" data-test-passenger-type="2">
<div class="col-xs-12 col-md-12 passenger d-flex align-items-center">
<div class="passenger-cal d-flex justify-content-between align-items-center">
<!-- ngIf: ( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) --><i data-ng-if="( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') )" title="Eliminar un Niños" tabindex="-1" data-test-id="subsPassenger" class="simula-less icn-minus ng-scope" aria-hidden="true"></i><!-- end ngIf: ( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) -->
<!-- ngIf: (numPaxType>0 && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) -->
<div class="passengerTypeNum ng-binding zero" data-ng-class="{'zero':numPaxType==0}" data-test-id="numPassengers" aria-controls="passengersDescription">0</div>
<!-- ngIf: ($root.paxTotalNum>=maxPassengers || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) -->
<!-- ngIf: ($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) --><a href="#" data-ng-if="($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) )" tabindex="0" data-ng-click="addPax($event)" data-ng-keypress="addPax($event)" data-ng-keydown="keyboardController($event);" aria-label="Añadir un Niños" data-test-id="addPassenger" class="simula-more-active icn-plus ng-scope" role="button" aria-hidden="false"></a><!-- end ngIf: ($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) -->
</div>
<div class="passenger-text">
<label for="<portlet:namespace/>passengerType-2" class="ng-binding">Niños</label>
<div class="passengerComment ng-binding" id="passengerComment_2">De 4 a 11 años</div>
<!-- <div class="passengerComment" id="passengerCommentInfo_{{paxType}}"></div> -->
<input type="hidden" class="input-mini form-control" name="passengerType-2" id="<portlet:namespace/>passengerType-2" value="0" data-adult="false" data-test-id="passengerType-2" title="Pasajeros de tipo Niños. ">
</div>
</div>
</div>
</data-sag-alsa-pax-types>
</div><!-- end ngIf: passengerType.isVisible --><!-- end ngRepeat: passengerType in passengerTypes track by $index --><!-- ngIf: passengerType.isVisible -->
<div class="passenger-type ng-scope" data-ng-repeat="passengerType in passengerTypes track by $index" data-on-finish-render="ngRepeatFinished" data-ng-init="paxIndex = $index" data-ng-if="passengerType.isVisible">
<data-sag-alsa-pax-types pax-type="passengerType.passengerType" pax-name="passengerType.passengerNameJourneySearch" pax-age="passengerType.age" pax-comment="passengerType.passengerComment" pax-is-adult="passengerType.isAdult"
pax-last-amount="passengerType.lastAmount" pax-list-index="$index" initial-root-passengers="initialPassengers" pax-constraints="" class="ng-isolate-scope">
<div class="pax-container" data-test-id="passengerType-row" id="JourneySearchPaxType_3" data-test-passenger-type="3">
<div class="col-xs-12 col-md-12 passenger d-flex align-items-center">
<div class="passenger-cal d-flex justify-content-between align-items-center">
<!-- ngIf: ( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) --><i data-ng-if="( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') )" title="Eliminar un Bebés" tabindex="-1" data-test-id="subsPassenger" class="simula-less icn-minus ng-scope" aria-hidden="true"></i><!-- end ngIf: ( numPaxType<=0 || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) -->
<!-- ngIf: (numPaxType>0 && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) -->
<div class="passengerTypeNum ng-binding zero" data-ng-class="{'zero':numPaxType==0}" data-test-id="numPassengers" aria-controls="passengersDescription">0</div>
<!-- ngIf: ($root.paxTotalNum>=maxPassengers || (($root.paxTotalAdults<=0 && $root.paxTotalYoung<=0 && $root.paxTotalSenior<=0) && paxType=='3') ) -->
<!-- ngIf: ($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) --><a href="#" data-ng-if="($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) )" tabindex="0" data-ng-click="addPax($event)" data-ng-keypress="addPax($event)" data-ng-keydown="keyboardController($event);" aria-label="Añadir un Bebés" data-test-id="addPassenger" class="simula-more-active icn-plus ng-scope" role="button" aria-hidden="false"></a><!-- end ngIf: ($root.paxTotalNum<maxPassengers && ((($root.paxTotalAdults>0||$root.paxTotalYoung>0||$root.paxTotalSenior>0) && paxType=='3') || (paxType!='3') ) ) -->
</div>
<div class="passenger-text">
<label for="<portlet:namespace/>passengerType-3" class="ng-binding">Bebés</label>
<div class="passengerComment ng-binding" id="passengerComment_3">Hasta los 3 años</div>
<!-- <div class="passengerComment" id="passengerCommentInfo_{{paxType}}"></div> -->
<input type="hidden" class="input-mini form-control" name="passengerType-3" id="<portlet:namespace/>passengerType-3" value="0" data-adult="false" data-test-id="passengerType-3" title="Pasajeros de tipo Bebés. ">
</div>
</div>
</div>
</data-sag-alsa-pax-types>
</div>
<!-- end ngIf: passengerType.isVisible --><!-- end ngRepeat: passengerType in passengerTypes track by $index --><!-- ngIf: passengerType.isVisible --><!-- end ngRepeat: passengerType in passengerTypes track by $index --><!-- ngIf: passengerType.isVisible --><!-- end ngRepeat: passengerType in passengerTypes track by $index -->
<div class="passengers-buttons">
<a class="icons-color" data-ng-click="closePassengers($event);" data-ng-keypress="closePassengers($event);" tabindex="0" data-test-id="closePassengersLink">
Aceptar
</a>
</div>
</div>
</div>
</div>
</div>
<!-- ngIf: youngPromoActive -->
<div data-ng-if="youngPromoActive" class="c-journeysearch-check-young ng-scope">
<input type="checkbox" id="checkYoungPromoCode" data-ng-model="checkYoungPromoCode" data-ng-change="clickCheckYoungPromoCode(checkYoungPromoCode)" class="ng-pristine ng-valid">
<label for="checkYoungPromoCode">Verano Joven 2024 (18-30 años)</label>
</div><!-- end ngIf: youngPromoActive -->
<!-- ngIf: windowResolution >= CONSTANTS.RESPONSIVE_992 -->
<div data-ng-if="windowResolution >= CONSTANTS.RESPONSIVE_992" class="visible_992 form-group second bloque-check-combinations-responsive ng-scope">
<input id="check-all-combinations-desktop" type="checkbox" name="checkAllCombinations">
<label for="check-all-combinations-desktop" class="checkbox-altocontraste"> Todas las combinaciones </label>
</div><!-- end ngIf: windowResolution >= CONSTANTS.RESPONSIVE_992 -->
<div data-ng-show="journeySearchStartsUnfolded || journeySearchActuallyUnfolded" class="">
<script type="text/javascript">
params["AjaxPreLoadVoucherURL"] =
'https://www2.alsaferrol.es/web/bus/home?p_p_id=JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=AjaxPreLoadVoucher&p_p_cacheability=cacheLevelPage';
params["AjaxPreLoadVoucherDeleteURL"] =
'https://www2.alsaferrol.es/web/bus/home?p_p_id=JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=AjaxPreLoadVoucherDelete&p_p_cacheability=cacheLevelPage';
params["ajaxCheckYoungPromoCode"] =
'https://www2.alsaferrol.es/web/bus/home?p_p_id=JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890&p_p_lifecycle=2&p_p_state=normal&p_p_mode=view&p_p_resource_id=AjaxCheckYoungPromoCode&p_p_cacheability=cacheLevelPage';;
params["promoCodeAppliedTitle"] = 'BONO APLICADO:';
i18n.addTranslation('zzz04.busplus.promocode.preloadvoucher', 'BONO APLICADO:');
i18n.addTranslation('zzzz04.journey-search.modal-pass.tooltip.preload', '¡Hemos cargado tu bono!');
params["digitalVoucher"] = false;
</script>
<div class="promo-code">
<!-- Modal youngPromoCodeModal -->
<div class="sag-modal sag-modal--youngPromo fade" id="youngPromoCodeModal" role="dialog">
<div class="sag-modal-dialog">
<div class="sag-modal-header">
<button type="button" class="close" data-dismiss="modal" data-ng-click="unCheckYoungPromoCode()"><span aria-hidden="true"></span><span class="sr-only">form.modal.close</span></button>
<h2>Verano Joven 2024</h2>
</div>
<div class="sag-modal-content">
<div class="sag-modal-body" id="youngPromoCodeModal-desc">
<div class="row">
<div class="col-xs-12">
<p class="mb-0 text-left">Introduce tu código de registro</p>
<div class="form-group">
<input id="youngPromoCode" class="form-control input--not-label ng-pristine ng-valid" name="youngPromoCode" type="text" placeholder="JV24-XXXXXXXXX-XXXXX" data-ng-model="youngPromoCode" data-ng-init="youngPromoCodeInit()"
maxlength="20">
</div>
<p>Si no estás dado de alta recuerda que es imprescindible que te registres en <a href="https://veranojoven.transportes.gob.es/" target="_blank">veranojoven.transportes.gob.es</a></p>
<p><a href="https://veranojoven.transportes.gob.es/" target="_blank">No recuerdo mi código</a></p>
</div>
</div>
</div>
<div class="sag-modal-footer">
<button type="button" class="btn btn-primary btn-primary-bck" data-ng-click="youngPromoCodeModalAccept()">Aceptar</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- Modal youngPromoCodeErrorModal -->
<div class="sag-modal sag-modal--youngPromo fade" id="youngPromoCodeErrorModal" role="dialog">
<div class="sag-modal-dialog">
<div class="sag-modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true"></span><span class="sr-only">form.modal.close</span></button>
<h2>Verano Joven 2024</h2>
</div>
<div class="sag-modal-content">
<div class="sag-modal-body" id="youngPromoCodeErrorModal-desc">
<div class="row">
<div class="col-xs-12">
<!-- ngIf: !youngPromoCodeErrorModalMsg -->
<p data-ng-if="!youngPromoCodeErrorModalMsg" class="ng-scope">¡Parece que no estás registrado!</p><!-- end ngIf: !youngPromoCodeErrorModalMsg -->
<!-- ngIf: !youngPromoCodeErrorModalMsg -->
<p data-ng-if="!youngPromoCodeErrorModalMsg" class="ng-scope">Recuerda que es imprescindible que te des de alta en <a href="https://veranojoven.transportes.gob.es/" target="_blank">veranojoven.transportes.gob.es</a> para
acceder al descuento.</p><!-- end ngIf: !youngPromoCodeErrorModalMsg -->
<!-- ngIf: youngPromoCodeErrorModalMsg -->
</div>
</div>
</div>
<div class="sag-modal-footer">
<button type="button" class="btn btn-primary btn-primary-bck" data-dismiss="modal">Aceptar</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- popup para pedir si se quiere cargar bono -->
<!-- Código promocional/bono cargado en home y paso 1 en desktop y mobile -->
<!-- Bono cargado desde pop up -->
<div class="form-group" id="promoCodeFieldset" style="display: none;">
<p class="promotional-code">
<!-- ngIf: isBusnavidad -->
<!-- ngIf: !isBusnavidad --><span data-ng-if="!isBusnavidad" class="ng-scope">Código promocional/Bonos:</span><!-- end ngIf: !isBusnavidad -->
</p>
<span id="promoCodeLabel" class="promoCodeFieldsetCode" data-test-id="promoCodeLabel"></span>
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_promoCode" name="promoCode" value="">
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_jsonAlsaPassPassenger" name="jsonAlsaPassPassenger" value="">
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_jsonVoucherPassenger" name="jsonVoucherPassenger" value="">
<a href="#" id="promoCodeClear" class="icn-close" data-ref="promoCodeLabel" data-ref-code="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_promoCode" data-ref-alsapass-passenger="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_jsonAlsaPassPassenger" data-ref-voucher-passenger="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_jsonVoucherPassenger">
<span class="ui-hidden-accessible">Borrar</span>
</a>
<!-- TOOLTIP CUANDO SE CARGA EL BONO DESDE EL SÃ DEL POPUP-->
<div id="tooltipPromoCode" class="tooltip bottom tooltip--alsa" role="tooltip" style="opacity: 1;display: none;">
<div class="tooltip-arrow"></div>
<span class="tooltip-inner">¡Hemos cargado tu bono!</span>
</div>
</div>
<!-- Carga inicial home. Texto de codigo promocional para abrir input en home mobile, home desktop y paso 1 -->
<!-- Se descarga un código/bono con el aspa de cierre en la home y en el paso 1 con el aspa de cierre-->
<a href="#" role="button" id="promoCodeWindow" data-ref="promoCodeForm" data-url="" class="icn-discount-bg c-promo-code__link" data-test-id="promoCodeLink">
<!-- ngIf: isBusnavidad -->
<!-- ngIf: !isBusnavidad --><span data-ng-if="!isBusnavidad" class="ng-scope">Código promocional/Bonos</span><!-- end ngIf: !isBusnavidad -->
</a>
<!-- input donde meter codigo promocional en home, mobile y paso 1 de compra -->
<div id="promoCodeForm" style="display: none;">
<label for="promoCode">
<!-- ngIf: isBusnavidad -->
<!-- ngIf: !isBusnavidad --><span data-ng-if="!isBusnavidad" class="ng-scope">Código promocional/Bonos</span><!-- end ngIf: !isBusnavidad -->
</label>
<div class="input-wrapper">
<!-- ngIf: !isBusnavidad --><input type="text" id="promoCode" data-ng-if="!isBusnavidad" placeholder="Código / Bono" data-test-id="promoCodeInput" value="" class="ng-scope"><!-- end ngIf: !isBusnavidad -->
<!-- ngIf: isBusnavidad -->
<a href="#" class="icn-close" onclick="hidePromoCode()"><span class="ui-hidden-accessible">Borrar</span></a>
</div>
<a href="#" id="promoCodeChecker" class="promo-code-checker-display" data-ref="promoCode" data-fieldset="promoCodeFieldset" data-test-id="promoCodeCheckLink" role="button">
Comprobar
</a>
</div>
</div>
</div>
</div>
</div>
<input type="hidden" data-is-zero="$root.paxTotalNum" data-ng-model="$root.paxTotalNum" data-ng-value="$root.paxTotalNum" name="numPassengers" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_numPassengers"
class="ng-pristine ng-valid ng-valid-is-zero" value="1">
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_regionalZone" name="regionalZone" value="">
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_travelType" name="travelType" data-ng-value="search.travelType.value" value="OUTWARD">
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_LIFERAY_SHARED_isTrainTrip" name="LIFERAY_SHARED_isTrainTrip" data-ng-value="false" value="false">
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_LIFERAY_SHARED_isRoundTrip" name="LIFERAY_SHARED_isRoundTrip" data-ng-value="false" value="false">
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_LIFERAY_SHARED_isShipTrip" name="LIFERAY_SHARED_isShipTrip" data-ng-value="false" value="false">
<input type="hidden" id="_JourneySearchPortlet_WAR_Alsaportlet_INSTANCE_JourneySearch_21651890_LIFERAY_SHARED_destinationStationIdIcon" name="LIFERAY_SHARED_destinationStationIdIcon" data-ng-value="">
</div>
<!-- ngIf: windowResolution < CONSTANTS.RESPONSIVE_992 -->
<div id="btSearchDiv" class="boton button-blue" data-ng-show="journeySearchStartsUnfolded || journeySearchActuallyUnfolded">
<input data-ng-disabled="journeySearchForm.$invalid || journeyNotAvailableNow" data-ng-click="manageSubmit($event)" type="button" name="journeySearchFormButtonjs" value="Buscar" id="journeySearchFormButtonjs" data-test-id="submitBtn"
disabled="disabled">
</div>
<div id="journeySearchIntro" class="intro" style="display: none;"></div>
<div class="promo-code-error" style="display: none">Código promocional incorrecto: {0}</div>
</div>
<div class="sag-modal fade" id="promoCodeModal" aria-labelledby="promoCodeModal-title" aria-describedby="promoCodeModal-desc" tabindex="-1" role="dialog" data-test-id="promoCodeModal">
<div class="sag-modal-dialog">
<div class="sag-modal-header">
<button type="button" aria-label="Cerrar" class="close" data-dismiss="modal"><span aria-hidden="true"></span><span class="sr-only">Cerrar</span></button>
<h2 id="promoCodeModal-title" class="sag-modal-title">Código promocional/Bonos</h2>
</div>
<div class="sag-modal-content">
<div class="sag-modal-body" id="promoCodeModal-desc" data-test-id="modalMsg"> Código promocional incorrecto: {0} </div>
<div class="sag-modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal" data-test-id="modalDismissBtn">Cerrar</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<div class="sag-modal fade" id="promoCodeQModal" aria-labelledby="promoCodeQModal-title" aria-describedby="promoCodeQModal-desc" tabindex="-1" role="dialog" data-test-id="promoCodeQModal">
<div class="sag-modal-dialog">
<div class="sag-modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true"></span><span class="sr-only">Cerrar</span></button>
<h2 id="promoCodeQModal-title" class="sag-modal-title">Código promocional/Bonos</h2>
</div>
<div class="sag-modal-content">
<div class="sag-modal-body" id="promoCodeQModal-desc">
</div>
<div class="sag-modal-footer">
<button type="button" id="cancelQModal" class="btn btn-primary" data-dismiss="modal" data-test-id="modalDismissBtn"> Cerrar </button>
<button type="button" id="okQModal" class="btn btn-primary" data-test-id="modalAcceptBtn"> Aceptar <i id="okSpinner" class="fa fa-spinner fa-spin fa-lg hidden-spin" data-test-id="loadingInProgress"></i>
</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<div class="sag-modal fade" id="maxPassengersModal" aria-labelledby="maxPassengersModal-title" aria-describedby="maxPassengersModal-desc" role="dialog" tabindex="-1">
<div class="sag-modal-dialog">
<div class="sag-modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true"></span><span class="sr-only">Cerrar</span></button>
<h2 id="maxPassengersModal-title" class="sag-modal-title">Información</h2>
</div>
<div class="sag-modal-content">
<div class="sag-modal-body" id="maxPassengersModal-desc"> Has alcanzado el número máximo de pasajeros para una sola reserva </div>
<div class="sag-modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">Cerrar</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<div class="sag-modal fade" id="journeySearchModal" aria-labelledby="journeySearchModal-title" aria-describedby="journeySearchModal-desc" role="dialog" tabindex="-1">
<div class="sag-modal-dialog">
<div class="sag-modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true"></span><span class="sr-only">Cerrar</span></button>
<h2 id="journeySearchModal-title" class="sag-modal-title">Datos incorrectos o incompletos</h2>
</div>
<div class="sag-modal-content">
<div class="sag-modal-body" id="journeySearchModal-desc">
</div>
<div class="sag-modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">Cerrar</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
</form>
Name: hrefFm — POST #
<form action="#" aria-hidden="true" class="hide" id="hrefFm" method="post" name="hrefFm"><span></span><input hidden="" type="submit"></form>
Text Content
En Alsa utilizamos cookies, propias y de terceros, para mejorar la experiencia de usuario y mejorar nuestros servicios mediante el análisis anónimo de los hábitos de navegación. Al pulsar en «Aceptar y Cerrar», consientes la colocación de estas cookies. Pulsa el botón «Más información» para cambiar tus preferencias. Ver socios Para obtener más información sobre las cookies, lee la política de cookies de Alsa. Con tu consentimiento, nosotros y nuestros 2 socios usamos cookies o tecnologías similares para almacenar, acceder y procesar datos personales, como tus visitas a esta página web, las direcciones IP y los identificadores de cookies. Algunos socios no te piden consentimiento para procesar tus datos y se amparan en su legítimo interés comercial. Puedes retirar tu consentimiento u oponerte al procesamiento de datos según el interés legítimo en cualquier momento haciendo clic en ''Obtener más información'' o en la política de privacidad de esta página web. Nosotros y nuestros socios hacemos el siguiente tratamiento de datos:Almacenar la información en un dispositivo y/o acceder a ella , Analítica y medición, Publicidad y contenido personalizados, medición de publicidad y contenido, investigación de audiencia y desarrollo de servicios Más información →Rechazar y cerrarAceptar y cerrar CAMBIO DE LENGUAJE Español Català Français Galego English Italiano Portugues Euskara Deutsch Aceptar * Español * Català * Français * Galego * English * Italiano * Portugues * Euskara * Deutsch Español * Atención al cliente * Alsa Empresas * Alsa Empresas * Inicia Sesión ACCESO Cerrar ACCESO Iniciar sesión con GoogleIniciar sesión con Google o NIF / NIE / Pasaporte/Email* Campo requerido. Contraseña* Ver contraseña Campo requerido. Recuérdame para futuras visitas Entrar ¿Olvidaste tu contraseña? Cerrar ¿HAS OLVIDADO TU CONTRASEÑA? Escribe tu número de documento NIF,NIE, Pasaporte. Número de documento UNDEFINED TRANSLATION: UNDEFINED Undefined translation: undefined Undefined translation: undefined ¡Parece que no podemos contactar contigo! Por favor, rellena este formulario para que podamos ayudarte. Contacto Alsa Plus Cerrar Si tus datos son correctos, recibirás un sms con un código de acceso de un sólo uso Código de verificación recibido Código de verificación erróneo, te queda/n intento/s. Aceptar Cambiar contraseña Nueva contraseña Campo requerido. Confirmar la nueva contraseña Campo requerido. Introduce una contraseña segura: al menos 8 caracteres que incluyan una mayúscula, una minúscula y un número. Los campos no coinciden Aceptar Undefined translation: undefined Aceptar Aceptar ¿No eres cliente Alsa Plus? Regístrate Close TE HEMOS ENVIADO UN EMAIL... REVISA TU BANDEJA DE ENTRADA, VALIDA TU EMAIL PARA COMPLETAR EL REGISTRO ALSA PLUS. Si no encuentras el email, revisa tu bandeja de correo no deseado o spam. Close LO SENTIMOS, HA HABIDO UN ERROR AL COMPROBAR TU INVITACIÓN Por favor, solicita a tu amigo que te genere una nueva invitación. Si lo prefieres, puedes continuar con el proceso de alta en Alsa Plus, pero PERDERÁS las ventajas de ingresar por invitación. Toggle navigation * Destinos y rutas DESTINOS Y RUTAS * * RUTAS * MADRID - BARCELONA * MADRID - GRANADA * BILBAO - MADRID * MADRID - TOLEDO * MÁLAGA - GRANADA * MADRID - LISBOA * MADRID - PARÍS * MADRID - OPORTO * MÁS RUTAS * * DESTINOS * MADRID * GRANADA * BARCELONA * BILBAO * OVIEDO * PARÍS * LISBOA * BURDEOS * MÁS DESTINOS * * AEROPUERTOS * MADRID-BARAJAS T4 * MÁLAGA-COSTA DEL SOL * ALICANTE-ELCHE * BARCELONA-EL PRAT T1 * GRANADA-JAÉN * IBIZA * OPORTO-SÁ CARNEIRO * GINEBRA * MÁS AEROPUERTOS * Tu viaje TU VIAJE * * HORARIOS * ALSA, MOVILIDAD SEGURA * GESTIÓN DE BILLETES * CAMBIOS Y ANULACIONES * POLÍTICA DE CAMBIOS Y ANULACIONES * SOLICITAR FACTURA * EQUIPAJE * MOVILIDAD ACCESIBLE E INCLUSIVA * * TARIFAS Y DESCUENTOS * OFERTAS * TARIFA JOVEN DE 12 A 25 * TARIFA GRUPOS +4 * TARIFA MAYORES DE 60 * BLOQUEA EL ASIENTO DE AL LADO * * BONOS DISPONIBLES * BONOS GRATUITOS * BONOS REGIONALES HASTA 50% DTO. * A bordo A BORDO * * TIPOS DE AUTOBÚS * COMFORT * SUPRA * LOCALIZA TU BUS * * ENTRETENIMIENTO A BORDO * WIFI * ALSA RADIO * OCIO AUDIOVISUAL * * Servicios de movilidad SERVICIOS DE MOVILIDAD * * URBANOS Y METROPOLITANOS * BILBAO * JAÉN * TORREJÓN DE ARDOZ * FERROL * A CORUÑA * MURCIA * MAR MENOR - CARTAGENA * MÁS URBANOS Y METROPOLITANOS * ALSA MOBI4U * ALSA CAB * OTROS SERVICIOS * SOPORTES PUBLICITARIOS * ALSA RAIL * * REGIONALES, NACIONALES E INTERNACIONALES * REGIONALES * SERVICIO AUTOBUSES COMUNIDAD DE MADRID * CATALUÑA * ASTURIAS * CANTABRIA * COMUNIDAD VALENCIANA * MÁS REGIONALES * NACIONALES * MADRID - GUADALAJARA * MURCIA - ALMERÍA * INTERNACIONALES * PORTUGAL * ITALIA * FRANCIA * MÁS INTERNACIONALES * * ALQUILER * AUTOBUSES * COCHES CON CONDUCTOR * BODAS * OTROS EVENTOS * TURÍSTICOS * AUTOBUSES TURÍSTICOS * TREN DE FELIPE II * TRENES HISTÓRICOS * TRENES PATRIMONIO FERROVIARIO * NIEVE Y ESQUÍ * Alsa Plus ALSA PLUS * * * * Monedero MONEDERO * * * VERANO JOVEN 90% DTO. para viajar del 01/07 al 30/09 Cerrar BUSCADOR Cerrar form.modal.close BILLETE NO DISPONIBLE EN WEB La compra de servicios a partir de las 21:00 deberá realizarse en el bus Lo entiendo Origen Escribe el origen Campo requerido. Origen no válido Intercambiar origen y destino Destino Escribe el destino Campo requerido. Destino no válido Debes aceptar las condiciones de compra y política de privacidad* Buscar por fechas Fecha de ida Mar., 23 Jul. Campo requerido. Formato de fecha incorrecto. Fecha anterior a la actual. Fecha de ida Fecha de vuelta Añadir vuelta Campo requerido. Formato de fecha incorrecto. Fecha anterior a la de salida. Fecha de vuelta Pasajeros 1 Adulto (De 26 a 59 años) Campo requerido. 1 Adultos De 26 a 59 años 0 Jóvenes De 12 a 25 años 0 Mayores Más de 60 años 0 Niños De 4 a 11 años 0 Bebés Hasta los 3 años Aceptar Verano Joven 2024 (18-30 años) Todas las combinaciones form.modal.close VERANO JOVEN 2024 Introduce tu código de registro Si no estás dado de alta recuerda que es imprescindible que te registres en veranojoven.transportes.gob.es No recuerdo mi código Aceptar form.modal.close VERANO JOVEN 2024 ¡Parece que no estás registrado! Recuerda que es imprescindible que te des de alta en veranojoven.transportes.gob.es para acceder al descuento. Aceptar Código promocional/Bonos: Borrar ¡Hemos cargado tu bono! Código promocional/Bonos Código promocional/Bonos Borrar Comprobar Código promocional incorrecto: {0} Cerrar CÓDIGO PROMOCIONAL/BONOS Código promocional incorrecto: {0} Cerrar Cerrar CÓDIGO PROMOCIONAL/BONOS Cerrar Aceptar Cerrar INFORMACIÓN Has alcanzado el número máximo de pasajeros para una sola reserva Cerrar Cerrar DATOS INCORRECTOS O INCOMPLETOS Cerrar Verano Joven 90 % dto Viaja por menos de 4€ Ya disponible Bonos Gestiona tus billetes Localiza tu bus 15% de descuento si te haces Alsa Plus Date de alta como Alsa Plus en la web ¡y consigue 15% de descuento! Para obtenerlo, regístrate gratis y no te olvides de hacer clic en "Deseo recibir ofertas y descuentos personalizados..." ¡Hazte Alsa Plus! 150 becas gratuitas y contrato indefinido 150 becas gratuitas a mujeres para la obtención de los permisos de conductora de autobús (CAP+carnet D) y compromiso de contratación indefinida a jornada completa tras la aprobación de exámenes. ¡Apúntate! Alsa, Movilidad Segura En Alsa seguimos trabajando para garantizarte la máxima seguridad en cada viaje. Aplicamos estrictos protocolos de limpieza y desinfección y nuestros buses cuentan con el mejor equipamiento para que viajes seguro y tranquilo. Movilidad Segura Compensa tu huella Ahora puedes compensar la huella de carbono de tu viaje y colaborar en nuestros proyectos de reforestación para luchar contra el cambio climático. ¡Gracias por viajar en autobús! Conoce el Bosque Alsa * Tarifas y descuentos Elige entre nuestras tarifas mínima, reducida o flexible, y entre nuestros descuentos: familia numerosa, personas con discapacidad... Muévete al mejor precio. Aprovecha nuestras tarifas * Horarios Consulta todos nuestros horarios y disfruta de todas las ventajas de organizar tus rutas de autobús, conociendo las salidas de cada trayecto antes de reservar tu billete. Elige tu horario * Equipaje Puedes llevar contigo hasta 30 kilos de equipaje de forma gratuita. Y, si necesitas equipaje extra, no te preocupes, podrás añadir hasta otros 20 kilos más. Descubre más Descárgate la App Todo son ventajas: navega de forma sencilla, localiza tu bus en tiempo real, elige tu forma de pago favorita... y no imprimas tu billete, podrás mostrarlo o descargarlo en tu wallet. Google Play Apple Store Huawei App Gallery * Sobre Alsa * Gestiona tus billetes * Empleo y formación * Soportes publicitarios * Fondos públicos * Contacto * Confianza Online SÍGUENOS * * * * * * Logo Alsa * Aviso legal * Política de privacidad * Política de cookies * Condiciones de compra * Mapa web * Accesibilidad web ..... Estás usando un navegador desactualizado o muy antiguo. Te recomendamos que lo actualices o que uses un navegador más moderno. Te sugerimos navegadores como Firefox o Chrome para mejorar tu experiencia de navegación en www.alsa.es. Cerrar Sig> Julio 2024 LuMaMiJuViSáDo12345678910111213141516171819202122232425262728293031 Please ensure Javascript is enabled for purposes of website accessibility