PageSourceSearch

https://www.plainconcepts.com/wp-content/themes/plainconcepts/recursos/js/app.js?ver=1.1.49-pc20260923

js plainconcepts.com collected 2026-10-02 07:40:46 UTC 18,925 bytes, 568 lines download raw bytes

1document.addEventListener("DOMContentLoaded", function(event) {
2   
3   AOS.init();
4
5   // Buscador de la cabecera
6   let btn_buscador  = document.getElementById('abrir-buscador');
7   let form_buscador = document.getElementById('formulario-buscador');
8   if(typeof(btn_buscador) != 'undefined' && btn_buscador != null){
9      btn_buscador.addEventListener('click', function(){
10         form_buscador.classList.toggle('oculto');
11      });
12   }
13
14   let btn_buscador_m  = document.getElementById('abrir-buscador-m');
15   let form_buscador_m = document.getElementById('formulario-buscador-m');
16   if(typeof(btn_buscador_m) != 'undefined' && btn_buscador_m != null){
17      btn_buscador_m.addEventListener('click', function(){
18         form_buscador_m.classList.toggle('oculto');
19      });
20   }
21
22   // Abrir y cerrar megamenú
23   // Seleccionamos todos los botones de submenu
24   let botones_abrir_menu = document.querySelectorAll('li.item-megamenu');
25   let links_abrir_menu = document.querySelectorAll('li.item-megamenu > a');
26
27   if (botones_abrir_menu.length) {
28      botones_abrir_menu.forEach(function (boton) {
29         boton.addEventListener('click', function (evento) {
30            let isOpen = boton.classList.contains('submenu-visible');
31            cerrarEmergentes();
32            if (!isOpen) {
33               boton.classList.add('submenu-visible');
34               boton.querySelector('.contenido-submenu').classList.remove('oculto');
35            }
36            // evento.preventDefault();
37            evento.stopPropagation();
38         });
39      });
40
41      links_abrir_menu.forEach((link) => {
42         link.addEventListener('click', (evento) => {
43            evento.preventDefault();
44         });
45      });
46
47      document.addEventListener('click', function (evento) {
48         let submenus = document.querySelectorAll('.contenido-submenu');
49         let submenuButtons = document.querySelectorAll('.item-megamenu');
50         let searchForm = document.getElementById('formulario-buscador');
51         let openSearchForm = document.getElementById('abrir-buscador');
52         if( !searchForm.contains(evento.target) && !openSearchForm.contains(evento.target)){
53            searchForm.classList.add('oculto');
54         }
55
56         submenuButtons.forEach((submenuButton) => {
57            let submenu = submenuButton.querySelector('.contenido-submenu');
58            if (!submenu.contains(evento.target) && !submenuButton.contains(evento.target)) {
59               submenuButton.classList.remove('submenu-visible');
60               submenu.classList.add('oculto');
61            }
62         });
63
64      });
65   }
66
67    // Abrir y cerrar menú móvil
68    const toggleMenuBtn = document.getElementById('toggle-menu');
69    const offsetMenu = document.getElementById('offset-menu');
70    const logoCabecera = document.querySelector('.logo-cabecera');
71    const buscadorMobile = document.getElementById('formulario-buscador-m');
72    const switcherIdiomas = document.querySelector('.menu-mobile .switcher-idiomas');
73    toggleMenuBtn.addEventListener('click',  (evento) => {
74       isMenuAbierto() ? cerrarMenu() : abrirMenu();
75
76    });
77
78   // Desplegar el selector de idiomas en móvil.
79   const botonIdiomas = document.querySelector('.menu-mobile .language-icon');
80   botonIdiomas.addEventListener('click', (evento) => {
81      switcherIdiomas.classList.toggle('abierto');
82   });
83
84
85   // Cierre del menú móvil cd se redimensiona la ventana.
86    window.addEventListener('resize', function (event) {
87        if (window.innerWidth > 1024) {
88            cerrarMenu();
89        }
90    });
91
92
93   /** function
94    * Comprueba si el menú móvil está abierto
95    * @returns {boolean}
96    */
97   function isMenuAbierto(){
98        return offsetMenu.classList.contains('open');
99    }
100
101   /**
102    * Observador para ocultar la navegación del menú cuando el campo de búsqueda está abierto.
103    * @type {MutationObserver}
104    */
105   const formBusquedaObserver = new MutationObserver((mutations) => {
106      mutations.forEach((mutation) => {
107          if (mutation.attributeName === 'class') {
108             console.log('observador');
109              if (! mutation.target.classList.contains('oculto')) {
110                 offsetMenu.querySelector('nav').classList.add('oculto');
111              }else {
112                 offsetMenu.querySelector('nav').classList.remove('oculto');
113              }
114          }
115      });
116   });
117
118   formBusquedaObserver.observe(buscadorMobile, {
119         attributes: true,
120   });
121
122
123   /**
124    * Cierra el menú móvil
125    */
126   function cerrarMenu(){
127
128      offsetMenu.classList.remove('open');
129      toggleMenuBtn.classList.remove('open');
130      logoCabecera.classList.remove('oculto');
131      switcherIdiomas.classList.remove('abierto');
132      buscadorMobile.classList.add('oculto');
133      document.querySelector('body').classList.remove('overflow-hidden');
134   }
135
136   function abrirMenu(){
137      offsetMenu.classList.add('open');
138      toggleMenuBtn.classList.add('open');
139      logoCabecera.classList.add('oculto');
140      document.querySelector('body').classList.add('overflow-hidden');
141   }
142
143
144   /**
145    * Cierra todos los elementos emergentes (submenú y caja de búsqueda)
146    */
147   function cerrarEmergentes() {
148        const searchForm = document.getElementById('formulario-buscador');
149        const submenu = document.querySelectorAll('.contenido-submenu');
150        const submenuButtons = document.querySelectorAll('.item-megamenu');
151
152        if(searchForm) {
153            searchForm.classList.add('oculto');
154        }
155
156        submenu.forEach(function (submenu) {
157            submenu.classList.add('oculto');
158        });
159
160        submenuButtons.forEach((submenuButton) => {
161            submenuButton.classList.remove('submenu-visible');
162        });
163   }
164
165
166
167
168   // Slider de la cabecera (template: page-cabecera-slider.php)
169
170   // Solo se inicializa si el slider tiene la estructura completa de Swiper (.swiper-wrapper).
171   // Las cabeceras de single (case study, partner, podcast) usan .slider-cabecera sin wrapper y no son un slider real.
172   var slider_cabecera = document.querySelectorAll(".slider-cabecera .swiper-wrapper");
173
174   if(slider_cabecera.length > 0){
175
176      var swiper_cabecera = new Swiper(".slider-cabecera", {
177         slidesPerView: 1,
178         spaceBetween: 0,
179         loop: true,
180        navigation: {
181             nextEl: ".swiper-button-next-slider-cabecera",
182             prevEl: ".swiper-button-prev-slider-cabecera",
183         }
184     });      
185  
186   }
187
188   // Swiper 12 ya no recalcula el tamaño cuando terminan de cargar las imágenes (Swiper 8 lo hacía con preloadImages).
189   // Si un slider se inicializa antes de que sus imágenes tengan ancho (p. ej. galería de case study), se recalcula aquí.
190   function refrescarSwipers(){
191      document.querySelectorAll(".swiper-initialized").forEach(function(el){
192         if(el.swiper && typeof el.swiper.update === "function"){
193            el.swiper.update();
194         }
195      });
196   }
197   document.querySelectorAll(".swiper-initialized img").forEach(function(img){
198      if(!img.complete){
199         img.addEventListener("load", refrescarSwipers, { once: true });
200      }
201   });
202   window.addEventListener("load", refrescarSwipers);
203
204   var boton_submit_form_newsletter = document.querySelectorAll(".formulario-newsletter input[type='submit'], .formulario-p-contacto  input[type='submit']");
205
206   if(boton_submit_form_newsletter.length > 0){
207
208      for(var i = 0; i < boton_submit_form_newsletter.length; i++){
209
210         var texto = boton_submit_form_newsletter[i].value;
211         var parent = boton_submit_form_newsletter[i].parentNode;
212
213         var contenedor_submit = document.createElement("div");
214         contenedor_submit.classList.add("contenedor-boton-submit");
215
216         boton_submit_form_newsletter[i].value = "";
217         contenedor_submit.append(boton_submit_form_newsletter[i]);
218
219
220         var span = document.createElement("span");
221         span.classList.add("text-1");
222         span.innerHTML = texto;
223         contenedor_submit.append(span);
224
225
226         var span_2 = document.createElement("span");
227         span_2.classList.add("text-2");
228         span_2.innerHTML = texto;
229         contenedor_submit.append(span_2);
230
231         parent.append(contenedor_submit);
232         
233   
234
235
236      }
237
238
239   }
240
241
242   var galeria_c_study = document.querySelectorAll(".galeria-case-study");
243
244   if(galeria_c_study.length > 0){
245
246         for(var i = 0; i < galeria_c_study.length; i++){
247
248
249            var mouseDown = false;
250
251            var startX, scrollLeft;
252
253            var startDragging = function (e) {
254               mouseDown = true;
255               startX = e.pageX -  e.currentTarget.offsetLeft;
256               scrollLeft =  e.currentTarget.scrollLeft;
257            };
258
259            var stopDragging = function (event) {
260               mouseDown = false;
261            };
262
263            galeria_c_study[i].addEventListener('mousemove', (e) => {
264
265               e.preventDefault();
266
267               if(!mouseDown) { 
268                  return; 
269               }
270
271               var x = e.pageX -  e.currentTarget.offsetLeft;
272               var scroll = x - startX;
273               e.currentTarget.scrollLeft =  scrollLeft - scroll;
274            });
275
276            galeria_c_study[i].addEventListener('mousedown', startDragging, false);
277            galeria_c_study[i].addEventListener('mouseup', stopDragging, false);
278            galeria_c_study[i].addEventListener('mouseleave', stopDragging, false);
279         
280   }
281   }
282
283   var filtros_eventos = document.querySelectorAll(".contenedor-filtros-eventos .filtro-eventos");
284
285   if(filtros_eventos.length > 0){
286
287      for(var i = 0; i < filtros_eventos.length; i++){
288
289         filtros_eventos[i].addEventListener("click", function(ev){
290
291            for(var y = 0; y < filtros_eventos.length; y++){
292
293               filtros_eventos[y].classList.remove("seleccionado");
294
295            }
296            
297            ev.currentTarget.classList.add("seleccionado");
298
299            if(ev.currentTarget.id == "todos-eventos"){
300
301               var eventos = document.querySelectorAll(".eventos-mes .eventos .event");
302
303               if(eventos.length > 0){
304                 for(var z = 0; z < eventos.length; z++){
305                  eventos[z].classList.remove("no-mostrar");
306                 }
307               }
308
309            }
310            else{
311
312               var tipo = ev.currentTarget.id;
313               var eventos_no_mostrar = document.querySelectorAll(".eventos-mes .eventos .event:not(." + tipo +")");
314
315               if(eventos_no_mostrar.length > 0){
316                 for(var z = 0; z < eventos_no_mostrar.length; z++){
317                  eventos_no_mostrar[z].classList.add("no-mostrar");
318                 }
319               }
320
321               var eventos_mostrar = document.querySelectorAll(".eventos-mes .eventos .event." + tipo);
322               if(eventos_mostrar.length > 0){
323                  for(var z = 0; z < eventos_mostrar.length; z++){
324                     eventos_mostrar[z].classList.remove("no-mostrar");
325                  }
326                }
327               
328
329
330
331            }
332
333            var eventos_mes = document.querySelectorAll(".contenedor-eventos .eventos-mes");
334
335            if(eventos_mes.length > 0){
336
337               for(var z = 0; z < eventos_mes.length; z++){
338
339                  eventos_mes[z].querySelectorAll(".fecha-eventos .month").forEach((mes)=>{
340                     mes.classList.remove("no-mostrar");
341                  });
342
343                  var count_eventos = eventos_mes[z].querySelectorAll(".eventos .event").length;
344                  var count_eventos_no_mostrar = eventos_mes[z].querySelectorAll(".eventos .event.no-mostrar").length;
345   
346                  if(count_eventos == count_eventos_no_mostrar){
347
348                     if(eventos_mes[z].querySelectorAll(".fecha-eventos .month").length > 0){
349                        eventos_mes[z].querySelectorAll(".fecha-eventos .month").forEach((mes)=>{
350                           mes.classList.add("no-mostrar");
351                        });
352                     }
353
354                  }
355
356               }
357
358            }
359
360         });
361
362      }
363
364   }
365
366
367
368   /**
369    * Evento de scroll para la animación de la barra de progreso.
370    * @type {HTMLElement}
371    */
372   const navegacionLateral = document.getElementById("wrapper-flecha-scroll");
373
374      window.addEventListener("scroll", (ev) => {
375         if (navegacionLateral && navegacionLateral != null){
376            const currentElement = navegacionLateral.querySelector(".current");
377            const restanteElement = navegacionLateral.querySelector(".restante");
378            progressBarScroll(currentElement, restanteElement);
379         }
380         if (window.innerWidth > 1024) {
381            cerrarEmergentes();
382         }
383      });
384
385
386
387   /**
388    * Funccion para la animación de la barra de progreso en la navegación entre secciones de la home
389    * @param currentElement
390    * @param restanteElement
391    */
392   function progressBarScroll(currentElement, restanteElement) {
393      let scroll = window.scrollY;
394      let total= document.documentElement.scrollHeight - document.documentElement.clientHeight -1;
395      let current = Math.trunc((scroll * 100) / total);
396      let restant = 100 - current;
397
398      currentElement.style.height = current + "px";
399      restanteElement.style.height = restant + "px";
400
401   }
402
403   /**
404    * Crear un observador para ver cuándo se pasa de una sección a otra
405    */
406   if(navegacionLateral && navegacionLateral != null) {
407      const topArrow = navegacionLateral.querySelector(".arrow-top");
408      const bottomArrow = navegacionLateral.querySelector(".arrow-bottom");
409      const sections = document.querySelectorAll('section');
410      let scrollTopPosition = 0;
411      let scrollBottomPosition = 0;
412
413
414      const observer = new IntersectionObserver(sectionObservationCallback,
415          {
416             root: null,
417             rootMargin: '-48% 0px -48% 0px',
418             threshold: 0
419          });
420
421
422        sections.forEach(section => {
423           observer.observe(section);
424        });
425
426
427      /**
428       * Función callback que se ejecuta cuando se pasa de una sección a otra
429       * @param entries
430       */
431      function sectionObservationCallback(entries) {
432         entries.forEach(entry => {
433            if(entry.isIntersecting){
434               const navLabel = entry.target.getAttribute('data-label');
435               const currentElement = entry.target;
436
437               if(currentElement == sections[0]){
438                  topArrow.style.visibility = "hidden";
439               }else if(currentElement == sections[sections.length - 1])
440               {
441                  bottomArrow.style.visibility = "hidden";
442               }else{
443                  topArrow.style.visibility = "visible";
444                  bottomArrow.style.visibility = "visible";
445               }
446               navegacionLateral.querySelector(".label span").innerHTML = navLabel;
447               console.log('cambio de sección');
448
449               let previousElement = entry.target.previousElementSibling;
450               while (previousElement != null && previousElement.tagName != "SECTION"){
451                  previousElement = previousElement.previousElementSibling;
452
453               }
454
455               let nextElement = currentElement.nextElementSibling;
456               while (nextElement != null && nextElement.tagName != "SECTION"){
457                    nextElement = nextElement.nextElementSibling;
458               }
459
460
461               scrollTopPosition = previousElement != null ? (previousElement.offsetTop - 100): scrollTopPosition;
462               scrollBottomPosition = nextElement !=null ? (nextElement.offsetTop - 100): scrollBottomPosition;
463
464
465            }
466         });
467      }
468
469
470      topArrow.addEventListener("click", (ev) => {
471         window.scrollTo({
472            top: scrollTopPosition,
473            behavior: 'smooth'});
474      });
475
476      bottomArrow.addEventListener("click", (ev) => {
477         window.scrollTo({
478            top: scrollBottomPosition,
479            behavior: 'smooth'
480         });
481      })
482
483   }
484
485
486
487
488
489
490var boton_filtro = document.querySelectorAll(".boton-movil-filtros");
491   if(boton_filtro.length > 0){
492      
493      for(var  i = 0; i < boton_filtro.length; i++){
494
495         boton_filtro[i].addEventListener("click", (ev) => {
496            var columna_fitros = ev.currentTarget.parentElement.parentElement;
497            if(ev.currentTarget.classList.contains("btn-blog") || ev.currentTarget.classList.contains("btn-vacancy")){
498               columna_fitros = ev.currentTarget.parentElement.querySelectorAll(".columna-filtro")[0];
499            }
500            if(columna_fitros){
501               if(columna_fitros.classList.contains("filtros-abiertos-movil")){
502                  columna_fitros.classList.remove("filtros-abiertos-movil");
503               }
504               else{
505                  columna_fitros.classList.add("filtros-abiertos-movil");
506               }
507            }
508
509         });
510
511      }
512
513   }
514 /*Resaltar el botón Clear filtros al seleccionar un filtro*/
515   const filtros = document.querySelectorAll('.item-filtro');
516   const btn_limpiar = document.querySelector('.limpiar-filtros');
517
518   if (btn_limpiar) {
519      filtros.forEach(filtro => {
520         filtro.addEventListener('click', e => {
521            btn_limpiar.classList.add('clear-resultado');
522         });
523      });
524
525      btn_limpiar.addEventListener('click', e => {
526         if (btn_limpiar.classList.contains('clear-resultado')) {
527            btn_limpiar.classList.remove('clear-resultado');
528         }
529      });
530   }
531 /**/
532
533});
534   function scrollToPost(id){
535      var element = document.getElementById(id);
536      var pos_y = element.getBoundingClientRect().top;
537      window.scrollTo(0, pos_y - 80);
538   }
539document.addEventListener("DOMContentLoaded", function() {
540   // Ocultar el segundo título "Speaker"
541   const titles = document.querySelectorAll('.cabecera-autor.bloque-speaker .titulo');
542   if (titles.length > 1) {
543      titles[1].style.display = 'none';
544   }
545   const speakers = document.querySelectorAll('.cabecera-autor.bloque-speaker');
546   // Eliminar el padding-top de 90px del segundo bloque .cabecera-autor
547   if (speakers.length > 1) {
548      speakers[1].style.paddingTop = '0';
549   }
550});
551
552 //Desabilitar formulario
553
554    document.addEventListener("DOMContentLoaded", function() {
555        const forms = document.querySelectorAll('.wpcf7');
556        forms.forEach(form => {
557           form.addEventListener('submit', event => {
558              console.log('Enviando...');
559                const formButton = form.querySelector('input[type="submit"]');
560                formButton.disabled = true;
561           })
562            form.addEventListener('wpcf7submit', event => {
563                console.log('Enviado!');
564                const formButton = form.querySelector('input[type="submit"]');
565                formButton.disabled = false;
566            });
567        });
568    });

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.