PageSourceSearch

https://www.cuevasdelalmanzora.es/themes/custom/meta/js/custom.js?v=10.6.14

js cuevasdelalmanzora.es collected 2026-09-25 00:30:47 UTC 37,809 bytes, 883 lines download raw bytes

1/**
2 * @file
3 * Global utilities.
4 *
5 */
6(function ($, Drupal) {
7
8  'use strict';
9
10  $(document).ready(function () {
11    $('[data-toggle="tooltip"]').tooltip();
12  });
13
14  Drupal.behaviors.header_mega_menu = {
15    attach: function (context, settings) {
16      once('header_mega_menu', 'header #block-meta-header ', context).forEach((element) => {
17        $("ul li .productos-menu").parent('li').addClass('menu-iconos');
18      })
19    }
20  };
21
22  Drupal.behaviors.radio_destacado_background = {
23    attach: function (context, settings) {
24      if ($('.l-page--pagina_gutenberg .l-page__content .block-views-blocklistado-post-home-radio-block-2 .content').children().length > 0) {
25        $('.l-page--pagina_gutenberg .l-page__content .block-views-blocklistado-post-home-radio-block-2 .content').parent().css('background-color', '#F1F3F4');
26        $('.l-page--pagina_gutenberg .l-page__content .block-views-blocklistado-post-home-radio-block-2 .content').parent().css('padding-top', '2rem')
27      }
28    }
29  };
30
31  Drupal.behaviors.search_form_radio = {
32    attach: function (context, settings) {
33      once('search_form_radio', '.l-page__before-footer-radio-domain .search-block-form #search-block-form  ', context).forEach((element) => {
34        $("#search-block-form div.form-actions").remove();
35        $("#search-block-form").append('<input type="submit" class="submit button visually-hidden" value="buscar"></input>');
36      })
37    }
38  };
39
40  Drupal.behaviors.comment_form_text = {
41    attach: function (context, settings) {
42      once('comment_form_text', '.l-page--agenda_vista_comentario .view-agenda-vista-comentario .node--type-agenda-comentarios .comments .field--name-field-comentarios article.comment .card-body .inline__links .comment-reply  ', context).forEach((element) => {
43        $(".comment-reply a").text("Responder");
44      })
45    }
46  };
47
48  Drupal.behaviors.comment_form_text_page = {
49    attach: function (context, settings) {
50      once('comment_form_text_page', '.l-page--agendas-domain #block-meta-content .comment .inline__links .comment-reply  ', context).forEach((element) => {
51        $(".comment-reply a").text("Responder");
52      })
53    }
54  };
55
56  Drupal.behaviors.search_validation_agendas = {
57    attach: function (context, settings) {
58      $('.view-busqueda-general-agendas form.views-exposed-form', context).submit(function () {
59        var box = $(this).find('.js-form-type-textfield #edit-keys');
60        var searchBox = $.trim(box.val());
61        var searchLen = searchBox.length;
62        if (searchLen < 3) {
63          searchBox = "";
64        }
65        if (searchBox != undefined && (searchBox == '' || searchBox == $(this).find('input.default-text').val())) {
66          $(this).find('.js-form-type-textfield').addClass('error');
67          if ($(this).find('.error-message')) {
68            $(this).find('.js-form-type-textfield .error-message').remove();
69          }
70          $(this).find('.js-form-type-textfield').prepend('<div class="error-message">Debe introducir 3 o mas caracteres para buscar..</div>');
71          return false;
72        } else {
73          return true;
74        }
75      })
76
77      $('.view-busqueda-interna-agendas form.views-exposed-form', context).submit(function () {
78        var box = $(this).find('.js-form-type-textfield #edit-keys');
79        var searchBox = $.trim(box.val());
80        var searchLen = searchBox.length;
81        if (searchLen < 3) {
82          searchBox = "";
83        }
84        if (searchBox != undefined && (searchBox == '' || searchBox == $(this).find('input.default-text').val())) {
85          $(this).find('.js-form-type-textfield').addClass('error');
86          if ($(this).find('.error-message')) {
87            $(this).find('.js-form-type-textfield .error-message').remove();
88          }
89          $(this).find('.js-form-type-textfield').prepend('<div class="error-message">Debe introducir 3 o mas caracteres para buscar..</div>');
90          return false;
91        } else {
92          return true;
93        }
94      })
95    }
96  };
97
98  Drupal.behaviors.search_form_order_view_radio = {
99    attach: function (context, settings) {
100      $(".l-page--pagina_gutenberg .view-id-listado_programas_home_radio .view-content .views-form form").append('<input type="submit" class="submit button visually-hidden" value="Guardar orden del Listado"></input>');
101    }
102  };
103
104  Drupal.behaviors.burger_button_radio = {
105    attach: function (context, settings) {
106      once('burger_button_radio', '.l-page__header-costas-domain header #block-meta-mainmenucostas .content .tbm-main-menu-costas', context).forEach((element) => {
107        $("button.tbm-button").append(' <span class="visually-hidden sr-only">Menú Responsive</span>');
108      })
109    }
110  };
111
112  Drupal.behaviors.search_form_sabores_header = {
113    attach: function (context, settings) {
114      once('search_form_sabores_header', '.l-page__header-sabores-domain .region-header-navegation .search-block-form #search-block-form  ', context).forEach((element) => {
115        $("#search-block-form").append('<input type="submit" class="submit button visually-hidden" value="buscar"></input>');
116      })
117    }
118  };
119
120  Drupal.behaviors.search_inputs_title = {
121    attach: function (context, settings) {
122      once('search_inputs_title', '.view-listado-de-productores .views-exposed-form .js-form-item-combine, ' +
123        '.view-busqueda-general .views-exposed-form .form-type-textfield, ' +
124        '.view-listado-de-productos .views-exposed-form .form-type-textfield ,' +
125        '.view-listado-de-hostales .views-exposed-form .form-type-textfield,' +
126        '.view-listado-de-comercios .views-exposed-form .form-type-textfield ', context).forEach((element) => {
127        $("input.form-control").attr('title', 'Palabras claves de búsqueda');
128      })
129    }
130  };
131
132  Drupal.behaviors.header_mega_menu_img = {
133    attach: function (context, settings) {
134      once('header_mega_menu_img', 'header #block-meta-header #superfish-header .menu-iconos ul ', context).forEach((element) => {
135        $('a.aceite-oliva ').prepend('<img src="/themes/custom/meta/images/png-menu/olive-oil.png" class="attachment-full size-full" alt="" loading="lazy">');
136        $('a.carnes ').prepend('<img src="/themes/custom/meta/images/png-menu/carne.png" class="attachment-full size-full" alt="" loading="lazy">');
137        $('a.frutos-secos ').prepend('<img src="/themes/custom/meta/images/png-menu/frutos-secos.png" class="attachment-full size-full" alt="" loading="lazy">');
138        $('a.cervezas ').prepend('<img src="/themes/custom/meta/images/png-menu/cerveza.png" class="attachment-full size-full" alt="" loading="lazy">');
139        $('a.conservas-confituras ').prepend('<img src="/themes/custom/meta/images/png-menu/tarro-de-mermelada.png" class="attachment-full size-full" alt="" loading="lazy">');
140        $('a.encurtidos ').prepend('<img src="/themes/custom/meta/images/png-menu/mermelada.png" class="attachment-full size-full" alt="" loading="lazy">');
141        $('a.frutas ').prepend('<img src="/themes/custom/meta/images/png-menu/comida-sana.png" class="attachment-full size-full" alt="" loading="lazy">');
142        $('a.embutidos ').prepend('<img src="/themes/custom/meta/images/png-menu/embutido.png" class="attachment-full size-full" alt="" loading="lazy">');
143        $('a.mantecados ').prepend('<img src="/themes/custom/meta/images/png-menu/mantecados.png" class="attachment-full size-full" alt="" loading="lazy">');
144        $('a.mieles ').prepend('<img src="/themes/custom/meta/images/png-menu/miel.png" class="attachment-full size-full" alt="" loading="lazy">');
145        $('a.panaderia ').prepend('<img src="/themes/custom/meta/images/png-menu/panaderia.png" class="attachment-full size-full" alt="" loading="lazy">');
146        $('a.pescados ').prepend('<img src="/themes/custom/meta/images/png-menu/pescados-y-mariscos.png" class="attachment-full size-full" alt="" loading="lazy">');
147        $('a.quesos ').prepend('<img src="/themes/custom/meta/images/png-menu/queso.png" class="attachment-full size-full" alt="" loading="lazy">');
148        $('a.salsas ').prepend('<img src="/themes/custom/meta/images/png-menu/salazones.png" class="attachment-full size-full" alt="" loading="lazy">');
149        $('a.vinos ').prepend('<img src="/themes/custom/meta/images/png-menu/vino.png" class="attachment-full size-full" alt="" loading="lazy">');
150        $('a.helados ').prepend('<img src="/themes/custom/meta/images/png-menu/helados.png" class="attachment-full size-full" alt="" loading="lazy">');
151        $('a.condimentos ').prepend('<img src="/themes/custom/meta/images/png-menu/condimentos.png" class="attachment-full size-full" alt="" loading="lazy">');
152
153      })
154    }
155  };
156
157  Drupal.behaviors.costas_mapa_home = {
158    attach: function (context, settings) {
159      $('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .js-form-type-select select option[value="All"]').hide();
160      if ($('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .js-form-type-select select').val() == "All") {
161        $('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .js-form-type-select select option[value="All"]').hide();
162        $('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .js-form-type-select select option[value="All"]').attr("selected", false);
163        $('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .js-form-type-select select option[value="playa"]').attr("selected", true);
164        $('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .form-actions .button').click();
165        $('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .form-actions .button').hide();
166      }
167    }
168  };
169
170
171  // Drupal.behaviors.submit_map = {
172  //   attach: function (context, settings) {
173  //     once('submit_map', '.l-page-gastronomia .view-id-interactive_map .view-filters', context).forEach((element) => {
174  //       var municipio = $('.form-item-field-municipio-target-id .form-select option:selected').val();
175  //       var tipo = $(".form-item-field-term-reference-target-id .form-select option:selected").val();
176  //       let args = tipo + '/' + municipio;
177  //       $.ajax({
178  //         url: '/views/ajax',
179  //         type: 'get',
180  //         data: {
181  //           view_name: 'interactive_map',
182  //           view_display_id: 'embed_1',
183  //           view_args: args,
184  //         },
185  //         dataType: 'json',
186  //         success: function (response) {
187  //           if (response[3] !== undefined) {
188  //             var viewHtml = response[3].data;
189  //             $('.l-page-gastronomia .view-id-interactive_map .groupy .view-filters').append('<div class="advanced-search"></div>');
190  //             $('.l-page-gastronomia .view-id-interactive_map .groupy .view-filters .advanced-search').append(viewHtml);
191  //           }
192  //         }
193  //       });
194  //     })
195  //   }
196  // };
197
198  // Drupal.behaviors.costas_nodos_asociados_list = {
199  //   attach: function (context, settings) {
200  //     once('costas_nodos_asociados_list', '.node--type-playa-full ', context).forEach((element) => {
201  //       var element = $(".lugares .list .elemento").detach();
202  //       $('.lugares-general .content-flex').append(element);
203  //     })
204  //   }
205  // };
206
207  Drupal.behaviors.cambiarLogoCustomCuevas = {
208    attach: (context, settings) => {
209      // Usamos once() para asegurarnos de que el cambio solo ocurra una vez
210      const umbral = 1200;
211
212      // Solo actuamos si el ancho de la ventana es mayor a 1200px
213      if (window.innerWidth > umbral) {
214        const logos = once('cambiar-logo', '.l-page--front-gutenberg-cuevas-domain .site-branding .site-logo, .l-page--cuevas-domain-listado_de_playas .site-branding .site-logo, .l-page--cuevas-domain-playa .site-branding .site-logo ,\n' +
215          '.l-page--cuevas-domain-listado_de_senderos .site-branding .site-logo, .l-page--cuevas-domain-sendero .site-branding .site-logo, .l-page--cuevas-domain-listado_lugares_de_interes .site-branding .site-logo,\n' +
216          '.l-page--cuevas-domain-lugares_de_interes .site-branding .site-logo, .l-page--cuevas-domain-listado_hospedajes .site-branding .site-logo, .l-page--cuevas-domain-hospedaje .site-branding .site-logo,\n' +
217          '.l-page--cuevas-domain-listado_donde_comer .site-branding .site-logo, .l-page--cuevas-domain-donde_o .site-branding .site-logo, .l-page--cuevas-domain-listado_de_planes .site-branding .site-logo,\n' +
218          '.l-page--cuevas-domain-planes .site-branding .site-logo, .l-page---actualidad-cuevas .site-branding .site-logo, .l-page---eventos-cuevas .site-branding .site-logo, .l-page--cuevas-domain-evento .site-branding .site-logo', context);
219
220        logos.forEach((logo) => {
221          // Definimos la nueva ruta de la imagen
222          const nuevaRuta = '/themes/custom/meta/images/logo-cuevas-blanco.png';
223
224          // Cambiamos el atributo src
225          logo.setAttribute('src', nuevaRuta);
226
227          // Opcional: imprimir en consola para verificar
228          console.log('Logo actualizado a:', nuevaRuta);
229        });
230      }
231    }
232  };
233
234  Drupal.behaviors.cambiarLogoCustom = {
235    attach: (context, settings) => {
236      // Usamos once() para asegurarnos de que el cambio solo ocurra una vez
237      const umbral = 1200;
238
239      // Solo actuamos si el ancho de la ventana es mayor a 1200px
240      if (window.innerWidth > umbral) {
241        const logos = once('cambiar-logo', '.l-page--front-gutenberg-benahadux-domain .site-branding .site-logo', context);
242
243        logos.forEach((logo) => {
244          // Definimos la nueva ruta de la imagen
245          const nuevaRuta = '/themes/custom/meta/images/logo-benadux.png';
246
247          // Cambiamos el atributo src
248          logo.setAttribute('src', nuevaRuta);
249
250          // Opcional: imprimir en consola para verificar
251          console.log('Logo actualizado a:', nuevaRuta);
252        });
253      }
254    }
255  };
256
257  Drupal.behaviors.stickyMenuBenahadux = {
258    attach: function (context, settings) {
259      const umbral = 1200;
260
261      // Solo actuamos si el ancho de la ventana es mayor a 1200px
262      if (window.innerWidth > umbral) {
263        // Seleccionamos el contenedor una sola vez
264        once('stickyMenu', '.l-page--front-gutenberg-benahadux-domain .contenido', context).forEach(function (element) {
265
266          // Buscamos el logo una sola vez para no repetir la consulta al DOM en cada scroll
267          const $logo = $(element).find('.site-logo');
268          const rutaOriginal = '/themes/custom/meta/images/logo-benadux.png';
269          const rutaNegro = '/themes/custom/meta/images/logo-negro.png';
270
271          $(window).on('scroll', function () {
272            const scrollTop = $(window).scrollTop();
273
274            if (scrollTop > 100) {
275              $(element).addClass('is-fixed');
276
277              // Cambiamos el src solo si no es ya el logo negro (para optimizar)
278              if ($logo.attr('src') !== rutaNegro) {
279                $logo.attr('src', rutaNegro);
280              }
281            } else {
282              $(element).removeClass('is-fixed');
283
284              // Volvemos al logo original
285              if ($logo.attr('src') !== rutaOriginal) {
286                $logo.attr('src', rutaOriginal);
287              }
288            }
289          });
290        });
291      }
292    }
293  };
294
295  //Ayuntamiento cuevas*************************************************
296
297  Drupal.behaviors.cambiarLogoCustomAyuntCuevas = {
298    attach: (context, settings) => {
299      // Usamos once() para asegurarnos de que el cambio solo ocurra una vez
300      const umbral = 1200;
301
302      // Solo actuamos si el ancho de la ventana es mayor a 1200px
303      if (window.innerWidth > umbral) {
304        const logos = once('cambiar-logo', '.l-page--front-gutenberg-ayuntamiento-cuevas-domain .site-branding .site-logo', context);
305
306        logos.forEach((logo) => {
307          // Definimos la nueva ruta de la imagen
308          const nuevaRuta = '/themes/custom/meta/images/ayuntcuevas.png';
309
310          // Cambiamos el atributo src
311          logo.setAttribute('src', nuevaRuta);
312
313          // Opcional: imprimir en consola para verificar
314          console.log('Logo actualizado a:', nuevaRuta);
315        });
316      }
317    }
318  };
319
320  //Ayuntamiento cuevas
321  Drupal.behaviors.stickyMenuAyuntCuevas = {
322   
322 attach: function (context, settings) {
323      const umbral = 1200;
324
325      // Solo actuamos si el ancho de la ventana es mayor a 1200px
326      if (window.innerWidth > umbral) {
327        // Seleccionamos el contenedor una sola vez
328        once('stickyMenu', '.l-page--front-gutenberg-ayuntamiento-cuevas-domain .contenido', context).forEach(function (element) {
329
330          // Buscamos el logo una sola vez para no repetir la consulta al DOM en cada scroll
331          const $logo = $(element).find('.site-logo');
332          const rutaOriginal = '/themes/custom/meta/images/ayuntcuevas.png';
333          const rutaNegro = '/themes/custom/meta/images/ayuntcuevasnegro.png';
334
335          $(window).on('scroll', function () {
336            const scrollTop = $(window).scrollTop();
337
338            if (scrollTop > 100) {
339              $(element).addClass('is-fixed');
340              // Cambiamos el src solo si no es ya el logo negro (para optimizar)
341              if ($logo.attr('src') !== rutaNegro) {
342                $logo.attr('src', rutaNegro);
343              }
344
345            } else {
346              $(element).removeClass('is-fixed');
347              // Volvemos al logo original
348              if ($logo.attr('src') !== rutaOriginal) {
349                $logo.attr('src', rutaOriginal);
350              }
351            }
352          });
353        });
354      }
355    }
356  };
357  Drupal.behaviors.stickyMenuAyuntCuevas_demas_paginas = {
358    attach: function (context, settings) {
359      const umbral = 1200;
360
361      // Solo actuamos si el ancho de la ventana es mayor a 1200px
362      if (window.innerWidth > umbral) {
363        // Seleccionamos el contenedor una sola vez
364        once('stickyMenu', '.l-page--ayuntamiento-cuevas-domain .contenido', context).forEach(function (element) {
365
366          $(window).on('scroll', function () {
367            const scrollTop = $(window).scrollTop();
368
369            if (scrollTop > 100) {
370              $(element).addClass('is-fixed');
371              // Cambiamos el src solo si no es ya el logo negro (para optimizar)
372
373            } else {
374              $(element).removeClass('is-fixed');
375              // Volvemos al logo original
376            }
377          });
378        });
379      }
380    }
381  };
382
383  //Castillo Velez
384  Drupal.behaviors.stickyMenuVelez = {
385    attach: function (context, settings) {
386      const umbral = 1200;
387
388      // Solo actuamos si el ancho de la ventana es mayor a 1200px
389      if (window.innerWidth > umbral) {
390        // Seleccionamos el contenedor una sola vez
391        once('stickyMenu', '.l-page--castillo-velez-domain .contenido', context).forEach(function (element) {
392
393
394
395          $(window).on('scroll', function () {
396            const scrollTop = $(window).scrollTop();
397
398            if (scrollTop > 100) {
399              $(element).addClass('is-fixed');
400
401            } else {
402              $(element).removeClass('is-fixed');
403              // Volvemos al logo original
404            }
405          });
406        });
407      }
408    }
409  };
410
411  //Castillo Villaricos
412  Drupal.behaviors.stickyMenuVillaricos = {
413    attach: function (context, settings) {
414      const umbral = 1200;
415
416      // Solo actuamos si el ancho de la ventana es mayor a 1200px
417      if (window.innerWidth > umbral) {
418        // Seleccionamos el contenedor una sola vez
419        once('stickyMenu', '.l-page--castillo-villaricos-domain .contenido', context).forEach(function (element) {
420
421
422
423          $(window).on('scroll', function () {
424            const scrollTop = $(window).scrollTop();
425
426            if (scrollTop > 100) {
427              $(element).addClass('is-fixed');
428
429            } else {
430              $(element).removeClass('is-fixed');
431              // Volvemos al logo original
432            }
433          });
434        });
435      }
436    }
437  };
438
439  //Museo AMC
440  Drupal.behaviors.stickyMenuMuseoAMC = {
441    attach: function (context, settings) {
442      const umbral = 1200;
443
444      // Solo actuamos si el ancho de la ventana es mayor a 1200px
445      if (window.innerWidth > umbral) {
446        // Seleccionamos el contenedor una sola vez
447        once('stickyMenu', '.l-page--museo-arte-contemp-domain .contenido', context).forEach(function (element) {
448
449
450
451          $(window).on('scroll', function () {
452            const scrollTop = $(window).scrollTop();
453
454            if (scrollTop > 100) {
455              $(element).addClass('is-fixed');
456
457            } else {
458              $(element).removeClass('is-fixed');
459              // Volvemos al logo original
460            }
461          });
462        });
463      }
464    }
465  };
466
467  //Museo Sdun
468  Drupal.behaviors.stickyMenuMuseosdun = {
469    attach: function (context, settings) {
470      const umbral = 1200;
471
472      // Solo actuamos si el ancho de la ventana es mayor a 1200px
473      if (window.innerWidth > umbral) {
474        // Seleccionamos el contenedor una sola vez
475        once('stickyMenu', '.l-page--museo-emilio-dun-domain .contenido', context).forEach(function (element) {
476
477
478
479          $(window).on('scroll', function () {
480            const scrollTop = $(window).scrollTop();
481
482            if (scrollTop > 100) {
483              $(element).addClass('is-fixed');
484
485            } else {
486              $(element).removeClass('is-fixed');
487              // Volvemos al logo original
488            }
489          });
490        });
491      }
492    }
493  };
494
495
496
497  Drupal.behaviors.stickyMenuCuevas = {
498    attach: function (context, settings) {
499      const umbral = 1200;
500
501      // Solo actuamos si el ancho de la ventana es mayor a 1200px
502      if (window.innerWidth > umbral) {
503        // Seleccionamos el contenedor una sola vez
504        once('stickyMenu', '.l-page--front-gutenberg-cuevas-domain .contenido, .l-page--cuevas-domain-listado_de_playas .contenido, .l-page--cuevas-domain-playa .contenido ,\n' +
505          '.l-page--cuevas-domain-listado_de_senderos .contenido, .l-page--cuevas-domain-sendero .contenido, .l-page--cuevas-domain-listado_lugares_de_interes .contenido,\n' +
506          '.l-page--cuevas-domain-lugares_de_interes .contenido, .l-page--cuevas-domain-listado_hospedajes .contenido, .l-page--cuevas-domain-hospedaje .contenido,\n' +
507          '.l-page--cuevas-domain-listado_donde_comer .contenido, .l-page--cuevas-domain-donde_o .contenido, .l-page--cuevas-domain-listado_de_planes .contenido,\n' +
508          '.l-page--cuevas-domain-planes .contenido, .l-page---actualidad-cuevas .contenido, .l-page---eventos-cuevas .contenido, .l-page--cuevas-domain-evento .contenido, .l-page---castillosymuseos .contenido, .l-page--cuevas-domain-busqueda_turismo_cuevas .contenido', context).forEach(function (element) {
509
510          // Buscamos el logo una sola vez para no repetir la consulta al DOM en cada scroll
511          const $logo = $(element).find('.site-logo');
512          const rutaOriginal = '/themes/custom/meta/images/logo-cuevas-blanco.png';
513          const rutaNegro = '/themes/custom/meta/images/logo-cuevas.png';
514
515          $(window).on('scroll', function () {
516            const scrollTop = $(window).scrollTop();
517
518            if (scrollTop > 100) {
519              $(element).addClass('is-fixed');
520
521              // Cambiamos el src solo si no es ya el logo negro (para optimizar)
522              if ($logo.attr('src') !== rutaNegro) {
523                $logo.attr('src', rutaNegro);
524              }
525            } else {
526              $(element).removeClass('is-fixed');
527
528              // Volvemos al logo original
529              if ($logo.attr('src') !== rutaOriginal) {
530                $logo.attr('src', rutaOriginal);
531              }
532            }
533          });
534        });
535      }
536    }
537  };
538
539  Drupal.behaviors.stickyMenuCuevasfloat = {
540    attach: function (context, settings) {
541      const umbral = 1200;
542
543      // Solo actuamos si el ancho de la ventana es mayor a 1200px
544      if (window.innerWidth > umbral) {
545        // Seleccionamos el contenedor una sola vez
546        once('stickyMenu', '.l-page--cuevas-domain .contenido', context).forEach(function (element) {
547
548          $(window).on('scroll', function () {
549            const scrollTop = $(window).scrollTop();
550
551            if (scrollTop > 100) {
552              $(element).addClass('is-fixed');
553            } else {
554              $(element).removeClass('is-fixed');
555            }
556          });
557        });
558      }
559    }
560  };
561
562  /**
563   * @file
564   * Comportamiento para añadir iconos a los títulos de agrupación en Views.
565   */
566
567  Drupal.behaviors.metaHeaderIcons = {
568    attach(context) {
569      // Usamos once() para asegurarnos de no poner el icono varias veces
570      // si la View se actualiza por AJAX.
571      const headers = once('meta-header-icons', '.view-id-actividades_por_plan .title-h2', context);
572
573      headers.forEach((header) => {
574        const text = header.innerText.trim().toLowerCase();
575        let iconClass = '';
576
577        // Definimos el icono según el texto
578        if (text.includes('mañana')) {
579          iconClass = 'fa-sun';
580        } else if (text.includes('mediodia') || text.includes('mediodía')) {
581          iconClass = 'fa-utensils';
582        } else if (text.includes('tarde')) {
583          iconClass = 'fa-cloud-sun';
584        }
585
586        if (iconClass) {
587          // Creamos el elemento i de FontAwesome
588          const icon = document.createElement('i');
589          // Añadimos las clases (fas para solid, o far para regular)
590          icon.classList.add('fas', iconClass, 'me-2'); // 'me-2' es margen a la derecha en Bootstrap
591
592          // Lo insertamos al inicio del h2
593          header.prepend(icon);
594        }
595      });
596    }
597  };
598
599  Drupal.behaviors.menuWidgetActiveRoute = {
600    attach: (context) => {
601      // Obtenemos la ruta actual del navegador (ej. "/playas")
602      const currentPath = window.location.pathname;
603
604      // Buscamos los enlaces dentro de nuestro widget de menú utilizando context para respetar el ciclo de vida de Drupal
605      const menuLinks = context.querySelectorAll('.menu-widget .menu-list .menu-item a, .menu-widget--2 .menu-list .menu-item a, .menu-widget--3 .menu-list .menu-item a');
606
607      if (!menuLinks.length) return;
608
609      menuLinks.forEach(link => {
610        // Obtenemos el path del enlace (manejando rutas relativas o absolutas internas)
611        const linkPath = new URL(link.href, window.location.origin).pathname;
612
613        // Comparamos la ruta actual con la del enlace
614        if (currentPath === linkPath) {
615          const menuItem = link.closest('.menu-item');
616
617          if (menuItem) {
618            // Remover la clase active de los hermanos por si acaso venía hardcodeada en el HTML
619            const listItems = menuItem.parentElement.querySelectorAll('.menu-item');
620            listItems.forEach(item => item.classList.remove('active'));
621
622            // Añadir la clase active al elemento actual
623            menuItem.classList.add('active');
624          }
625        }
626      });
627    }
628  };
629
630  Drupal.behaviors.transformShowHideButton = {
631    attach: function (context) {
632      const selector = '#show-hide';
633
634      once('transformButton', selector, context).forEach(function (button) {
635        // Verificamos el body
636        const validBody = button.closest('body[data-domain="cuevasdelalmanzora_labmetacms_es"]');
637        if (!validBody) return;
638
639        const svgPath = '/themes/custom/meta/images/ayunt-cuevas/ayunt-cuevas-acces.svg';
640
641        // Función que realiza el cambio de texto a SVG
642        const injectSvg = () => {
643          // Si ya tiene la imagen dentro, no hacemos nada para evitar bucles infinitos
644          if (button.querySelector('.button-icon-svg')) return;
645
646          const svgIcon = document.createElement('img');
647          svgIcon.src = svgPath;
648          svgIcon.alt = button.getAttribute('aria-label') || 'Preferencias';
649          svgIcon.classList.add('button-icon-svg');
650
651          button.textContent = ''; // Limpia texto
652          button.appendChild(svgIcon); // Inserta SVG
653          console.log('¡SVG Inyectado con éxito!');
654        };
655
656        // 1. Intentamos inyectarlo inmediatamente
657        injectSvg();
658
659        // 2. Creamos un observador por si un script externo altera el botón más tarde
660        const observer = new MutationObserver((mutations) => {
661          // Si el texto cambia o el script externo regenera el contenido, lo volvemos a cambiar
662          injectSvg();
663        });
664
665        // Configuramos el observador para que mire los cambios en el texto y elementos hijos del botón
666        observer.observe(button, {childList: true, characterData: true, subtree: true});
667      });
668    }
669  };
670
671  Drupal.behaviors.listToggle = {
672    attach: function (context) {
673
674      once('list-toggle', '.list-toggle', context).forEach(function (button) {
675
676        $(button).on('click', function (e) {
677          e.preventDefault();
678
679          const $wrapper = $('.view-mapa-playas, .view-mapa-senderos, .view-mapa-lugares-interes, .view-mapa-hospedajes, .view-mapa-donde-comer');
680
681          // Toggle de clase
682          $wrapper.toggleClass('collapsed');
683
684          if ($wrapper.hasClass('collapsed')) {
685
686            // 🔽 ESTADO COLAPSADO
687            $('.contenido-hidden').hide();
688            $('.view-mapa-playas .groupy, .view-mapa-senderos .groupy, .view-mapa-lugares-interes .groupy, .view-mapa-hospedajes .groupy, .view-mapa-donde-comer .groupy').css('width', '100%');
689            $('.view-mapa-playas .groupy .view-mapa-parametros .view-content, .view-mapa-senderos .groupy .view-mapa-parametros .view-content, .view-mapa-lugares-interes .groupy .view-mapa-parametros .view-content, .view-mapa-hospedajes .groupy .view-mapa-parametros .view-content, .view-mapa-donde-comer .groupy .view-mapa-parametros .view-content')
690              .css('grid-template-columns', 'repeat(4, 1fr)');
691            $('.view-mapa-playas .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-senderos .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-lugares-interes .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-hospedajes .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-donde-comer .groupy .view-mapa-parametros .view-content .views-row').css('width', '23%');
692
693          } else {
694
695            // 🔼 ESTADO NORMAL
696            $('.contenido-hidden').show();
697            $('.view-mapa-playas .groupy, .view-mapa-senderos .groupy, .view-mapa-lugares-interes .groupy, .view-mapa-hospedajes .groupy, .view-mapa-donde-comer .groupy').css('width', '');
698            $('.view-mapa-playas .groupy .view-mapa-parametros .view-content, .view-mapa-senderos .groupy .view-mapa-parametros .view-content, .view-mapa-lugares-interes .groupy .view-mapa-parametros .view-content, .view-mapa-hospedajes .groupy .view-mapa-parametros .view-content, .view-mapa-donde-comer .groupy .view-mapa-parametros .view-content')
699              .css('grid-template-columns', '');
700            $('.view-mapa-playas .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-senderos .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-lugares-interes .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-hospedajes .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-donde-comer .groupy .view-mapa-parametros .view-content .views-row').css('width', '');
701
702          }
703
704          // 🔑 Leaflet: recalcular tamaño (SIN reinicializar)
705          setTimeout(function () {
706            if (Drupal.Leaflet && Drupal.Leaflet.maps) {
707              Object.values(Drupal.Leaflet.maps).forEach(function (map) {
708                map.invalidateSize();
709              });
710            }
711          }, 350);
712        });
713
714      });
715    }
716  };
717
718  Drupal.behaviors.scrollAjustadoPlayas = {
719    attach: function (context, settings) {
720
721      // Uso correcto de once en Drupal moderno:
722      // once('id-unico', selector, contexto)
723      const forms = once('scroll-ajustado', '.views-exposed-form', context);
724
725      // 'once' devuelve un Array nativo de elementos, mapeamos con jQuery si hace falta
726      $(forms).each(function () {
727        if (context !== document) {
728          $('html, body').animate({
729            scrollTop: $('.view-filters').offset().top - 150
730          }, 300);
731        }
732      });
733
734    }
735  };
736
737  Drupal.behaviors.hvModalClose = {
738    attach: function (context, settings) {
739      // Usamos 'once' para asegurarnos de que el evento click se asigne una sola vez
740      $(once('hv-modal-close-event', '.hv-btn--secondary', context)).on('click', function (e) {
741        e.preventDefault();
742
743        // 1. Intentar cerrar usando la API nativa de Bootstrap si está disponible en el JS global
744        var $modalElement = $(this).closest('.modal');
745
746        if ($modalElement.length) {
747          if (typeof bootstrap !== 'undefined' && bootstrap.Modal) {
748            // Bootstrap 5
749            var modalInstance = bootstrap.Modal.getInstance($modalElement[0]);
750            if (modalInstance) {
751              modalInstance.hide();
752              return;
753            }
754          } else if ($.fn.modal) {
755            // Bootstrap 4 / jQuery fallback
756            $modalElement.modal('hide');
757            return;
758          }
759        }
760
761        // 2. Fallback: Si Bootstrap no responde por conflicto de librerías,
762        // simulamos el click en el botón de cerrar nativo de la cabecera de Drupal
763        var $nativeClose = $(this).closest('.modal-content').find('.js-modal-page-ok-button');
764        if ($nativeClose.length) {
765          $nativeClose.trigger('click');
766        }
767      });
768    }
769  };
770
771  Drupal.behaviors.searchIconInjector = {
772    attach: function (context, settings) {
773
774      // La nueva sintaxis de once() recibe un identificador y el selector
775      const elements = once('search-init', '.l-page--castillo-velez-domain #search-block-form #edit-keys', context);
776
777      // 'once' ahora devuelve un array nativo de JavaScript, así que lo recorremos
778      elements.forEach(function (element) {
779        var $input = $(element); // Lo envolvemos en jQuery
780
781        // 1. Envolvemos el input en el contenedor
782        $input.wrap('<div class="search-wrapper"></div>');
783
784        // 2. Creamos e inyectamos el icono (por defecto empieza con la lupa)
785        var $icon = $('<i class="fas fa-search search-trigger-icon"></i>');
786        $input.after($icon);
787
788        // 3. Evento de clic
789        $icon.on('click', function () {
790          var $thisIcon = $(this); // El icono que recibió el clic
791
792          // Alternamos la clase activa en el input
793          $input.toggleClass('search-input-active');
794
795          if ($input.hasClass('search-input-active')) {
796            $input.focus();
797            // Si está activo, quitamos la lupa y ponemos la cruz
798            $thisIcon.removeClass('fa-search').addClass('fa-times');
799          } else {
800            // Si se cierra, volvemos a poner la lupa
801            $thisIcon.removeClass('fa-times').addClass('fa-search');
802          }
803        });
804      });
805
806    }
807  };
808
809    Drupal.behaviors.cambiarTituloArchivo = {
810      attach: function (context, settings) {
811        // 1. Validar si la URL actual empieza por /archivo/
812        if (window.location.pathname.startsWith('/archivo/')) {
813
814          // 2. Seleccionar el bloque específico usando 'once'
815          const blocks = once(
816            'cambiar-titulo-vista',
817            '#block-meta-views-block-ultimos-archivos-documentales-block-2',
818            context
819          );
820
821          // 3. Modificar el elemento interno .title-block
822          blocks.forEach(function (block) {
823            const titleElement = block.querySelector('.title-block');
824            if (titleElement) {
825              titleElement.textContent = 'Últimos Plenos'; // Pon aquí el título que quieras
826            }
827          });
828
829        }
830      }
831    };
832
833  document.addEventListener('DOMContentLoaded', function () {
834    const btn = document.getElementById('project-desc-btn');
835    const wrapper = document.getElementById('project-desc-wrapper');
836
837    if (btn && wrapper) {
838      btn.addEventListener('click', function () {
839        // Alternamos la clase que expande el contenedor
840        wrapper.classList.toggle('is-expanded');
841
842        // Cambiamos el texto del botón según el estado
843        if (wrapper.classList.contains('is-expanded')) {
844          btn.textContent = 'Leer menos';
845        } else {
846          btn.textContent = 'Leer más';
847
848          // Opcional: Desplazar la pantalla suavemente hacia arriba si al cerrarlo queda desubicado
849          wrapper.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
850        }
851      });
852    }
853  });
854
855  document.addEventListener('DOMContentLoaded', function () {
856    // Buscamos todos los enlaces de colorbox dentro de nuestro slider de obra
857    const colorboxLinks = document.querySelectorAll('.view-slider-de-obra-y-proyecto .colorbox');
858
859    if (colorboxLinks.length > 0) {
860      colorboxLinks.forEach(function(link) {
861        // Les asignamos exactamente el mismo nombre de galería a todos
862        link.setAttribute('data-colorbox-gallery', 'galeria-proyectos-unica');
863      });
864    }
865  });
866
867})(jQuery, Drupal);
868
869(function (Drupal) {
870  'use me'
871  Drupal.behaviors.protegerIconosTraduccion = {
872    attach: function (context, settings) {
873      // Busca todos los span de Material Symbols o Material Icons
874      const iconos = context.querySelectorAll('.material-symbols-outlined, .material-icons');
875
876      iconos.forEach(function (icono) {
877        // Les añade la clase y el atributo para frenar a Google Translate
878        icono.classList.add('notranslate');
879        icono.setAttribute('translate', 'no');
880      });
881    }
882  };
883})(Drupal);

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.