PageSourceSearch

https://idae.es/themes/custom/idae_theme/js/script.js?tm84b7

js idae.es collected 2026-10-01 10:31:56 UTC 22,429 bytes, 593 lines download raw bytes

1
2if ($('#edit-nombre').length === 0) {
3  $('fieldset[data-drupal-selector="edit-captcha"]').hide();
4}
5
6jQuery(document).ready(function () {
7
8  
9  // Selecciona el contenedor principal del formulario de taxonomía
10  var $container = jQuery('#edit-taxonomia');
11  // Inicializa una pila para manejar los contenedores de niveles anidados, comenzando con el contenedor principal
12  var levelContainersStack = [$container];
13
14  // Recorre cada elemento con la clase 'form-item' dentro del contenedor principal
15  $container.find('.form-item').each(function () {
16    var $item = jQuery(this); // El elemento actual del formulario
17
18    // Busca el input de tipo checkbox y la etiqueta asociados al elemento del formulario
19    var $input = $item.find('input[type="checkbox"]');
20    var $label = $item.find('label');
21    var text = $label.text().trim(); // Obtiene el texto de la etiqueta y elimina espacios en blanco al inicio y al final
22    var level = (text.match(/^-+/) || [''])[0].length; // Calcula el nivel de anidación contando los guiones al inicio del texto
23
24    // Limpia los guiones del texto para obtener el texto limpio
25    var cleanText = text.replace(/^-+/, '');
26
27    // Si el prefijo 'AAA_' está presente, sustituye todo el texto por '--sin temática--'
28    cleanText = /^AAA_/.test(cleanText) ? 'Sin subtema' : cleanText;
29
30    // Reconstruye el $item colocando primero el input y luego el texto limpio en un span
31    $item.empty().append($input).append(jQuery('<span>').text(cleanText));
32
33    // Ajusta la pila de contenedores para reflejar el nivel actual
34    // Si el nivel actual es menor que el tamaño de la pila, reduce la pila eliminando contenedores de niveles superiores
35    while (levelContainersStack.length > level + 1) {
36      levelContainersStack.pop();
37    }
38
39    // Si el nivel actual es más profundo que la pila, crea un nuevo contenedor para ese nivel
40    if (levelContainersStack.length <= level) {
41      var $newContainer = jQuery('<div>')
42        .addClass('level-' + level) // Asigna una clase basada en el nivel (level-0, level-1, etc.)
43        .css('margin-left', 25 + 'px'); // Establece el margen izquierdo para indicar la profundidad de anidación
44      // Agrega el nuevo contenedor al contenedor del nivel anterior
45      levelContainersStack[levelContainersStack.length - 1].append($newContainer);
46      // Añade el nuevo contenedor a la pila
47      levelContainersStack.push($newContainer);
48    }
49
50    // Añade el elemento del formulario ($item) al contenedor correspondiente del nivel actual
51    levelContainersStack[levelContainersStack.length - 1].append($item);
52  });
53
54  // Añade funcionalidad de expandir/contraer a los elementos de niveles específicos
55  jQuery('.level-1, .level-2, .level-3, .level-4, .level-5').each(function () {
56    var $container = jQuery(this); // Contenedor actual del nivel
57    var level = parseInt($container.attr('class').match(/level-(\d+)/)[1]); // Obtiene el número del nivel
58
59    // Selecciona el elemento de formulario anterior al contenedor actual
60    var $prevItem = $container.prev('.form-item');
61    if ($prevItem.length) {
62      var $input = $prevItem.find('input[type="checkbox"]'); // Encuentra el checkbox del elemento anterior
63
64      // Crea el icono de expandir/contraer y lo coloca delante del checkbox
65      var $toggleIcon = jQuery('<span class="toggle-icon">[+]</span> ');
66      $prevItem.prepend($toggleIcon);
67      $toggleIcon.css({
68        'cursor': 'pointer', // Cambia el cursor para indicar que es interactivo
69        'width': '19px' // Establece un ancho fijo para el icono
70      });
71
72      // Aplica margen izquierdo al checkbox para ajustarlo visualmente
73      $input.css('margin-left', '6px');
74
75      // Maneja el evento de clic para expandir/contraer el contenedor
76      $toggleIcon.click(function () {
77        $container.toggleClass('hidden'); // Alterna la clase 'hidden' para mostrar u ocultar el contenedor
78        $toggleIcon.text($container.hasClass('hidden') ? '[+]' : '[-]'); // Cambia el texto del icono según el estado
79      });
80
81      // Inicialmente oculta los niveles anidados
82      $container.addClass('hidden');
83    }
84  });
85});
86
87$(document).ready(function() {
88  // Selecciona los contenedores para "AUTONÓMICO" y "LOCAL"
89  const $autonomicoItem = $("#edit-ambito .form-item:has(label:contains('AUTONÓMICO'))");
90  const $localItem = $("#edit-ambito .form-item:has(label:contains('LOCAL'))");
91
92  // Crea los contenedores "level-1" y los inserta después de los items correspondientes
93  const $autonomicoContainer = $('<div class="level-1" style="margin-left: 25px;"></div>').insertAfter($autonomicoItem);
94  const $localContainer = $('<div class="level-1" style="margin-left: 25px;"></div>').insertAfter($localItem);
95
96  // Mueve los elementos al contenedor correspondiente sin duplicar los nombres especificados
97  $("#edit-elige-la-region .form-item").each(function() {
98    const $label = $(this).find("label");
99    const text = $label.text().trim();
100    const textUpper = text.toUpperCase();
101
102    // Verifica si el elemento es todo en mayúsculas o no y excluye ciertos textos
103    if (textUpper === text && text !== "AUTONÓMICO" && text !== "LOCAL" && text !== "ESTATAL") {
104      $(this).appendTo($autonomicoContainer);
105    } else if (textUpper !== text && text !== "AUTONÓMICO" && text !== "LOCAL" && text !== "ESTATAL") {
106      $(this).appendTo($localContainer);
107    }
108  });
109
110  // Limpia el contenedor original
111  $("#edit-elige-la-region--wrapper").empty();
112
113
114  // Añade funcionalidad de expandir/contraer a los elementos de niveles específicos
115  $('#edit-ambito--wrapper .level-1').each(function () {
116    const $container = jQuery(this); // Contenedor actual del nivel
117    const level = parseInt($container.attr('class').match(/level-(\d+)/)[1]); // Obtiene el número del nivel
118
119    // Selecciona el elemento de formulario anterior al contenedor actual
120    const $prevItem = $container.prev('.form-item');
121    if ($prevItem.length) {
122      const $input = $prevItem.find('input[type="checkbox"]'); // Encuentra el checkbox del elemento anterior
123
124      // Crea el icono de expandir/contraer y lo coloca delante del checkbox
125      const $toggleIcon = $('<span class="toggle-icon">[+]</span> ');
126      $prevItem.prepend($toggleIcon);
127      $toggleIcon.css({
128        'cursor': 'pointer', // Cambia el cursor para indicar que es interactivo
129        'width': '19px' // Establece un ancho fijo para el icono
130      });
131
132      // Aplica margen izquierdo al checkbox para ajustarlo visualmente
133      $input.css('margin-left', '6px');
134
135      // Maneja el evento de clic para expandir/contraer el contenedor
136      $toggleIcon.click(function () {
137        $container.toggleClass('hidden'); // Alterna la clase 'hidden' para mostrar u ocultar el contenedor
138        $toggleIcon.text($container.hasClass('hidden') ? '[+]' : '[-]'); // Cambia el texto del icono según el estado
139      });
140
141      // Inicialmente oculta los niveles anidados
142      $container.addClass('hidden');
143    }
144  });
145});
146
147
148$(document).ready(function() {
149  $('.form-checkbox').on('change', function() {
150    var $checkbox = $(this);
151    var isChecked = $checkbox.is(':checked');
152
153    // Manejar los descendientes
154    toggleDescendants($checkbox, isChecked);
155
156    // Manejar los ancestros
157    updateAncestors($checkbox);
158  });
159
160  function toggleDescendants($checkbox, isChecked) {
161    var $currentDiv = $checkbox.closest('div.checkbox');
162    var $nextElements = $currentDiv.nextAll();
163    var currentLevel = getLevel($currentDiv);
164
165    $nextElements.each(function() {
166      var $element = $(this);
167      var elementLevel = getLevel($element);
168
169      if (elementLevel <= currentLevel) {
170        // Hemos salido del ámbito de los descendientes
171        return false;
172      }
173
174      // Seleccionamos o deseleccionamos el checkbox
175      $element.find('.form-checkbox').prop('checked', isChecked);
176    });
177  }
178
179  function updateAncestors($checkbox) {
180    var $parentLevels = $checkbox.parents('div.level-1, div.level-2, div.level-3, div.level-4');
181
182    $parentLevels.each(function() {
183      var $levelDiv = $(this);
184      var $parentCheckboxDiv = $levelDiv.prevAll('div.checkbox').first();
185      var $parentCheckbox = $parentCheckboxDiv.find('.form-checkbox');
186
187      // Verificar si alguno de los hijos está seleccionado
188      var anyChildChecked = $levelDiv.find('.form-checkbox:checked').length > 0;
189
190      $parentCheckbox.prop('checked', anyChildChecked);
191    });
192  }
193
194  function getLevel($element) {
195    if ($element.hasClass('checkbox')) {
196      return parseInt($element.attr('data-level')) || 0;
197    } else if ($element.hasClass('level-1')) {
198      return 1;
199    } else if ($element.hasClass('level-2')) {
200      return 2;
201    } else if ($element.hasClass('level-3')) {
202      return 3;
203    } else if ($element.hasClass('level-4')) {
204      return 4;
205    } else {
206      return 999; // Nivel más profundo por defecto
207    }
208  }
209});
210
211jQuery(window).on("load", function () {
212
213  //@ Efecto acordeón
214  jQuery(".accordion > .title").click(function (el) {
215    jQuery(this).closest('.accordion').find(".content").slideToggle();
216    return false;
217  });
218
219
220  //@ ==========================================================================================
221  //@ PINTADO DEL MENÚ LATERAL DERECHO CON LOS MENÚ ITEMS HIJOS DEL CONTENIDO ACTUAL
222  //@ ==========================================================================================
223  //@ Para recrear este menú, se verifica qué menu está activo en el menú principal y se
224  //@ obtiene todos sus submenus, que serán añadidos a un nuevo <div> con clase "menu-lateral"
225
226  //@ Comprobar si existe el contenedor ".group-wrapper-izquierda", si no existe,
227  //@ la página no será Contenido y no habrá que pintar ningún menú lateral
228
229  if (jQuery(".group-wrapper-izquierda")) {
230    let rw = jQuery(".group-wrapper-derecha");
231    //@ Si no existe el wrapper derecho se crea manualmente y se añade al la región general
232    if (!rw) {
233      rw = jQuery('<div class="group-wrapper-derecha"></div>');
234      let generalRegion = jQuery('.general-region-content');
235      if (generalRegion) generalRegion.append(rw);
236    }
237
238    //@ Comprobar si hay menú hijo que mostrar en el menu lateral derecho y si es así,
239    //@ obtener todos sus hijos y añadirselos a un nuevo <div> ("menu-lateral")
240    if (jQuery('#block-idae-theme-main-menu .active.active-trail').last()) {
241      let children = jQuery("#block-idae-theme-main-menu .active.active-trail").last().children("ul");
242      //let children = jQuery("#block-idae-theme-main-menu .active.active-trail").children("ul");
243      if (children && children.length>0) {
244        let content = '<ul class="menu-lateral">'+children.html()+'</ul>';
245        rw.prepend(content);
246        //@ console.info("Right Menu Writed!!", content);
247      }
248    }
249
250    //@ ==========================================================================================
251    //@ FIN PINTADO MENU LATERAL
252    //@ ==========================================================================================
253  }
254  jQuery(document).ready(function () {
255    var menuZone = jQuery(".group-wrapper-derecha .menu-lateral .menu-icon.menu-icon-529");
256    if(menuZone){
257      var SectionTitle = $('<div class="field--label">Consulte</div>');
258
259      // Crear un nuevo div para añadir el texto encima del boton.
260      jQuery("<div class=\"field--label\">Consulte</div>").insertBefore(".group-wrapper-derecha .menu-lateral .menu-icon.menu-icon-529 a");
261      //Cambiamos el texto del boton, ya que viene dado de los menus, y no se puede cambiar a traves de edicion de campos.
262      jQuery(".group-wrapper-derecha .menu-lateral .menu-icon.menu-icon-529 a").addClass("subscribe-button");
263      jQuery(".group-wrapper-derecha .menu-lateral .menu-icon.menu-icon-529 a").text("Boletín de Ayudas en materia energética");
264    }
265
266    if(jQuery(".webform-submission-subscriptionform-form")){
267      var buttonEdit = $('<a class="button button--primary btn-primary btn" href="/user/login">Modificar la suscripción</a>');
268      $("button.webform-button--submit").after(buttonEdit);
269    }
270    //Añadimos el boton al lado del enviar del formulario
271
272  });
273
274  jQuery("#search-button, #menu-button").on("click", function (e) {
275    console.debug("click");
276    let targetId = jQuery(e.currentTarget).attr('id');
277    let element;
278    if (targetId === 'search-button')
279      element = jQuery("#block-idae-theme-search");
280    else
281      element = jQuery("#block-idae-theme-main-menu");
282    if (!element.hasClass('open')) {
283      closeMenus();
284      element.removeClass('closed');
285      element.addClass('open');
286    } else
287      closeMenus();
288  });
289
290  //@ jQuery("#search-button, #menu-button").click();
291
292  jQuery("#block-idae-theme-main-menu").addClass("closed");
293
294  jQuery("#block-idae-theme-main-menu").css("display", "unset");
295
296  /* xurdep: Filter Button */
297  jQuery(".filter-button").on("click", function(e) {
298    jQuery(".custom-filter-wrapper").slideToggle(500, ()=>{
299      if (jQuery(".custom-filter-wrapper").is(":visible")) {
300        jQuery(".filter-button").addClass("filtros-hide");
301      }
302      else {
303        jQuery(".filter-button").removeClass("filtros-hide");
304      }
305    });
306  });
307   jQuery(document).ready(function(){
308    jQuery('#block-views-block-modales-en-oficina-tecnica-de-energia-block-1').appendTo('#modalesoficina');
309
310    jQuery('.bloque-cols').each(function(){
311
312      var tam=jQuery(this).height();
313      //jQuery(this).parent().parent().css('height', tam);
314      var min=0;
315      jQuery(this).children().children().each(function(){
316        if(jQuery(this).height() > min){
317         jQuery(this).parent().css('min-height', jQuery(this).height()+ 'px');
318          min=jQuery(this).height();
319        }
320      });
321      jQuery(this).children().children().each(function(){
322        if( (jQuery(this).parent().hasClass('left'))||(jQuery(this).parent().hasClass('right'))) {
323         jQuery(this).css('min-height', min+ 'px');
324        }
325      });
326    });
327  });
328
329});
330
331document.addEventListener('DOMContentLoaded', function () {
332  const headers = document.querySelectorAll('.collapsible-header');
333
334  headers.forEach(header => {
335    header.addEventListener('click', function () {
336      const targetId = this.getAttribute('data-toggle');
337      const targetBody = document.getElementById(targetId);
338
339      if (!targetBody) {
340        console.error('Elemento no encontrado:', targetId);
341        return;
342      }
343
344      const allBodies = document.querySelectorAll('.collapsible-body.expanded');
345      const otherBodies = Array.from(allBodies).filter(body => body !== targetBody);
346
347      // Paso 1: cerrar todos los demás
348      otherBodies.forEach(body => {
349        body.style.height = `${body.scrollHeight}px`; // Fijamos altura antes de animar
350        requestAnimationFrame(() => {
351          body.style.height = '0';
352          body.classList.remove('expanded');
353        });
354      });
355
356      // Paso 2: esperar a que terminen de cerrarse (asumimos 800ms por el CSS)
357      setTimeout(() => {
358        // Paso 3: abrir el actual si no estaba abierto
359        if (!targetBody.classList.contains('expanded')) {
360          targetBody.style.height = '0'; // Reseteamos
361          targetBody.classList.add('expanded');
362          requestAnimationFrame(() => {
363            targetBody.style.height = `${targetBody.scrollHeight}px`;
364          });
365          /*
366          // Paso 4: scroll al encabezado
367          const offsetTop = this.getBoundingClientRect().top + window.scrollY;
368          setTimeout(() => {
369            window.scrollTo({ top: offsetTop - 20, behavior: 'smooth' });
370          }, 10); // un pelín de margen tras abrir
371          */
372        } else {
373          // Si ya estaba abierto, lo cerramos (aunque no debería pasar porque está excluido arriba)
374          targetBody.style.height = `${targetBody.scrollHeight}px`;
375          requestAnimationFrame(() => {
376            targetBody.style.height = '0';
377            targetBody.classList.remove('expanded');
378          });
379        }
380      }, 850); // igual o mayor al tiempo de transición CSS
381    });
382  });
383});
384
385function closeMenus() {
386  closeMenusAction(jQuery("#block-idae-theme-search"));
387  closeMenusAction(jQuery("#block-idae-theme-main-menu"));
388
389}
390
391function closeMenusAction(element) {
392  if(element.hasClass('open')) {
393    element.removeClass('open');
394    element.addClass('closed');
395  }
396}
397
398//@ ==========================================================================================
399//@ FUNCIONALIDAD ADDTOANY BOTONES COMPARTIR
400//@ ==========================================================================================
401
402function manageShareButtons() {
403  var timer = -1;
404  var toggle = jQuery('.collapse-btn.button.button-toggle');
405  toggle.click(function () {
406    if (toggle.hasClass("opened")) {
407      toggle.removeClass("opened");
408      toggle.addClass("closed");
409      clearTimeout(timer);
410    }
411    else {
412      toggle.removeClass("closed");
413      toggle.addClass("opened");
414      timer = setTimeout(function () {
415        toggle.click();
416      }, 5000);
417    }
418  });
419}
420
421manageShareButtons();
422/*
423document.addEventListener('DOMContentLoaded', function () {
424  // Seleccionamos todos los encabezados colapsables
425  const headers = document.querySelectorAll('.collapsible-header');
426
427  headers.forEach(header => {
428    header.addEventListener('click', function () {
429      // Obtenemos el ID del cuerpo objetivo
430      const targetId = this.getAttribute('data-toggle');
431      const targetBody = document.getElementById(targetId);
432
433      if (targetBody) {
434        // Contraemos cualquier otro cuerpo expandido
435        const allBodies = document.querySelectorAll('.collapsible-body.expanded');
436        allBodies.forEach(body => {
437          if (body !== targetBody) {
438            body.style.height = `${body.scrollHeight}px`; // Fija la altura actual antes de la transición
439            requestAnimationFrame(() => {
440              body.style.height = '0'; // Inicia la transición hacia altura 0
441              body.classList.remove('expanded');
442            });
443          }
444        });
445
446        // Alternamos el estado del cuerpo objetivo
447        if (targetBody.classList.contains('expanded')) {
448          // Colapsar el actual
449          targetBody.style.height = `${targetBody.scrollHeight}px`; // Fija la altura actual
450          requestAnimationFrame(() => {
451            targetBody.style.height = '0'; // Transición a altura 0
452            targetBody.classList.remove('expanded');
453          });
454        } else {
455          // Expandir el seleccionado
456          targetBody.style.height = '0'; // Reseteamos la altura para que la transición funcione
457          targetBody.classList.add('expanded');
458          requestAnimationFrame(() => {
459            targetBody.style.height = `${targetBody.scrollHeight}px`; // Expandir
460          });
461        }
462      } else {
463        console.error('Elemento no encontrado:', targetId);
464      }
465    });
466  });
467});
468*/
469jQuery(document).ready(function() {
470  var fechaActual = new Date();
471
472  // Establecer la fecha límite (1 de julio de 2023)
473  var fechaLimite = new Date('2023-07-15');
474
475  // Verificar si la fecha actual es posterior a la fecha límite
476  if (fechaActual > fechaLimite) {
477    return; // Detener la ejecución del código
478  }
479
480  if (jQuery('section.banner').length) {
481    var teletypeContainer = jQuery('<div class="teletype-container"></div>');
482    var teletype = jQuery('<div class="teletype"></div>');
483    var teletypeText = jQuery('<div class="teletype-text">NOVEDAD</div>');
484
485    teletype.append(teletypeText);
486    teletypeContainer.append(teletype);
487    jQuery('section.banner .colored-home-block-link').prepend(teletypeContainer);
488  }
489});
490
491
492
493
494function showEvents(dayId) {
495    // Oculta todos los contenidos
496    const tabs = document.getElementsByClassName("tab-content");
497    for (let i = 0; i < tabs.length; i++) {
498        tabs[i].style.display = "none";
499    }
500
501    // Obtener el div por su ID y verificar que exista
502    const div = document.getElementById(dayId);
503    if (!div) {
504     
505        return; // Se termina la función si no existe el div
506    }
507
508    // Buscar el <ul> dentro del div y verificar si existe
509    let numeroDeLis = 0;
510    const ul = div.querySelector('ul');
511    if (ul) {
512        const lis = ul.querySelectorAll('li');
513        numeroDeLis = lis.length;
514    } 
515
516    // Actualizar el contenido de 'day_events' solo si existe
517    const dayEventsEl = document.getElementById('day_events');
518    if (dayEventsEl) {
519        dayEventsEl.textContent = numeroDeLis + ' Eventos';
520    } 
521
522    // Muestra el contenido del día seleccionado
523    div.style.display = "block";
524}
525
526
527function showEvents2(dayNumber) {
528    // Actualiza el número del día solo si el elemento existe
529    const dayNumberEl = document.getElementById('day_number');
530    if (dayNumberEl) {
531        dayNumberEl.textContent = dayNumber;
532    }
533
534    // Calcula el día de la semana y actualiza el contenido solo si el elemento existe
535    const weekDays = [ 'Sábado', 'Domingo', 'Lunes', 'Martes', 'Miércoles','Jueves', 'Viernes'];
536    const dayOfWeek = weekDays[(dayNumber - 1) % 7];
537    const dayWeekEl = document.getElementById('day_week');
538    if (dayWeekEl) {
539        dayWeekEl.textContent = dayOfWeek;
540    }
541}
542
543
544// Añade el evento onclick a todos los tabs activos
545document.querySelectorAll('.tab').forEach(tab => {
546    tab.onclick = function() {
547        showEvents2(this.textContent.trim());
548        showEvents('day'+this.textContent.trim());
549    }
550});
551
552const hoy = new Date();
553const diaNumero = hoy.getDate();
554// showEvents2(diaNumero);
555// showEvents('day'+diaNumero);
556
557
558
559 jQuery(document).ready(function ($) {
560    $('div.field.field--name-field-ambito .field--item').each(function () {
561      if ($(this).text().trim() === 'LOCAL') {
562        $(this).hide();
563      }
564    });
565  });
566
567
568
569
570
571
572
573
574document.addEventListener('DOMContentLoaded', function() {
575  // Usar jQuery de manera segura dentro de la función
576  if (document.getElementById('genera')) {
577    jQuery(function () {
578      // Reemplazar '.flexslider' con tu selector específico si es diferente
579      jQuery('.flexslider').each(function () {
580        // Verificar si FlexSlider ya ha sido inicializado para evitar duplicados
581        if (!this.classList.contains('flexslider-initialized')) {
582          jQuery(this).flexslider({
583            animation: "slide"
584
585          });
586          this.classList.add('flexslider-initialized');
587        }
588      });
589    });
590  }
591});
592
593

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.