1<!DOCTYPE html> 2<html lang="de" class="no-js"> 3<head> 4 5 <meta charset="UTF-8"> 6 <title>Unsere Kirchgemeinden - Evangelisch-reformierte Kirche des Kantons St.Gallen</title> 7 <base href="https://www.ref-sg.ch/"> 8 <link rel="icon" href="/favicon.ico" type="image/x-icon"> 9 10 <meta name="robots" content="index,follow"> 11 <meta name="description" content=""> 12 <meta name="generator" content="Contao Open Source CMS"> 13 <meta name="google-site-verification" content="SEb1l4oJW_KJMjPrASAkT07B0MCYm5BODt5rYVtjl8s"/> 14 15 16 <meta name="viewport" content="width=device-width,initial-scale=1.0"> 17 <link rel="stylesheet" href="/assets/css/layout.min.css,responsive.min.css,reset.min.css,mmenu.css,column...-f43dfc31.css">
17<script src="/assets/js/jquery.min.js,mmenu.js-7d709994.js"></script>
17<meta name="search:type" content="page"/>
17<script src="/assets/js/vue.min.js,vue-resource.min.js-4467e5c0.js"></script>
17<script src="/assets/js/autoComplete.min.js-be8066c1.js"></script>
17<link href="/assets/css/default.scss,autoComplete.scss-155e173d.css" rel="stylesheet"><link href="/assets/css/elasticsearch.scss-9384fcaf.css" rel="stylesheet"> 18</head> 19<body 20 id="top"> 21 22 23 24<div id="overlay"> 25 <div class="inside"> 26 27<div class="info-overlay"> 28 <div class="rs-columns ce_rs_columns_start"> 29 30 <div class="ce_rs_column_start rs-column -large-col-2-1 -large-first -large-first-row -medium-col-2-1 -medium-first -medium-first-row -small-col-1-1 -small-first -small-last -small-first-row"> 31 32 33<div class="ce_text block"> 34 35 <h1>Evangelisch-reformierte Kirche des Kantons St.Gallen</h1> 36 37 38 <p>«Willkommen, unsere Türen sind offen». Dies gilt für fast alle reformierten Kirchen im Kanton St.Gallen. Gleiches gilt auch, wenn Sie ein Anliegen an uns haben. Wenden Sie sich an Ihre Kirchgemeinde.</p> 39 40 41 42</div> 43</div> 44<div class="ce_rs_column_start rs-column -large-col-2-1 -large-last -large-first-row -medium-col-2-1 -medium-last -medium-first-row -small-col-1-1 -small-first -small-last"> 45 46 47<div class="ce_text second-row block"> 48 49 50 51 <p>Oder Sie setzen sich direkt mit der Kantonalkirche, also der Evangelisch-reformierten Kirche des Kantons St.Gallen, in Verbindung. Sie finden uns am Oberen Graben 31 in 9000 St.Gallen. Erreichbar sind wir in der Regel werktags von 8 bis 12 Uhr und von 14 bis 17 Uhr unter 071 227 05 00 oder per Mail unter info@ref-sg.ch.</p> 52 53 54 55</div> 56</div> 57</div> 58 59<a href="javascript:;" id="overlay_close"> 60 <img src="files/template/img/close_overlay.png" alt="Schliessen" /> 61</a> 62 63</div> </div> 64</div> 65 66<div id="search"> 67 <div class="inside"> 68 <div></div> </div> 69</div> 70 71<div id="wrapper" class="main-wrapper"> 72 73 <header id="header" class="main-header"> 74 <div class="inside"> 75 76<!-- indexer::stop --> 77<nav class="mod_navigation headernav block"> 78 79 80 <a href="/Kirchgemeinden.html#skipNavigation1" class="invisible">Navigation überspringen</a> 81 82 <ul class="level_1" role="menubar"> 83 84 85 <li class="submenu trail not-clickable"> 86 <a href="/ueberuns.html" title="St.Galler Kirche" class="submenu trail not-clickable" role="menuitem" aria-haspopup="true">St.Galler Kirche</a><ul class="level_2" role="menu"> 87 88 89 <li class="sibling"> 90 <a href="/ueberuns.html" title="Ãber uns" class="sibling" role="menuitem">Ãber uns</a> </li> 91 92 93 <li class="sibling"> 94 <a href="/neue-kirchenverfassung.html" title="Neue Kirchenverfassung" class="sibling" role="menuitem">Neue Kirchenverfassung</a> </li> 95 96 97 <li class="active"><span class="active" 98 role="menuitem">Unsere Kirchgemeinden</span> </li> 99 100 101 <li class="sibling"> 102 <a href="/synode.html" title="Synode" class="sibling" role="menuitem">Synode</a> </li> 103 104 105 <li class="sibling"> 106 <a href="/kirchenrat.html" title="Kirchenrat" class="sibling" role="menuitem">Kirchenrat</a> </li> 107 108 109 <li class="sibling"> 110 <a href="/st-galler-kirche/team.html" title="team" class="sibling" role="menuitem">Team der Kantonalkirche</a> </li> 111 112 113 <li class="sibling"> 114 <a href="/fuerdiekirchearbeiten.html" title="Für die Kirche arbeiten" class="sibling" role="menuitem">Für die Kirche arbeiten</a> </li> 115 116 117 <li class="sibling"> 118 <a href="/persoenlichkeitsschutz.html" title="Gewährleistung des Persönlichkeitsschutzes in der Kirche" class="sibling" role="menuitem">Persönlichkeitsschutz</a> </li> 119 </ul> 120 </li> 121 122 123 <li class="submenu not-clickable"> 124 <a href="/gottesdienste.html" title="Kirche für alle" class="submenu not-clickable" role="menuitem" aria-haspopup="true">Kirche für alle</a><ul class="level_2" role="menu"> 125 126 127 <li> 128 <a href="/gottesdienste.html" title="Gottesdienste" role="menuitem">Gottesdienste</a> </li> 129 130 131 <li> 132 <a href="/Musik.html" title="Musik" role="menuitem">Musik</a> </li> 133 134 135 <li> 136 <a href="/seelsorge-beratung.html" title="Seelsorge und Beratung" role="menuitem">Seelsorge und Beratung</a> </li> 137 138 139 <li> 140 <a href="/diakonie.html" title="Diakonie" role="menuitem">Diakonie</a> </li> 141 142 143 <li> 144 <a href="/junge-menschen-begleiten.html" title="Junge Menschen begleiten" role="menuitem">Junge Menschen begleiten</a> </li> 145 146 147 <li> 148 <a href="/bildung.html" title="Bildung" role="menuitem">Bildung</a> </li> 149 150 151 <li> 152 <a href="/eintreten.html" title="In die Kirche eintreten" role="menuitem">In die Kirche eintreten</a> </li> 153 154 155 <li> 156 <a href="https://www.kirche-tut-gut.ch/" title="kirche tut gut" role="menuitem">Kirche tut gut</a> </li> 157 </ul> 158 </li> 159 160 161 <li class="submenu not-clickable"> 162 <a href="/fuer-mitarbeitende/zentrale-dienste.html" title="Mitarbeitende und Behörden" class="submenu not-clickable" role="menuitem" aria-haspopup="true">Mitarbeitende und Behörden</a><ul class="level_2" role="menu"> 163 164 165 <li> 166 <a href="/fuer-mitarbeitende/zentrale-dienste.html" title="Zentrale Dienste" role="menuitem">Zentrale Dienste</a> </li> 167 168 169 <li> 170 <a href="/arbeitsstellen.html" title="Arbeitsstellen" role="menuitem">Arbeitsstellen</a> </li> 171 172 173 <li> 174 <a href="/seelsorge-und-beratung.html" title="Seelsorge und Beratung" role="menuitem">Seelsorge und Beratung</a> </li> 175 176 177 <li> 178 <a href="/veranstaltungen.html" title="Veranstaltungen und Weiterbildungen" role="menuitem">Veranstaltungen und Weiterbildungen</a> </li> 179 180 181 <li> 182 <a href="/Verfassung-und-gueltige-Erlasse.html" title="Verfassung und gültige Erlasse" role="menuitem">Verfassung und gültige Erlasse</a> </li> 183 </ul> 184 </li> 185 186 187 <li class="submenu not-clickable"> 188 <a href="/Kontakt.html" title="Service" class="submenu not-clickable" role="menuitem" aria-haspopup="true">Service</a><ul class="level_2" role="menu"> 189 190 191 <li> 192 <a href="/Kontakt.html" title="Kontakt" role="menuitem">Kontakt</a> </li> 193 194 195 <li> 196 <a href="/Medien.html" title="Medien" role="menuitem">Medien</a> </li> 197 198 199 <li> 200 <a href="/finanzielle-unterstuetzung.html" title="Finanzielle Unterstützung" role="menuitem">Finanzielle Unterstützung</a> </li> 201 202 203 <li> 204 <a href="/newsletter-anmeldung.html" title="Newsletter" role="menuitem">Newsletter</a> </li> 205 206 207 <li> 208 <a href="/pfefferstern.html" title="Pfefferstern und Reforum" role="menuitem">Pfefferstern und Reforum</a> </li> 209 210 211 <li> 212 <a href="/Material.html" title="Zum Mieten" role="menuitem">Zum Mieten</a> </li> 213 214 215 <li> 216 <a href="/shop.html" title="Zum Bestellen" role="menuitem">Zum Bestellen</a> </li> 217 218 219 <li> 220 <a href="/stellen.html" title="Stellen" role="menuitem">Stellen</a> </li> 221 </ul> 222 </li> 223 </ul> 224 225 <span id="skipNavigation1" class="invisible"></span> 226 227</nav> 228<!-- indexer::continue --> 229<!-- indexer::stop --> 230<nav class="mod_mmenu mobilenavi" id="mobile-show"> 231 232 233<ul class="level_1" role="menubar"> 234 <li class="submenu trail"><a 235 href="/ueberuns.html" 236 title="St.Galler Kirche" class="submenu trail" role="menuitem" aria-haspopup="true">St.Galler Kirche</a><ul class="level_2" role="menu"> 237 <li class="sibling"><a 238 href="/ueberuns.html" 239 title="Ãber uns" class="sibling" role="menuitem">Ãber uns</a> </li> 240 <li class="sibling"><a 241 href="/neue-kirchenverfassung.html" 242 title="Neue Kirchenverfassung" class="sibling" role="menuitem">
242Neue Kirchenverfassung</a> </li> 243 <li class="active"><span class="active" 244 role="menuitem">Unsere Kirchgemeinden</span> </li> 245 <li class="sibling"><a 246 href="/synode.html" 247 title="Synode" class="sibling" role="menuitem">Synode</a> </li> 248 <li class="sibling"><a 249 href="/kirchenrat.html" 250 title="Kirchenrat" class="sibling" role="menuitem">Kirchenrat</a> </li> 251 <li class="sibling"><a 252 href="/st-galler-kirche/team.html" 253 title="team" class="sibling" role="menuitem">Team der Kantonalkirche</a> </li> 254 <li class="sibling"><a 255 href="/fuerdiekirchearbeiten.html" 256 title="Für die Kirche arbeiten" class="sibling" role="menuitem">Für die Kirche arbeiten</a> </li> 257 <li class="sibling"><a 258 href="/persoenlichkeitsschutz.html" 259 title="Gewährleistung des Persönlichkeitsschutzes in der Kirche" class="sibling" role="menuitem">Persönlichkeitsschutz</a> </li> 260 </ul> 261 </li> 262 <li class="submenu"><a 263 href="/gottesdienste.html" 264 title="Kirche für alle" class="submenu" role="menuitem" aria-haspopup="true">Kirche für alle</a><ul class="level_2" role="menu"> 265 <li><a 266 href="/gottesdienste.html" 267 title="Gottesdienste" role="menuitem">Gottesdienste</a> </li> 268 <li><a 269 href="/Musik.html" 270 title="Musik" role="menuitem">Musik</a> </li> 271 <li><a 272 href="/seelsorge-beratung.html" 273 title="Seelsorge und Beratung" role="menuitem">Seelsorge und Beratung</a> </li> 274 <li><a 275 href="/diakonie.html" 276 title="Diakonie" role="menuitem">Diakonie</a> </li> 277 <li><a 278 href="/junge-menschen-begleiten.html" 279 title="Junge Menschen begleiten" role="menuitem">Junge Menschen begleiten</a> </li> 280 <li><a 281 href="/bildung.html" 282 title="Bildung" role="menuitem">Bildung</a> </li> 283 <li><a 284 href="/eintreten.html" 285 title="In die Kirche eintreten" role="menuitem">In die Kirche eintreten</a> </li> 286 <li><a 287 href="https://www.kirche-tut-gut.ch/" 288 title="kirche tut gut" role="menuitem">Kirche tut gut</a> </li> 289 </ul> 290 </li> 291 <li class="submenu"><a 292 href="/fuer-mitarbeitende/zentrale-dienste.html" 293 title="Mitarbeitende und Behörden" class="submenu" role="menuitem" aria-haspopup="true">Mitarbeitende und Behörden</a><ul class="level_2" role="menu"> 294 <li><a 295 href="/fuer-mitarbeitende/zentrale-dienste.html" 296 title="Zentrale Dienste" role="menuitem">Zentrale Dienste</a> </li> 297 <li><a 298 href="/arbeitsstellen.html" 299 title="Arbeitsstellen" role="menuitem">Arbeitsstellen</a> </li> 300 <li><a 301 href="/seelsorge-und-beratung.html" 302 title="Seelsorge und Beratung" role="menuitem">Seelsorge und Beratung</a> </li> 303 <li><a 304 href="/veranstaltungen.html" 305 title="Veranstaltungen und Weiterbildungen" role="menuitem">Veranstaltungen und Weiterbildungen</a> </li> 306 <li><a 307 href="/Verfassung-und-gueltige-Erlasse.html" 308 title="Verfassung und gültige Erlasse" role="menuitem">Verfassung und gültige Erlasse</a> </li> 309 </ul> 310 </li> 311 <li class="submenu"><a 312 href="/Kontakt.html" 313 title="Service" class="submenu" role="menuitem" aria-haspopup="true">Service</a><ul class="level_2" role="menu"> 314 <li><a 315 href="/Kontakt.html" 316 title="Kontakt" role="menuitem">Kontakt</a> </li> 317 <li><a 318 href="/Medien.html" 319 title="Medien" role="menuitem">Medien</a> </li> 320 <li><a 321 href="/finanzielle-unterstuetzung.html" 322 title="Finanzielle Unterstützung" role="menuitem">Finanzielle Unterstützung</a> </li> 323 <li><a 324 href="/newsletter-anmeldung.html" 325 title="Newsletter" role="menuitem">Newsletter</a> </li> 326 <li><a 327 href="/pfefferstern.html" 328 title="Pfefferstern und Reforum" role="menuitem">Pfefferstern und Reforum</a> </li> 329 <li><a 330 href="/Material.html" 331 title="Zum Mieten" role="menuitem">Zum Mieten</a> </li> 332 <li><a 333 href="/shop.html" 334 title="Zum Bestellen" role="menuitem">Zum Bestellen</a> </li> 335 <li><a 336 href="/stellen.html" 337 title="Stellen" role="menuitem">Stellen</a> </li> 338 </ul> 339 </li> 340 </ul> 341 342<div class="mm-menu__close"> 343 <span class="icon"></span> 344</div> 345 346</nav> 347<!-- indexer::continue --> 348 349<div id="sidenavigation"><a href="#mobile-show"><span></span></a></div> 350<div class="logo"><div class="ce_image only-desktop block"> 351 352 353 354<figure class="image_container"> 355 356 <a href="/evang-ref-kirche-st-gallen.html" title="Reformierte Kirche St.Gallen"> 357 358 359 360<img src="/files/content/bilder-logos/Logo_2025_rgb_vektor.svg" alt="Reformierte Kirche St.Gallen"> 361 362 363 </a> 364 365 366</figure> 367 368 369</div> 370 371</div> 372<div class="logo"><div class="ce_image only-mobile block"> 373 374 375 376<figure class="image_container"> 377 378 <a href="/evang-ref-kirche-st-gallen.html" title="Reformierte Kirche St.Gallen"> 379 380 381 382<img src="/files/content/bilder-logos/Logo_2025_rgb_vektor.png" width="339" height="256" alt="Reformierte Kirche St.Gallen"> 383 384 385 </a> 386 387 388</figure> 389 390 391</div> 392 393</div> 394<!-- indexer::stop --> 395<div class="mod_elasticsearch block"> 396 397 398 <div id="id_search_6abf871a1635663" class="elasticsearch-container" v-bind:class="{results_open: hasResults}"> 399 400 <div class="elasticsearch-container-inside" ref="elasticsearchContainerInside"> 401 <form method="GET"> 402 <div class="elasticsearch-search-panel"> 403 <div class="elasticsearch-input"> 404 <input id="ctrl_keywords_63" type="search" @keyup="search" @search="search" v-model="keywords" placeholder="Wer sucht, der findet..." spellcheck=false autocomplete="off" autocapitalize="off"> 405 <button @click.stop.prevent="search" class="elasticsearch-input-button"> 406 <img v-if="!loading" src="/files/template/img/new/search.svg" alt="Suchen" class="button-search-icon"> 407 <img v-else src="/files/template/img/new/loading.svg" alt="" class="button-loading-icon"> 408 </button> 409 </div> 410 </div> 411 </form> 412 413 <div class="elasticsearch-results-panel" v-if="hasResults"> 414 415 <div class="close-results"> 416 <button @click.stop.prevent="close" class="close button"><span>SchlieÃen</span></button> 417 </div> 418 419 <div class="suggest-results"> 420 <p v-if="keywords" class="suggest-results-for">Ergebnisse für <span>{{ keywords }}</span></p> 421 <p v-if="views.didYouMean.length" class="suggest-results-mean">Meinten Sie <a @click.stop.prevent="setDidYouMeanToKeyword" v-for="didYouMean in views.didYouMean" v-if="didYouMean !== keywords"><span>{{ didYouMean }}</span></a></p> 422 </div> 423 424 <div class="categories-results"> 425 <div class="categories-headline"> 426 <p>Kategorien</p> 427 </div> 428 <nav v-if="Object.keys(views.categories).length"> 429 <ul> 430 <li v-for="category in views.categories" class="category-item" v-bind:class="{active: activeCategory(category.key)}"> 431 <button @click.stop.prevent="setCategory(category.key)" class="category-item-button"><span v-html="category.label"></span><i v-if="category.count">({{ category.count }})</i></button> 432 </li> 433 </ul> 434 </nav> 435 </div> 436 437 <div v-if="Object.keys(views.results).length" class="search-results"> 438 <div v-if="Object.keys(views.globalRichSnippets).length && views.globalRichSnippets.hasOwnProperty('FAQPage')" class="search-rich-snippets"> 439 <div class="faq-rich-snippet" v-if="Object.keys(richSnippets['faq']).length">
440 <div v-for="(faq,name) in richSnippets['faq']" class="faq-container" v-bind:class="{active:faq.active}"> 441 <div class="faq-question" @click="toggleFaqSnippet(name)"> 442 <p><strong>{{ faq.question }}</strong></p> 443 </div> 444 <div class="faq-answer" v-show="faq.active"> 445 <p>{{ faq.answer }}</p> 446 </div> 447 </div> 448 </div> 449 </div> 450 451 <div v-for="result in views.results" class="results-group" v-if="result.hits.length"> 452 <div class="result-category" v-if="result.label"> 453 <p class="category-name">{{ result.label }} <span class="category-count">({{ result.hits.length }})</span></p> 454 </div> 455 <div class="result-hit" v-for="hit in result.hits" v-html="hit.template" @click="sendStat"></div> 456 </div> 457 458 </div> 459 </div> 460 <div v-if="!hasResults && !initial && !loading && keywords" class="no-search-results"> 461 <p>Keine Suchergebnisse gefunden.</p> 462 </div> 463 </div> 464 </div>
465<script> 466 window.elasticInstaces = window.elasticInstaces || []; 467 (function () { 468 let objState = { 469 keywords: '', 470 initial: true, 471 timeout: null, 472 categories: [], 473 loading: false, 474 hasResults: false, 475 resultsOnly: false, 476 autoCompleteJS: null, 477 loadMoreButton: true, 478 lastSort: '', 479 timer: null, 480 time: 0, 481 showOpenAiText: false, 482 openAi: false, 483 views: { 484 total: 0, 485 results: [], 486 didYouMean: [], 487 autocompletion: [], 488 categories: [], 489 globalRichSnippets: {} 490 }, 491 options: { 492 categories: {"event":{"id":4,"key":"event","label":"Veranstaltungen"},"news":{"id":3,"key":"news","label":"News"},"page":{"id":1,"key":"page","label":"Seiten"},"pdf":{"id":5,"key":"pdf","label":"pdf"}} }, 493 richSnippets: { 494 faq: {} 495 }, 496 urls: [] 497 }; 498 let elasticComponent = new Vue({ 499 el: "#id_search_6abf871a1635663", 500 data: function () { 501 return objState 502 }, 503 methods: { 504 hasHits: function (hits) { 505 if (!hits) { 506 return false; 507 } 508 if (Array.isArray(hits)) { 509 return false; 510 } 511 for (let type in hits) { 512 if (hits.hasOwnProperty(type)) { 513 if (hits[type]['hits'].length) { 514 return true; 515 } 516 } 517 } 518 return false; 519 }, 520 fetch: function (params) { 521 522 523 if (this.keywords.length && this.keywords.length < 0 && !this.categories.length) { 524 return; 525 } 526 527 this.loading = true; 528 this.initial = false; 529 530 if (!this.keywords && !this.categories.length) { 531 this.hasResults = false; 532 this.views.results = []; 533 this.views.didYouMean = []; 534 this.views.autocompletion = []; 535 this.loading = false; 536 return; 537 } 538 539 this.startAiTimer(); 540 541 let searchAfter = params && params.hasOwnProperty('searchAfter') && params.searchAfter ? ('&search_after=' + params.searchAfter) : '' 542 this.$http.post('/elastic/search/results?query=' + this.keywords + searchAfter, { 543 categories: this.categories, 544 module: "63", 545 root: "1", 546 group: true, 547 source: window.location.href 548 }, 549 { 550 emulateJSON: true, 551 'Content-Type': 'application/x-www-form-urlencoded', 552 before: function (request) { 553 if (this.previousRequest) { 554 this.previousRequest.abort(); 555 } 556 this.previousRequest = request; 557 } 558 } 559 ).then(function (res) { 560 561 let results = res.body.results['hits'] ? res.body.results['hits'] : []; 562 let arrResults = this.groupResults(results); 563 564 if (params && params.hasOwnProperty('merge') && params.merge) { 565 let hasMatches = false; 566 for (let i = 0; i < arrResults.length; i++) { 567 if (this.add2ResultsByCategory(arrRe
567sults[i]['value'], arrResults[i])) { 568 hasMatches = true; 569 } 570 } 571 572 if (!hasMatches) { 573 this.loadMoreButton = false; 574 } 575 576 } else { 577 this.views.results = arrResults; 578 } 579 580 this.views.didYouMean = res.body.results['didYouMean']; 581 this.views.autocompletion = res.body.results['autocomplete']; 582 583 for (let i = 0; i < arrResults.length; i++) { 584 for (let j = 0; j < arrResults[i]['hits'].length; j++) { 585 this.urls.push(arrResults[i]['hits'][j]['url']); 586 } 587 } 588 589 if (this.hasHits(results)) { 590 this.hasResults = true; 591 } else { 592 this.categories = []; 593 this.hasResults = false; 594 } 595 596 this.countResults(); 597 this.views.globalRichSnippets = res.body.globalRichSnippets; 598 this.maxScore = res.body.results['max_score']; 599 this.setFaqRichSnippets(); 600 this.loading = false; 601 this.resultsOnly = false; 602 this.stopAiTimer(); 603 this.clickOutside(); 604 this.autoFocusFirstInputField(); 605 606 }.bind(this)); 607 }, 608 autoFocusFirstInputField: function () { 609 setTimeout(function () { 610 if (this.$refs['elasticsearchResultsContainer']) { 611 this.$refs['elasticsearchResultsContainer'].querySelector('input[type="search"]').focus(); 612 } 613 }.bind(this), 50); 614 }, 615 startAiTimer: function () { 616 if (!this.openAi) { 617 return; 618 } 619 this.timer = setInterval(function () { 620 this.time += 1; 621 if (this.time > 6 && !this.showOpenAiText) { 622 this.showOpenAiText = true; 623 } 624 }.bind(this), 1000); 625 }, 626 stopAiTimer: function () { 627 clearInterval(this.timer); 628 this.showOpenAiText = false; 629 this.timer = null; 630 this.time = 0; 631 }, 632 add2ResultsByCategory: function (category, results) { 633 let added = false; 634 let exist = false; 635 for (let i = 0; i < this.views.results.length; i++) { 636 if (this.views.results[i]['value'] === category) { 637 for (let j = 0; j < results['hits'].length; j++) { 638 if (!this.urls.includes(results['hits'][j]['url'])) { 639 this.views.results[i]['hits'].push(results['hits'][j]); 640 added = true; 641 } 642 } 643 exist = true; 644 } 645 } 646 if (!exist) { 647 this.views.results.push(results) 648 } 649 return added; 650 }, 651 loadMoreResults: function () { 652 this.fetch({ 653 'searchAfter': this.lastSort, 654 'merge': true 655 }) 656 }, 657 setDidYouMeanToKeyword: function () { 658 this.keywords = this.views.didYouMean[0]; 659 this.views.didYouMean = []; 660 this.fetch({}) 661 }, 662 setFaqRichSnippets: function () { 663 this.richSnippets['faq'] = {}; 664 if (Object.keys(this.views.globalRichSnippets).length && this.views.globalRichSnippets.hasOwnProperty('FAQPage')) { 665 for (let i = 0; i < this.views.globalRichSnippets['FAQPage'].length; i++) { 666 let faqPages = this.views.globalRichSnippets['FAQPage'][i]; 667 for (let j = 0; j < faqPages['mainEntity'].length; j++) { 668 let page = faqPages['mainEntity'][j]; 669 if (page['name'] && page['acceptedA
669nswer'] && page['acceptedAnswer']['text'] && page['_matched']) { 670 this.richSnippets['faq'][page.name] = { 671 question: page['name'], 672 answer: page['acceptedAnswer']['text'], 673 active: false 674 } 675 } 676 } 677 } 678 } 679 }, 680 toggleFaqSnippet: function (name) { 681 this.richSnippets['faq'][name]['active'] = !this.richSnippets['faq'][name]['active']; 682 this.$forceUpdate(); 683 }, 684 groupResults: function (hits) { 685 686 if (Array.isArray(hits)) { 687 return []; 688 } 689 690 let group = {}; 691 this.views.total = 0; 692 let onlyCategories = []; 693 for (let type in hits) { 694 if (hits.hasOwnProperty(type)) { 695 let val = hits[type]['value']; 696 if ((this.categories.length && this.categories.indexOf(val) === -1) || (onlyCategories.length && onlyCategories.indexOf(val) === -1)) { 697 continue; 698 } 699 group[type] = hits[type]; 700 this.lastSort = hits[type]['hits'].length ? hits[type]['hits'][hits[type]['hits'].length - 1]['sort'].join() : ''; 701 this.views.total = this.views.total + hits[type]['hits'].length; 702 } 703 } 704 705 let _sortedGroup = []; 706 if (onlyCategories.length) { 707 for (let i = 0; i < onlyCategories.length; i++) { 708 for (let groupLabel in group) { 709 if (group[groupLabel]['value'] === onlyCategories[i]) { 710 _sortedGroup.push(group[groupLabel]); 711 } 712 } 713 } 714 return _sortedGroup; 715 } else { 716 _sortedGroup = this.sortObject(group); 717 } 718 719 return _sortedGroup; 720 }, 721 countResults: function () { 722 723 let categories = []; 724 725 for (let i = 0; i < this.views.results.length; i++) { 726 727 let val = this.views.results[i]['value']; 728 let category = this.options.categories[val]; 729 if (typeof category === 'undefined' || !category) { 730 category = {}; 731 } 732 733 category['count'] = Array.isArray(this.views.results[i]['hits']) ? this.views.results[i]['hits'].length : 0; 734 735 if (typeof categories[i] === 'undefined') { 736 categories[i] = this.options.categories[val]; 737 } 738 } 739 740 if (!this.resultsOnly) { 741 this.views.categories = categories; 742 } 743 }, 744 sortObject: function (obj) { 745 let arrReturn = []; 746 Object.keys(obj).sort(function (a, b) {return a.toLowerCase().localeCompare(b.toLowerCase())}).forEach(function (v) { 747 arrReturn.push(obj[v]); 748 }); 749 return arrReturn; 750 }, 751 startsWithUppercase: function (str) { 752 return str.substr(0, 1).match(/[A-Z\u00C0-\u00DC]/); 753 }, 754 setCategory: function (category) { 755 this.resultsOnly = true; 756 let index = this.categories.indexOf(category); 757 if (index === -1) { 758 this.categories.push(category); 759 } else { 760 this.categories.splice(index, 1); 761 } 762 this.fetch({}); 763 }, 764 activeCategory: function (category) { 765 let index = this.categories.indexOf(category); 766 return index !== -1; 767 }, 768 search: function () { 769 770 771 this.loadMoreButton = true; 772 clearTimeout(this.timeout); 773 this.timeout = setTimeout(function () { 774 this.fetch({}); 775 }.bind(this), 800); 776 }, 777 submit: function () { 778 779 let match = this.autoCompleteJS.feedback && this.autoCompleteJS.feedback.hasOwnProperty('cursor') ? this.autoCompleteJS.feedback.matches[this.autoCompleteJS.feedback.cursor] : ''; 780 if (match) { 781 this.keywords = match.value; 782 this.fetch({}) 783 } else { 784 this.keywords = ''; 785 this.fetch({}) 786 } 787 }, 788 sendStat: function (e) { 789 let href = e.currentTarget.querySelector('a').href; 790 if (!href) { 791 return; 792 } 793 this.$http.post('/stat/click?query=' + this.keywords, { 794 url: href, 795 categories: this.categories 796 }, 797 { 798 emulateJSON: true, 799 'Content-Type': 'application/x-www-form-urlencoded' 800 } 801 ).then(function (res) { 802 // 803 }); 804 }, 805 clickOutside: function () { 806 if (this.$refs['elasticsearchContainerInside']) { 807 window.addEventListener('click', function () { 808 this.close(); 809 }.bind(this)); 810 this.$refs['elasticsearchContainerInside'].addEventListener('click', function (e) { 811 e.stopPropagation(); 812 }); 813 } 814 }, 815 close: function () { 816 this.hasResults = false;
817 this.keywords = ""; 818 this.categories = [] 819 }, 820 setAutoComplete: function () { 821 let self = this; 822 this.autoCompleteJS = new autoComplete({ 823 selector: "#ctrl_keywords_63", 824 placeHolder: "Wer sucht, der findet...", 825 threshold: 2, 826 debounce: 600, 827 submit: true, 828 data: { 829 src: async function (query) { 830 let headers = new Headers(); 831 headers.append('Accept', 'application/json'); 832 headers.append('Content-Type', 'application/json'); 833 const source = await fetch('/elastic/search/autocompletion?query=' + query, { 834 method: "POST", 835 headers: headers, 836 cache: "no-cache", 837 redirect: "follow", 838 credentials: "same-origin", 839 referrerPolicy: "no-referrer", 840 body: JSON.stringify({ 841 categories: self.categories, 842 module: "63", 843 root: "1" 844 }) 845 }); 846 let results = []; 847 let data = await source.json(); 848 for (let i = 0; i < data.results['hits'].length; i++) { 849 results.push(data.results['hits'][i]['term']); 850 } 851 return results; 852 } 853 }, 854 resultsList: { 855 maxResults: 50, 856 tabSelect: true 857 }, 858 resultItem: { 859 highlight: true 860 }, 861 events: { 862 input: { 863 selection: (event) => { 864 self.keywords = event.detail.selection.value; 865 self.fetch({}); 866 }, 867 keydown(event) { 868 switch (event.keyCode) { 869 case 40: 870 case 38: 871 event.preventDefault(); 872 event.keyCode === 40 ? objState.autoCompleteJS.next() : objState.autoCompleteJS.previous(); 873 break; 874 case 9: 875 event.preventDefault(); 876 if (objState.autoCompleteJS.resultsList.tabSelect) { 877 objState.autoCompleteJS.next() 878 } 879 break; 880 case 27: 881 objState.autoCompleteJS.input.value = ""; 882 objState.autoCompleteJS.close(); 883 break; 884 case 13: 885 event.preventDefault() 886 self.submit(); 887 objState.autoCompleteJS.close(); 888 break; 889 } 890 } 891 } 892 } 893 }); 894 } 895 }, 896 watch: { 897 'hasResults': { 898 handler: function (val) { 899 let objBody = document.querySelector('body'); 900 if (val) { 901 objBody.classList.add('search-panel-open'); 902 } else { 903 objBody.classList.remove('search-panel-open'); 904 } 905 } 906 } 907 }, 908 mounted: function () { 909 this.fetch({}); 910 } 911 }); 912 window.elasticInstaces.push(elasticComponent); 913 })(); 914</script>
914 915</div> 916<!-- indexer::continue --> 917 </div> 918 </header> 919 920 921 <div id="container" class="main-container"> 922 923 <main id="main" class="main"> 924 <div class="inside"> 925 926<!-- indexer::stop --> 927<div class="mod_breadcrumb block"> 928 929 930 931<ul> 932 <li> 933 <a 934 href="/ueberuns.html" title="St.Galler Kirche">St.Galler Kirche</a></li> 935 <li class="active last">Unsere Kirchgemeinden</li> 936 </ul> 937 938 939</div> 940<!-- indexer::continue --> 941 942 943 <div class="mod_article block" id="article-437"> 944 945 <div class="ce_rsce_bild_mit_claim block"> 946 947 948 949 <div class="pic-with-claim"> 950 951<figure class="image_container"> 952 953 954 <picture> 955 <source srcset="/assets/images/x/Hemberge_Kirchgemeinden-czjs1p8n2zm587d.avif 1120w, /assets/images/8/Hemberge_Kirchgemeinden-adrjsrhe99jf5cn.avif 360w, /assets/images/v/Hemberge_Kirchgemeinden-k93pmna0gb3kj5k.avif 720w" sizes="100%" type="image/avif" width="1120" height="590"> 956 <source srcset="/assets/images/g/Hemberge_Kirchgemeinden-ksdtjevxpz6ahz3.webp 1120w, /assets/images/5/Hemberge_Kirchgemeinden-kv95zxxyg5s9yp9.webp 360w, /assets/images/5/Hemberge_Kirchgemeinden-3qb8fqwbtcq9dwe.webp 720w" sizes="100%" type="image/webp" width="1120" height="590"> 957 958<img src="/assets/images/d/Hemberge_Kirchgemeinden-sz9ckst72572mg5.jpg" srcset="/assets/images/d/Hemberge_Kirchgemeinden-sz9ckst72572mg5.jpg 1120w, /assets/images/8/Hemberge_Kirchgemeinden-cw44waxd74rqtpk.jpg 360w, /assets/images/7/Hemberge_Kirchgemeinden-dsyeax1nh67qkb0.jpg 720w" sizes="100%" width="1120" height="590" alt=""> 959 960 </picture> 961 962 963 </figure> 964 965 <div class="claim color-sheme color-sheme--nohover color-sheme--wert7"> 966 <h1>Die Kirchgemeinden</h1> 967<h3>Die Evangelisch-reformierte Kirche des Kantons St.Gallen zählt neunundreissig Kirchgemeinden. Hier kommen die Menschen zusammen â zum Feiern, Glauben und Leben.</h3> </div> 968 </div> 969 970 </div> 971<div class="rs-columns ce_rs_columns_start"> 972 973 <div class="ce_rs_column_start rs-column -large-col-2-1 -large-first -large-first-row -medium-col-2-1 -medium-first -medium-first-row -small-col-1-1 -small-first -small-last -small-first-row"> 974 975 976<div class="ce_text block"> 977 978 979 980 <div> 981<div> 982<p>In den Kirchgemeinden findet das kirchliche Leben statt. Die Angebote sind vielfältig und zahlreich: Gottesdienste â von traditionell bis modern, Seelsorge, Erlebnisprogramme für Kinder und Jugendliche, Kinderkirche, Unterricht und Bildungsangebote, Frauentreff oder Mittagstisch für Ãltere.</p> 983<p>Jeder Kirchgemeinde steht eine Kirchenvorsteherschaft vor. Gewählt werden die Mitglieder der Vorsteherschaft durch die Kirchgemeinde.</p> 984</div> 985</div> 986 987 988 989</div> 990</div> 991<div class="ce_rs_column_start rs-column -large-col-2-1 -large-last -large-first-row -medium-col-2-1 -medium-last -medium-first-row -small-col-1-1 -small-first -small-last"> 992 993 994<div class="ce_text block"> 995 996 997 998 <div> 999<div> 1000<p>Tätig in den Gemeinden sind Pfarrerinnen und Pfarrer, sozialdiakonische Mitarbeitende, Kirchenmusikerinnen und -musiker, Fachlehrpersonen für ERG Kirche und Religionsunterricht, Mesmerinnen und Mesmer oder Sekretariatsmitarbeitende. Damit jedoch das vielfältige Angebot überhaupt erst möglich ist, engagieren sich zahlreiche Freiwillige in den Kirchgemeinden.</p> 1001<p>Englisch- und französischsprachige Kirchbürgerinnen und -bürger heissen wir besonders in der <a href="eglise-francaise.html" target="_blank" rel="noopener">Eglise française </a>willkommen.</p> 1002</div> 1003</div> 1004 1005 1006 1007</div> 1008</div> 1009</div> 1010<div class="ce_rsce_infoboxes_multicolor block"> 1011 1012 <div 1013 class="infoboxes clickable color-sheme color-sheme--wert7"> 1014 <a href="/kirchgemeinden-von-a-z.html"> 1015 <h2 title="Index mit Kurzinfo, alphabetisch geordnet.">Verzeichnis der Kirchgemeinden von AâZ</h2> 1016 </a> </div> 1017 1018 1019 <div 1020 class="infoboxes clickable color-sheme color-sheme--wert7"> 1021 <a href="/karte-der-kirchgemeinden.html"> 1022 <h2 title="Unsere vierzig Gemeinden auf einen Blick.">Karte der Kirchgemeinden</h2> 1023 </a> </div> 1024 1025 1026 <div 1027 class="infoboxes clickable color-sheme color-sheme--wert7"> 1028 <a href="/kirchgemeinden-kantonalkirche-adressen.html"> 1029 <h2 title="In der Adressübersicht sind die Anschriften von Kirchgemeinden und der Kantonalkirche sowie der Mitarbeiterinnen und Mitarbeiter aufgeführt.">Adressen der Kirchgemeinden und der Kantonalkirche</h2> 1030 </a> </div> 1031 1032 </div> 1033 1034 </div> 1035 1036 </div> 1037 1038 <div class="scroll-down hidden"><a href="#infos-anmeldung" class="button button--big active">Infos und Anmeldung</a></div> 1039 </main> 1040 1041 1042 1043 </div> 1044 1045 1046 <footer id="footer" class="main-footer"> 1047 <div class="inside"> 1048 1049<div class="footer"><div class="rs-columns ce_rs_columns_start"> 1050 1051 <div class="ce_rs_column_start address rs-column -large-col-4-1 -large-first -large-first-row -medium-col-2-1 -medium-first -medium-first-row -small-col-1-1 -small-first -small-last -small-first-row"> 1052 1053 1054<div class="ce_text block"> 1055 1056 1057 1058 <p>Evang.-ref. Kirche des Kantons St. Gallen<br>Oberer Graben 31<br>9000 St.Gallen<br><a href="tel:+41712270500">T +41 (0)71 227 05 00</a><a href="mailto:info@ref-sg.ch" target="_blank" rel="noopener">info@ref-sg.ch</a></p> 1059 1060 1061 1062</div> 1063</div> 1064<div class="ce_rs_column_start navigation rs-column -large-col-4-1 -large-first-row -medium-col-2-1 -medium-last -medium-first-row -small-col-1-1 -small-first -small-last"> 1065 1066 1067<!-- indexer::stop --> 1068<nav class="mod_customnav first-column block"> 1069 1070 1071 <a href="/Kirchgemeinden.html#skipNavigation54" class="invisible">Navigation überspringen</a> 1072 1073 <ul class="level_1" role="menubar"> 1074 1075 1076 <li> 1077 <a href="/kirchgemeinden-von-a-z.html" title="Kirchgemeinden von A-Z" role="menuitem">Kirchgemeinden von A-Z</a> </li> 1078 1079 1080 <li> 1081 <a href="/kirchgemeinden-kantonalkirche-adressen.html" title="Kirchgemeinden / Kantonalkirche Adressen" role="menuitem">Kirchgemeinden / Kantonalkirche Adressen</a> </li> 1082 1083 1084 <li> 1085 <a href="http://www.kirchenbote-sg.ch/startseite/" title="Kirchenbote" target="_blank" role="menuitem">Kirchenbote</a> </li> 1086 </ul> 1087 1088 <span id="skipNavigation54" class="invisible"></span> 1089 1090</nav> 1091<!-- indexer::continue --> 1092 1093<div id="scrolltop"> 1094 <a href="#" class="scrollup" title="Scroll to top" style="display: inline;"> 1095 <img src="files/template/img/icons/scrolltop.svg" alt="Scroll to top"> 1096 </a> 1097</div></div> 1098<div class="ce_rs_column_start navigation-2 rs-column -large-col-4-1 -large-first-row -medium-col-2-1 -medium-first -small-col-1-1 -small-first -small-last"> 1099 1100 1101<!-- indexer::stop --> 1102<nav class="mod_customnav third-column block"> 1103 1104 1105 <a href="/Kirchgemeinden.html#skipNavigation55" class="invisible">Navigation überspringen</a> 1106 1107 <ul class="level_1" role="menubar"> 1108 1109 1110 <li> 1111 <a href="/Verfassung-und-gueltige-Erlasse.html" title="Gültige Erlasse" role="menuitem">Gültige Erlasse</a> </li> 1112 1113 1114 <li> 1115 <a href="/neue-kirchenverfassung.html" title="St.Galler Kirche 2025" role="menuitem">St.Galler Kirche 2025</a> </li> 1116 1117 1118 <li> 1119 <a href="/stellen.html" title="Stellen" role="menuitem">Stellen</a> </li> 1120 1121 1122 <li> 1123 <a href="/persoenlichkeitsschutz.html" title="Persönlichkeitsschutz in der Kirche" role="menuitem">Persönlichkeitsschutz in der Kirche</a> </li> 1124 </ul> 1125 1126 <span id="skipNavigation55" class="invisible"></span> 1127 1128</nav> 1129<!-- indexer::continue --> 1130</div> 1131<div class="ce_rs_column_start social-media rs-column -large-col-4-1 -large-last -large-first-row -medium-col-2-1 -medium-last -small-col-1-1 -small-first -small-last"> 1132 1133 1134<div class="ce_text block"> 1135 1136 1137 1138 1139 1140<figure class="image_container float_above"> 1141 <a href="https://www.google.com/maps/place/Evang.-ref.+Kirche+des+Kantons+St.Gallen/@47.422964,9.3725055,17z/data=!3m1!4b1!4m5!3m4!1s0x479b1ff56897219f:0xf5e1e7f2ea85841d!8m2!3d47.4229613!4d9.3746824" target="_blank" rel="noreferrer noopener"> 1142 1143 1144 1145<img src="/files/template/img/icons/google_maps.svg" width="17" height="24" alt=""> 1146 1147 1148 </a> 1149 1150 </figure> 1151 1152 1153 <p><a href="https://www.google.com/maps/place/Evang.-ref.+Kirche+des+Kantons+St.Gallen/@47.422964,9.3725055,17z/data=!3m1!4b1!4m5!3m4!1s0x479b1ff56897219f:0xf5e1e7f2ea85841d!8m2!3d47.4229613!4d9.3746824" target="_blank" rel="noopener">Google Maps</a></p> 1154 1155</div> 1156 1157<div class="ce_text block"> 1158 1159 1160 1161 1162 1163<figure class="image_container float_above"> 1164 <a href="https://www.youtube.com/channel/UCYRDpJLQCVbNvjHJ9bI90LA" target="_blank" rel="noreferrer noopener"> 1165 1166 1167 1168<img src="/files/template/img/icons/youtube.svg" width="24" height="18" alt=""> 1169 1170 1171 </a> 1172 1173 </figure> 1174 1175 1176 <p><a href="https://www.youtube.com/channel/UCYRDpJLQCVbNvjHJ9bI90LA" target="_blank" rel="noopener">Youtube</a></p> 1177 1178</div> 1179 1180<div class="ce_text block"> 1181 1182 1183 1184 1185 1186<figure class="image_container float_above"> 1187 <a href="https://www.instagram.com/ref_st_gallen/" target="_blank" rel="noreferrer noopener"> 1188 1189 1190 1191<img src="/files/template/img/icons/instagram.svg" width="24" height="24" alt=""> 1192 1193 1194 </a> 1195 1196 </figure> 1197 1198 1199 <p><a href="https://www.instagram.com/ref_st_gallen/" target="_blank" rel="noopener">Instagram</a></p> 1200 1201</div> 1202 1203<div class="ce_text block"> 1204 1205 1206 1207 1208 1209<figure class="image_container float_above"> 1210 <a href="https://vimeo.com/gedankenzurzeit" title="zu Vimeo" target="_blank" rel="noreferrer noopener"> 1211 1212 1213 1214<img src="/files/template/img/icons/vimeo.svg" width="24" height="22" alt=""> 1215 1216 1217 </a> 1218 1219 </figure> 1220 1221 1222 <p><a title="Gedanken zur Zeit" href="https://vimeo.com/gedankenzurzeit" target="_blank" rel="noopener">Vimeo</a></p> 1223 1224</div> 1225</div> 1226</div> 1227 1228<!-- indexer::stop --> 1229<nav class="mod_customnav first-column meta block"> 1230 1231 1232 <a href="/Kirchgemeinden.html#skipNavigation56" class="invisible">Navigation überspringen</a> 1233 1234 <ul class="level_1" role="menubar"> 1235 1236 1237 <li> 1238 <a href="/impressum.html" title="Impressum" role="menuitem">Impressum</a> </li> 1239 1240 1241 <li> 1242 <a href="/disclaimer.html" title="Disclaimer" role="menuitem">Disclaimer</a> </li> 1243 1244 1245 <li> 1246 <a href="/datenschutz.html" title="Datenschutz" role="menuitem">Datenschutz</a> </li> 1247 </ul> 1248 1249 <span id="skipNavigation56" class="invisible"></span> 1250 1251</nav> 1252<!-- indexer::continue --> 1253 1254</div> 1255<div class="newsletter-footer"></div> 1256<div id="scrolltop"> 1257 <a href="#" class="scrollup" title="Scroll to top" style="display: inline;"> 1258 <img src="files/template/img/icons/scrolltop.svg" alt="Scroll to top"> 1259 </a> 1260</div> </div> 1261 </footer> 1262 1263</div> 1264 1265 1266
1267<script src="/assets/colorbox/js/colorbox.min.js?v=1.6.4.2"></script>
vendor: 1 bytes, line 1267
1267
1268<script> 1269 1270 jQuery(function ($) { 1271 $('a[data-lightbox]').map(function () { 1272 if ($(this).hasClass('colorbox_iframe')) { 1273 $(this).colorbox({ 1274 iframe: true, 1275 width: "900px", 1276 height: "600px", 1277 maxWidth: '95%', 1278 maxHeight: '80%', 1279 onOpen: function () { 1280 $('html:not(.lightbox)').addClass('no-scroll'); 1281 }, 1282 onClosed: function () { 1283 $('html:not(.lightbox)').removeClass('no-scroll'); 1284 } 1285 }); 1286 } else { 1287 $(this).colorbox({ 1288 loop: false, 1289 rel: $(this).attr('data-lightbox'), 1290 maxWidth: '95%', 1291 maxHeight: '80%' 1292 }); 1293 } 1294 1295 1296 }); 1297 }); 1298</script>
vendor: 1 bytes, line 1298
1298
1299<script src="/assets/jquery-ui/js/jquery-ui.min.js?v=1.13.2"></script>
vendor: 1 bytes, line 1299
1299
1300<script> 1301 jQuery(function ($) { 1302 $(document).accordion({ 1303 // Put custom options here 1304 heightStyle: 'content', 1305 header: '.toggler', 1306 collapsible: true, 1307 active: false, 1308 create: function (event, ui) { 1309 ui.header.addClass('active'); 1310 $('.toggler').attr('tabindex', 0); 1311 }, 1312 activate: function (event, ui) { 1313 ui.newHeader.addClass('active'); 1314 ui.oldHeader.removeClass('active'); 1315 $('.toggler').attr('tabindex', 0); 1316 } 1317 }); 1318 }); 1319</script>
vendor: 1 bytes, line 1319
1319
1320<script> 1321 window.elasticInstaces = window.elasticInstaces || []; 1322 (function () { 1323 let objState = { 1324 keywords: '', 1325 initial: true, 1326 timeout: null, 1327 categories: null, 1328 loading: false, 1329 hasResults: false, 1330 resultsOnly: false, 1331 autoCompleteJS: null, 1332 loadMoreButton: true, 1333 lastSort: '', 1334 timer: null, 1335 time: 0, 1336 showOpenAiText: false, 1337 openAi: false, 1338 views: { 1339 total: 0, 1340 results: [], 1341 didYouMean: [], 1342 autocompletion: [], 1343 categories: [], 1344 globalRichSnippets: {} 1345 }, 1346 options: { 1347 categories: null }, 1348 richSnippets: { 1349 faq: {} 1350 }, 1351 urls: [] 1352 }; 1353 let elasticComponent = new Vue({ 1354 el: "#", 1355 data: function () { 1356 return objState 1357 }, 1358 methods: { 1359 hasHits: function (hits) { 1360 if (!hits) { 1361 return false; 1362 } 1363 if (Array.isArray(hits)) { 1364 return false; 1365 } 1366 for (let type in hits) { 1367 if (hits.hasOwnProperty(type)) { 1368 if (hits[type]['hits'].length) { 1369 return true; 1370 } 1371 } 1372 } 1373 return false; 1374 }, 1375 fetch: function (params) { 1376 1377 1378 if (this.keywords.length && this.keywords.length < 0 && !this.categories.length) { 1379 return; 1380 } 1381 1382 this.loading = true; 1383 this.initial = false; 1384 1385 if (!this.keywords && !this.categories.length) { 1386 this.hasResults = false; 1387 this.views.results = []; 1388 this.views.didYouMean = []; 1389 this.views.autocompletion = []; 1390 this.loading = false; 1391 return; 1392 } 1393 1394 this.startAiTimer(); 1395 1396 let searchAfter = params && params.hasOwnProperty('searchAfter') && params.searchAfter ? ('&search_after=' + params.searchAfter) : '' 1397 this.$http.post('/elastic/search/results?query=' + this.keywords + searchAfter, { 1398 categories: this.categories, 1399 module: "", 1400 root: "", 1401 group: true, 1402 source: window.location.href 1403 }, 1404 { 1405 emulateJSON: true, 1406 'Content-Type': 'application/x-www-form-urlencoded', 1407 before: function (request) { 1408 if (this.previousRequest) { 1409 this.previousRequest.abort(); 1410 } 1411 this.previousRequest = request; 1412 } 1413 } 1414 ).then(function (res) { 1415 1416 let results = res.body.results['hits'] ? res.body.results['hits'] : []; 1417 let arrResults = this.groupResults(results); 1418 1419 if (params && params.hasOwnProperty('merge') && params.merge) { 1420 let hasMatches = false; 1421 for (let i = 0; i < arrResults.length; i++) { 1422 if (this.add2ResultsByCategory(arrResults[i]['value'], arrResults[i])) { 1423 hasMatches = true; 1424 } 1425 } 1426 1427 if (!hasMatches) { 1428 this.loadMoreButton = false;
1429 } 1430 1431 } else { 1432 this.views.results = arrResults; 1433 } 1434 1435 this.views.didYouMean = res.body.results['didYouMean']; 1436 this.views.autocompletion = res.body.results['autocomplete']; 1437 1438 for (let i = 0; i < arrResults.length; i++) { 1439 for (let j = 0; j < arrResults[i]['hits'].length; j++) { 1440 this.urls.push(arrResults[i]['hits'][j]['url']); 1441 } 1442 } 1443 1444 if (this.hasHits(results)) { 1445 this.hasResults = true; 1446 } else { 1447 this.categories = []; 1448 this.hasResults = false; 1449 } 1450 1451 this.countResults(); 1452 this.views.globalRichSnippets = res.body.globalRichSnippets; 1453 this.maxScore = res.body.results['max_score']; 1454 this.setFaqRichSnippets(); 1455 this.loading = false; 1456 this.resultsOnly = false; 1457 this.stopAiTimer(); 1458 this.clickOutside(); 1459 this.autoFocusFirstInputField(); 1460 1461 }.bind(this)); 1462 }, 1463 autoFocusFirstInputField: function () { 1464 setTimeout(function () { 1465 if (this.$refs['elasticsearchResultsContainer']) { 1466 this.$refs['elasticsearchResultsContainer'].querySelector('input[type="search"]').focus(); 1467 } 1468 }.bind(this), 50); 1469 }, 1470 startAiTimer: function () { 1471 if (!this.openAi) { 1472 return; 1473 } 1474 this.timer = setInterval(function () { 1475 this.time += 1; 1476 if (this.time > 6 && !this.showOpenAiText) { 1477 this.showOpenAiText = true; 1478 } 1479 }.bind(this), 1000); 1480 }, 1481 stopAiTimer: function () { 1482 clearInterval(this.timer); 1483 this.showOpenAiText = false; 1484 this.timer = null; 1485 this.time = 0; 1486 }, 1487 add2ResultsByCategory: function (category, results) { 1488 let added = false; 1489 let exist = false; 1490 for (let i = 0; i < this.views.results.length; i++) { 1491 if (this.views.results[i]['value'] === category) { 1492 for (let j = 0; j < results['hits'].length; j++) { 1493 if (!this.urls.includes(results['hits'][j]['url'])) { 1494 this.views.results[i]['hits'].push(results['hits'][j]); 1495 added = true; 1496 } 1497 } 1498 exist = true; 1499 } 1500 } 1501 if (!exist) { 1502 this.views.results.push(results) 1503 } 1504 return added; 1505 }, 1506 loadMoreResults: function () { 1507 this.fetch({ 1508 'searchAfter': this.lastSort, 1509 'merge': true 1510 }) 1511 }, 1512 setDidYouMeanToKeyword: function () { 1513 this.keywords = this.views.didYouMean[0]; 1514 this.views.didYouMean = []; 1515 this.fetch({}) 1516 }, 1517 setFaqRichSnippets: function () { 1518 this.richSnippets['faq'] = {}; 1519 if (Object.keys(this.views.globalRichSnippets).length && this.views.globalRichSnippets.hasOwnProperty('FAQPage')) { 1520 for (let i = 0; i < this.views.globalRichSnippets['FAQPage'].length; i++) { 1521 let faqPages = this.views.globalRichSnippets['FAQPage'][i]; 1522 for (let j = 0; j < faqPages['mainEntity'].length; j++) { 1523 let page = faqPages['mainEntity'][j]; 1524 if (page['name'] && page['acceptedA
1524nswer'] && page['acceptedAnswer']['text'] && page['_matched']) { 1525 this.richSnippets['faq'][page.name] = { 1526 question: page['name'], 1527 answer: page['acceptedAnswer']['text'], 1528 active: false 1529 } 1530 } 1531 } 1532 } 1533 } 1534 }, 1535 toggleFaqSnippet: function (name) { 1536 this.richSnippets['faq'][name]['active'] = !this.richSnippets['faq'][name]['active']; 1537 this.$forceUpdate(); 1538 }, 1539 groupResults: function (hits) { 1540 1541 if (Array.isArray(hits)) { 1542 return []; 1543 } 1544 1545 let group = {}; 1546 this.views.total = 0; 1547 let onlyCategories = []; 1548 for (let type in hits) { 1549 if (hits.hasOwnProperty(type)) { 1550 let val = hits[type]['value']; 1551 if ((this.categories.length && this.categories.indexOf(val) === -1) || (onlyCategories.length && onlyCategories.indexOf(val) === -1)) { 1552 continue; 1553 } 1554 group[type] = hits[type]; 1555 this.lastSort = hits[type]['hits'].length ? hits[type]['hits'][hits[type]['hits'].length - 1]['sort'].join() : ''; 1556 this.views.total = this.views.total + hits[type]['hits'].length; 1557 } 1558 } 1559 1560 let _sortedGroup = []; 1561 if (onlyCategories.length) { 1562 for (let i = 0; i < onlyCategories.length; i++) { 1563 for (let groupLabel in group) { 1564 if (group[groupLabel]['value'] === onlyCategories[i]) { 1565 _sortedGroup.push(group[groupLabel]); 1566 } 1567 } 1568 } 1569 return _sortedGroup; 1570 } else { 1571 _sortedGroup = this.sortObject(group); 1572 } 1573 1574 return _sortedGroup; 1575 }, 1576 countResults: function () { 1577 1578 let categories = []; 1579 1580 for (let i = 0; i < this.views.results.length; i++) { 1581 1582 let val = this.views.results[i]['value']; 1583 let category = this.options.categories[val]; 1584 if (typeof category === 'undefined' || !category) { 1585 category = {}; 1586 } 1587 1588 category['count'] = Array.isArray(this.views.results[i]['hits']) ? this.views.results[i]['hits'].length : 0; 1589 1590 if (typeof categories[i] === 'undefined') { 1591 categories[i] = this.options.categories[val]; 1592 } 1593 } 1594 1595 if (!this.resultsOnly) { 1596 this.views.categories = categories; 1597 } 1598 }, 1599 sortObject: function (obj) { 1600 let arrReturn = []; 1601 Object.keys(obj).sort(function (a, b) {return a.toLowerCase().localeCompare(b.toLowerCase())}).forEach(function (v) { 1602 arrReturn.push(obj[v]); 1603 }); 1604 return arrReturn; 1605 }, 1606 startsWithUppercase: function (str) { 1607 return str.substr(0, 1).match(/[A-Z\u00C0-\u00DC]/); 1608 }, 1609 setCategory: function (category) { 1610 this.resultsOnly = true; 1611 let index = this.categories.indexOf(category); 1612 if (index === -1) { 1613 this.categories.push(category); 1614 } else { 1615 this.categories.splice(index, 1); 1616 } 1617 this.fetch({}); 1618 }, 1619 activeCategory: function (category) { 1620 let index = this.categories.indexOf(category); 1621 return index !== -1; 1622 }, 1623 search: function () { 1624 1625 1626 this.loadMoreButton = true; 1627 clearTimeout(this.timeout); 1628 this.timeout = setTimeout(function () { 1629 this.fetch({}); 1630 }.bind(this), 800); 1631 }, 1632 submit: function () { 1633 1634 let match = this.autoCompleteJS.feedback && this.autoCompleteJS.feedback.hasOwnProperty('cursor') ? this.autoCompleteJS.feedback.matches[this.autoCompleteJS.feedback.cursor] : ''; 1635 if (match) { 1636 this.keywords = match.value; 1637 this.fetch({}) 1638 } else { 1639 this.keywords = ''; 1640 this.fetch({}) 1641 } 1642 }, 1643 sendStat: function (e) { 1644 let href = e.currentTarget.querySelector('a').href; 1645 if (!href) { 1646 return; 1647 } 1648 this.$http.post('/stat/click?query=' + this.keywords, { 1649 url: href, 1650 categories: this.categories 1651 }, 1652 { 1653 emulateJSON: true, 1654 'Content-Type': 'application/x-www-form-urlencoded' 1655 } 1656 ).then(function (res) { 1657 // 1658 }); 1659 }, 1660 clickOutside: function () { 1661 if (this.$refs['elasticsearchContainerInside']) { 1662 window.addEventListener('click', function () { 1663 this.close(); 1664 }.bind(this)); 1665 this.$refs['elasticsearchContainerInside'].addEventListener('click', function (e) { 1666 e.stopPropagation(); 1667 }); 1668 } 1669 }, 1670 close: function () { 1671 this.hasResults = false;
1672 this.keywords = ""; 1673 this.categories = [] 1674 }, 1675 setAutoComplete: function () { 1676 let self = this; 1677 this.autoCompleteJS = new autoComplete({ 1678 selector: "#ctrl_keywords_", 1679 placeHolder: "", 1680 threshold: 2, 1681 debounce: 600, 1682 submit: true, 1683 data: { 1684 src: async function (query) { 1685 let headers = new Headers(); 1686 headers.append('Accept', 'application/json'); 1687 headers.append('Content-Type', 'application/json'); 1688 const source = await fetch('/elastic/search/autocompletion?query=' + query, { 1689 method: "POST", 1690 headers: headers, 1691 cache: "no-cache", 1692 redirect: "follow", 1693 credentials: "same-origin", 1694 referrerPolicy: "no-referrer", 1695 body: JSON.stringify({ 1696 categories: self.categories, 1697 module: "", 1698 root: "" 1699 }) 1700 }); 1701 let results = []; 1702 let data = await source.json(); 1703 for (let i = 0; i < data.results['hits'].length; i++) { 1704 results.push(data.results['hits'][i]['term']); 1705 } 1706 return results; 1707 } 1708 }, 1709 resultsList: { 1710 maxResults: 50, 1711 tabSelect: true 1712 }, 1713 resultItem: { 1714 highlight: true 1715 }, 1716 events: { 1717 input: { 1718 selection: (event) => { 1719 self.keywords = event.detail.selection.value; 1720 self.fetch({}); 1721 }, 1722 keydown(event) { 1723 switch (event.keyCode) { 1724 case 40: 1725 case 38: 1726 event.preventDefault(); 1727 event.keyCode === 40 ? objState.autoCompleteJS.next() : objState.autoCompleteJS.previous(); 1728 break; 1729 case 9: 1730 event.preventDefault(); 1731 if (objState.autoCompleteJS.resultsList.tabSelect) { 1732 objState.autoCompleteJS.next() 1733 } 1734 break; 1735 case 27: 1736 objState.autoCompleteJS.input.value = ""; 1737 objState.autoCompleteJS.close(); 1738 break; 1739 case 13: 1740 event.preventDefault() 1741 self.submit(); 1742 objState.autoCompleteJS.close(); 1743 break; 1744 } 1745 } 1746 } 1747 } 1748 }); 1749 } 1750 }, 1751 watch: { 1752 'hasResults': { 1753 handler: function (val) { 1754 let objBody = document.querySelector('body'); 1755 if (val) { 1756 objBody.classList.add('search-panel-open'); 1757 } else { 1758 objBody.classList.remove('search-panel-open'); 1759 } 1760 } 1761 } 1762 }, 1763 mounted: function () { 1764 this.fetch({}); 1765 } 1766 }); 1767 window.elasticInstaces.push(elasticComponent); 1768 })(); 1769</script>
1769<script> 1770 document.addEventListener( 1771 "DOMContentLoaded", function () { 1772 const menu = document.querySelector('#mobile-show'); 1773 if (null !== menu && 0 === menu.querySelectorAll('li.active').length) { 1774 const trails = menu.querySelectorAll('li.trail'); 1775 if (0 < trails.length) { 1776 trails.item(trails.length - 1).classList.add('active'); 1777 } 1778 } 1779 new Mmenu('#mobile-show', {"navbar":{"title":"Men\u00fc"},"offCanvas":{"position":"left-front"},"slidingSubmenus":false,"theme":"white"}, {"classNames":{"selected":"active"}}); 1780 } 1781 ); 1782</script>
vendor: 1 bytes, line 1782
1782
1783<script src="/files/template/js/main.js?v=9fdcece1"></script>
1783<script src="/files/template/js/masonry/imagesloaded.pkgd.min.js?v=58bf596a"></script>
1783<script src="/files/template/js/masonry/masonry-config.js?v=7a3f53d5"></script>
1783<script src="/files/template/js/masonry/masonry.pkgd.js?v=66e69a74"></script>
1783<script src="/files/template/js/toggle_overlay.js?v=6ff317e0"></script>
1783<script src="/files/template/js/jquery-migrate-3.0.0.min.js?v=9c9b2812"></script>
1783<script src="/files/template/libs/featherlight/featherlight.js?v=51e6593a"></script>
1783<script src="/files/template/libs/slick/slick.min.js?v=51e6593a"></script>
1783<script src="/files/template/libs/nlwaypoints/lib/jquery.waypoints.min.js?v=262720f3"></script>
1783<script src="/files/template/libs/nlwaypoints/lib/noframework.waypoints.min.js?v=262720f3"></script>
1783<script src="/files/template/libs/Blob.js/Blob.js?v=262720f3"></script>
1783<script src="/files/template/libs/FileSaver.js/dist/FileSaver.min.js?v=262720f3"></script>
1783<script src="/files/template/js/isotope/isotope.pkgd.min.js?v=262720f3"></script>
1783<script src="/files/template/libs/ics.js/ics.min.js?v=262720f3"></script>
vendor: 1 bytes, line 1783
1783
1784<script> 1785var j = jQuery.noConflict(); 1786j( document ).ready(function() { 1787 if (j('#cbp-ntaccordion').length > 0) { 1788 j('#cbp-ntaccordion').cbpNTAccordion(); 1789 } 1790}); 1791</script>
vendor: 1 bytes, line 1791
1791
1792<script type="application/ld+json"> 1793{ 1794 "@context": "https:\/\/schema.org", 1795 "@graph": [ 1796 { 1797 "@type": "WebPage" 1798 }, 1799 { 1800 "@id": "#\/schema\/image\/de7dfc38-04bf-11eb-bea0-02000a1e000d", 1801 "@type": "ImageObject", 1802 "contentUrl": "\/assets\/images\/d\/Hemberge_Kirchgemeinden-sz9ckst72572mg5.jpg" 1803 }, 1804 { 1805 "@id": "#\/schema\/image\/945bc5f8-6333-11ec-912e-02000a1e000d", 1806 "@type": "ImageObject", 1807 "contentUrl": "\/files\/template\/img\/icons\/google_maps.svg" 1808 }, 1809 { 1810 "@id": "#\/schema\/image\/719332b5-6333-11ec-912e-02000a1e000d", 1811 "@type": "ImageObject", 1812 "contentUrl": "\/files\/template\/img\/icons\/youtube.svg" 1813 }, 1814 { 1815 "@id": "#\/schema\/image\/b59436a4-6333-11ec-912e-02000a1e000d", 1816 "@type": "ImageObject", 1817 "contentUrl": "\/files\/template\/img\/icons\/instagram.svg" 1818 }, 1819 { 1820 "@id": "#\/schema\/image\/d0282b42-6333-11ec-912e-02000a1e000d", 1821 "@type": "ImageObject", 1822 "contentUrl": "\/files\/template\/img\/icons\/vimeo.svg", 1823 "name": "zu Vimeo" 1824 } 1825 ] 1826} 1827</script>
vendor: 1 bytes, line 1827
1827
1828<script type="application/ld+json"> 1829{ 1830 "@context": "https:\/\/schema.contao.org", 1831 "@graph": [ 1832 { 1833 "@type": "Page", 1834 "fePreview": false, 1835 "groups": [], 1836 "noSearch": false, 1837 "pageId": 373, 1838 "protected": false, 1839 "title": "Unsere Kirchgemeinden" 1840 } 1841 ] 1842} 1843</script>
1843 1844 1845 1846 1847</body> 1848</html>
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.