PageSourceSearch

https://lingfieldparishchurch.org/

html lingfieldparishchurch.org collected 2026-09-25 00:58:01 UTC 84,855 bytes, 1,542 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en-GB">
3<head>
4<!-- start of head-->
5    <title>Lingfield & Dormansland Churches</title>
6	<link rel="shortcut icon" href="/_data/site/130/templates/current/favicon.ico" type="image/x-icon" />
7    <meta charset="utf-8">
8    <meta name="dcterms.rightsHolder" content="Khoo Systems Limited">
9    <meta name="dcterms.dateCopyrighted" content="2014">
10    <meta name="robots" content="all">
11    <meta name="description" content="Welcome to the United Benefice of Lingfield &amp; Dormansland! We&apos;re a friendly, warm community committed to loving &amp; serving all that live &amp; visit Lingfield &amp; Dormansland.">
12    <meta name="csrf_token" content="lingfieldpp:0xB267E1CF847B11F19A5EF23C9435931F:::1790297890:5e03aa3af8eb252038ad6c4666d7aa25">
13    <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet">
14
15<meta name="viewport" content="width=device-width, initial-scale=1.0">
16<meta property="og:type" content="website">
17<meta property="og:site_name" content="Lingfield Parish Church">
18<meta property="og:image" content="https://lingfieldparishchurch.org/cache/img/130/folder|123&sz500x500&cp&tn&ql&fm&bo&bc&sg7d8dc33d6a&ft1737121930&bannerVid.mp4">
19<meta property="og:title" content="Lingfield &amp; Dormansland Churches">
20<meta property="og:description" content="Welcome to the United Benefice of Lingfield &amp; Dormansland! We&#039;re a friendly, warm community committed to loving &amp; serving all that live &amp; visit Lingfield &amp; Dormansland.">
21<meta property="og:url" content="https://lingfieldparishchurch.org/123/Home">
22<meta name="twitter:card" content="summary_large_image">
23<meta name="twitter:title" content="Lingfield &amp; Dormansland Churches">
24<meta name="twitter:description" content="Welcome to the United Benefice of Lingfield &amp; Dormansland! We&#039;re a friendly, warm community committed to loving &amp; serving all that live &amp; visit Lingfield &amp; Dormansland.">
25<meta name="twitter:image" content="https://lingfieldparishchurch.org/cache/img/130/folder|123&sz500x500&cp&tn&ql&fm&bo&bc&sg7d8dc33d6a&ft1737121930&bannerVid.mp4">
26<script type='application/ld+json'>
27{"@type":"Organization","@context":"https://schema.org","@id":"https://lingfieldparishchurch.org/#organization","sameAs":["https://x.com/lingfieldchurch"],"name":"Lingfield Parish Church","url":"https://lingfieldparishchurch.org/","contactPoint":[{"@type":"ContactPoint","telephone":"+44-1342-832021","contactType":"customer support"}],"logo":"https://lingfieldparishchurch.org/_data/site/130/templates/current/mobile_logo.svg"}
28</script>
28
29
30<script type='application/ld+json'>
31{"@type":"WebSite","@context":"https://schema.org","@id":"https://lingfieldparishchurch.org/#website","url":"https://lingfieldparishchurch.org/","name":"Lingfield Parish Church","publisher":{"@id":"https://lingfieldparishchurch.org/#organization"}}
32</script>
32
33<!-- Start_Google_structured_data_breadcrumb -->
34<script type="application/ld+json">
35{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://lingfieldparishchurch.org/","name":"Home"}},{"@type":"ListItem","position":2,"item":{"@id":"https://lingfieldparishchurch.org/123/Home","name":"Home"}}]}
36</script>
36
37<!-- End_Google_structured_data_breadcrumb -->
38<link rel='canonical' href='https://lingfieldparishchurch.org/123/Home'>
39
40
41
42<link rel='stylesheet' type='text/css' href='/js/plugins/cookieconsent/dist/cookieconsent.css?v=5'>
43<link rel='stylesheet' type='text/css' href='/js/jquery-plugins/jquery-ui/jquery-ui.custom.css?v=5'>
44<link rel='stylesheet' type='text/css' href='https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.theme.css'>
45<link rel='stylesheet' type='text/css' href='https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css'>
46<link rel='stylesheet' type='text/css' href='https://cdn.jsdelivr.net/npm/shortcut-buttons-flatpickr/dist/themes/light.min.css'>
47<link rel='stylesheet' type='text/css' href='/css/default.css?v=5'>
48<link rel='stylesheet' type='text/css' href='/modules/folder/css/folder.css?v=5'>
49<link rel='stylesheet' type='text/css' href='/modules/contact/css/contact.css?v=5'>
50<link rel='stylesheet' type='text/css' href='/modules/news/css/news.css?v=5'>
51<link rel='stylesheet' type='text/css' href='/modules/pg/css/pg.css?v=5'>
52<link rel='stylesheet' type='text/css' href='/modules/search/css/search.css?v=5'>
53<link rel='stylesheet' type='text/css' href='/modules/user/css/user.css?v=5'>
54<link rel='stylesheet' type='text/css' href='/modules/attribute/css/attribute.css?v=5'>
55<link rel='stylesheet' type='text/css' href='/modules/calendar/css/calendar.css?v=5'>
56<link rel='stylesheet' type='text/css' href='/modules/directory/css/directory.css?v=5'>
57<link rel='stylesheet' type='text/css' href='/modules/crm/css/crm.css?v=5'>
58<link rel='stylesheet' type='text/css' href='/modules/sermon/css/sermon.css?v=5'>
59<link rel='stylesheet' type='text/css' href='/css/search-autocomplete.css?v=5'>
60<link rel='stylesheet' type='text/css' href='/js/plugins/swiper/swiper-bundle.min.css?v=5'>
61
62<link rel='stylesheet' type='text/css' href='/cache/css/130/modern-form.css?v=5.1762163111'>
63<link rel='stylesheet' type='text/css' href='/cache/css/130/responsive.css?v=5.1762163111'>
64<link rel='stylesheet' type='text/css' href='/cache/css/130/menu.css?v=5.1762163111'>
65<link rel='stylesheet' type='text/css' href='/cache/css/130/ecampaign.css?v=5.1762163111'>
66<link rel='stylesheet' type='text/css' href='/cache/css/130/calevent.css?v=5.1762163111'>
67<link rel='stylesheet' type='text/css' href='/cache/css/130/template_fonts.css?v=5.1762163111'>
68<link rel='stylesheet' type='text/css' href='/cache/css/130/template.css?v=5.1762163111'>
69<link rel='stylesheet' type='text/css' href='/cache/css/130/template_custom.css?v=5.1762163111'>
70
71
72<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js'></script>
vendor: 1 bytes, line 72
72
73<script defer src='https://cdn.jsdelivr.net/npm/[email protected]/dist/purify.min.js'></script>
vendor: 1 bytes, line 73
73
74<script defer src='https://unpkg.com/[email protected]/dist/htmx.min.js'></script>
vendor: 1 bytes, line 74
74
75<script defer src='https://cdn.jsdelivr.net/npm/@alpinejs/[email protected]/dist/cdn.min.js'></script>
vendor: 1 bytes, line 75
75
76<script defer src='https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js'></script>
vendor: 1 bytes, line 76
76
77<script defer src='https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js'></script>
vendor: 1 bytes, line 77
77
78<script defer src='https://cdn.jsdelivr.net/npm/tippy.js@6/dist/tippy-bundle.umd.js'></script>
vendor: 1 bytes, line 78
78
79<script async src="//fast.fonts.net/t/1.css?apiType=css&projectid=0bb1eb5d-9067-46ac-8547-e21c7e6bec60">
80</script>
80
81<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/[email protected]/dist/jquery.fancybox.min.css" />
82<script src="https://cdn.jsdelivr.net/gh/fancyapps/[email protected]/dist/jquery.fancybox.min.js"></script>
vendor: 1 bytes, line 82
82
83<script src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js'></script>
vendor: 1 bytes, line 83
83
84<script defer src='/js/jquery-plugins/jquery.validate/jquery.validate.min.js?v=5'></script>
vendor: 1 bytes, line 84
84
85<script defer src='/js/jquery-plugins/jquery.validate/additional/creditcard.js?v=5'></script>
vendor: 1 bytes, line 85
85
86<script defer src='/js/component/matchHeight.js?v=5'></script>
vendor: 1 bytes, line 86
86
87<script defer src='/js/plugins/headroom/headroom.min.js?v=5'></script>
vendor: 1 bytes, line 87
87
88<script defer src='/js/plugins/lazyload/lazyload.js?v=5'></script>
vendor: 1 bytes, line 88
88
89<script>
90document.addEventListener("DOMContentLoaded",function(){lazyload();});
91</script>
vendor: 1 bytes, line 91
91
92<script defer src='https://cdn.jsdelivr.net/npm/flatpickr'></script>
vendor: 1 bytes, line 92
92
93<script defer src='https://cdn.jsdelivr.net/npm/shortcut-buttons-flatpickr/dist/shortcut-buttons-flatpickr.min.js'></script>
vendor: 1 bytes, line 93
93
94<script defer src='/js/plugins/base64.js?v=5'></script>
vendor: 1 bytes, line 94
94
95<script src='/js/default.js?v=5'></script>
vendor: 1 bytes, line 95
95
96<script defer src='/modules/menu/js/menu_h.js?v=5'></script>
vendor: 1 bytes, line 96
96
97<script defer src='/modules/menu/js/menu_hamb.js?v=5'></script>
vendor: 1 bytes, line 97
97
98<script defer src='/modules/menu/js/menu_mega.js?v=5'></script>
vendor: 1 bytes, line 98
98
99<script defer src='/js/component/searchAutocomplete.js?v=5'></script>
vendor: 1 bytes, line 99
99
100<script defer src='/js/plugins/swiper/swiper-bundle.min.js?v=5'></script>
vendor: 1 bytes, line 100
100
101<script defer src='/js/component/swiperLegacyAlias.js?v=5'></script>
101
102
103
104
105<link rel='alternate' type='application/rss+xml' href='/123/xml/' title='RSS feed'>
106<link rel='alternate' type='application/rss+xml' href='/123/podfeed/' title='Podcast feed'>
107<!--end of head -->
108</head>
109<body class="body-template body-123 _body-123 body-folder body-layout-preset-1104 browser-chrome engine-webkit majorver-128 ver-128.0.0.0 is-desktop geo-US  body-menu-hamb body-menu-hamb-left body-menu-hamb-slide   ">
110	
111		<div id="q-app">
112		<div id="shim"></div>
113		<div id='menu-hamb' class='left slide'><a id='menu-icon-close'>		<svg style="fill:#fff" version="1.1" id="hamb-icon" class="hamb-icon-svg" 
114			xmlns="http://www.w3.org/2000/svg" 
115			xmlns:xlink="http://www.w3.org/1999/xlink" 
116			x="0px" y="0px" width="45px" height="45px" 
117			viewBox="0 0 128 128" 
118			enable-background="new 0 0 128 128" xml:space="preserve">
119		<g>
120			<rect style="fill:#e0b24c;" id="hamb-icon-close-box" x="0" y="0" width="128" height="128"/>
121			<g transform="matrix(0.5, 0, 0, 0.5, 32,32)">
122				<g id="close" transform="translate(18.000000, 18.000000)">
123					<path d="M92,9.19938255 L82.8006174,0 L46,36.8006174 L9.19938255,0 L0,9.19938255 L36.8006174,46 L0,82.8006174 L9.19938255,92 L46,55.1993826 L82.8006174,92 L92,82.8006174 L55.1993826,46 L92,9.19938255 Z" id="Shape"></path>
124				</g>
125			</g>
126		</g>
127		</svg></a><ul class=' n0'><li class='n738 show-items folder' data-nav-id='738'><div><a class=' ajax-branch' href='/738/St-Peter-and-St-Pauls-Church-Lingfield' >St Peter's &amp; St Paul's	</a><a class='menu-branch ajax' href='/738/ajax/menu_branch.php' rel='nofollow'>&nbsp;</a></div></li><li class='n737 show-items folder' data-nav-id='737'><div><a class=' ajax-branch' href='/737/St-Johns' >St John's</a><a class='menu-branch ajax' href='/737/ajax/menu_branch.php' rel='nofollow'>&nbsp;</a></div></li><li class='n843 pg' data-nav-id='843'><div><a class='' href='/843/Give' >Give</a></div></li><li class='n940 show-items folder' data-nav-id='940'><div><a class=' ajax-branch' href='/940/News' >News</a><a class='menu-branch ajax' href='/940/ajax/menu_branch.php' rel='nofollow'>&nbsp;</a></div></li><li class='n3 show-items folder' data-nav-id='3'><div><a class=' ajax-branch' href='/3/Safeguarding' >Safeguarding</a><a class='menu-branch ajax' href='/3/ajax/menu_branch.php' rel='nofollow'>&nbsp;</a></div></li><li class='n13 hide-items folder' data-nav-id='13'><div><a class='' href='/13/Get-To-Know-Us' >Get To Know Us</a></div></li><li class='n311 hide-items folder' data-nav-id='311'><div><a class='' href='/311/Contact-Us' >Contact</a></div></li></ul></div>
128		<div id="header-fixed" class="header--fixed">
129				  	
129<script>
130	  		$(function(){
131				var header = document.querySelector("#header-fixed");
132				if (window.location.hash) {
133				  header.classList.add("slide--up");
134				}
135				var headroom = new Headroom(header, {
136					tolerance: {
137					  down : 10,
138					  up : 20
139					},
140					offset: 100
141				}).init();
142	  		})
143	  	</script>
143	  	<header id="header-mob">
144	  		<div id="header-mob-box">
145	  			<a id="header-mob-logo"  href="/"></a>
146				<div id="mobile-actions">
147	
148	
149	<svg id='mobile-search-icon' viewBox='0 0 100 100' x-data @click="$dispatch('toggle-mobile-search')"><path d='M94.5,88.6L76.8,70.9c6.6-7.4,10.7-17.2,10.7-27.9c0-23.1-18.8-41.9-41.9-41.9S3.7,19.9,3.7,43s18.8,41.9,41.9,41.9c8.2,0,15.8-2.4,22.2-6.4l18.4,18.4c1.1,1.1,2.6,1.7,4.1,1.7c1.5,0,3-0.6,4.1-1.7C96.8,94.6,96.8,90.9,94.5,88.6z M15.4,43c0-16.6,13.5-30.2,30.2-30.2S75.7,26.4,75.7,43S62.2,73.2,45.6,73.2S15.4,59.7,15.4,43z'/></svg>
150</div>
151<div id="mobile-search"
152     x-data="{ open: false }"
153     :class="{ 'is-open': open }"
154     @toggle-mobile-search.window="open = !open">
155	<form action="/search/index.htm" method="post">
156		<img id="icon-search" src="/media/icons/search.svg" alt="" width="18" height="18">
157		<input name="p_search"
158		       value=""
159		       type="text"
160		       placeholder="Search"
161		       autocomplete="off"
162		       data-autocomplete-url="/search/ajax/search_select.php"
163		       data-autocomplete-min="3"
164		       data-autocomplete-delay="100" />
165		<img id="close-search" src="/media/icons/close.svg" alt="Close" width="18" height="18" @click="open = false">
166	</form>
167</div>
168
169<div id='menu-icon-wrapper'><div id='menu-icon'>		<svg style="fill:#fff" version="1.1" id="hamb-icon" class="hamb-icon-svg" 
170			xmlns="http://www.w3.org/2000/svg" 
171			xmlns:xlink="http://www.w3.org/1999/xlink" 
172			x="0px" y="0px" width="45px" height="45px" 
173			viewBox="0 0 128 128" 
174			enable-background="new 0 0 128 128" xml:space="preserve">
175		<g>
176			<rect style="fill:#e0b24c;" id="hamb-icon-box" x="0" y="0" width="128" height="128"/>
177			<g transform="matrix(0.6, 0, 0, 0.6, 25.6,25.6)">
178				<rect x="24" y="60" width="80" height="8"/>
179				<rect x="24" y="36" width="80" height="8"/>
180				<rect x="24" y="84" width="80" height="8"/>
181			</g>
182		</g>
183		</svg></div></div>
184			</div>
185			<div id='mobile-trolley-notification'></div>
186		</header>
187		</div>
188
189		<div id="template-content" class="template template-box">
190			<a id="staging-box" href="/_default/staging.htm">You are viewing this site in staging mode. Click in this bar to return to normal site.</a>
191			<div id="svg-icons"><!-- --></div>
192			<div id="notify-container"><div id="basic-template"><a class="ui-notify-close ui-notify-cross" href="#">x</a>#{notify_img}<div class="notify-title">#{notify_title}</div><div class="notify-text">#{notify_text}</div></div></div>
193			<div class="modal-dlg" id="modal-dlg"><!-- --></div>
194			<div class="modal-dlg" id="modal-dlg1"><!-- --></div>
195			<div class="modal-dlg" id="modal-dlg2"><!-- --></div>
196
197			<div id="browser-box">
198				<div id="page-box">
199					<div id="header-nav">
200						  			<header id="header">
201				<div id="header-inner" class="section-inner"><!-- -->
202				<div id="header-box">
203					<div class="header-logo"><a href="/"><img src="/_data/site/130/_default/unitedBeneficeLingDormsWhite.svg" alt="Benefice of Lingfield &amp; Dormansland Church Logo" /></a></div>
204<div class="search-slide-down-btn">&nbsp;</div>
205<div class="search-slide-down"><svg xmlns="http://www.w3.org/2000/svg" style="display:none">
206    <symbol xmlns="http://www.w3.org/2000/svg" id="sbx-icon-clear-3" viewBox="0 0 20 20">
207    <path d="M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z" fill-rule="evenodd" ></path>
208  </symbol>
209</svg>
210
211<form id="search" class="searchform" action="/search/" method="post">
212     <input id="p-search" name="p_search" value="" size="50" placeholder="Search for…" class="ui-autocomplete-input" autocomplete="off" type="text">
213     <button type="submit" title="Submit your search query." class="p-search-submit">
214    </button>
215</form>
216
217<script type="text/javascript">
218$( document ).ready(function() {
219  $(".search-slide-down-btn").click(function(){
220    $(".search-slide-down").slideToggle("500", "easeInOutCirc");
221  });
222  $("#btn_onclick").click(function() {
223  $(".btn-search-top").toggleClass("transparent");
224  });
225});
226</script>
226
227
228<script type="text/javascript">
229	$(function(){
230		$( "#p-search" ).autocomplete({			
231			source: function( request, response ) {
232				$.ajax({
233					url: "/search/ajax/search_select.php",
234					dataType: "json",
235					data: { 'term': request.term },
236					success: function(data){
237						response( $.map( data, function( item ) {
238							return {
239								value: 			item.value,
240								title: 			item.title,
241								description: 	item.description,
242								id:				item.title,
243								thumb: 			item.thumb,
244								link: 			item.link
245							}
246						}))
247					}
248				});
249			}, delay: '100',			
250			minLength: 3,
251			select: function( event, ui ) {				
252				window.location.href = ui.item.link;
253			}
254		})
255		.data("uiAutocomplete")._renderItem = function( ul, item ) {		   
256		   imgHTML 		='';
257		   noImgClass	=''
258		   if (item.thumb) {
259				imgHTML = "<div class='thumb' style='background-image:url(\""+item.thumb +"\")\'></div>"
260		   } else {
261				noImgClass = "class='no-img'"
262		   }		   
263		   description = (item.description !== undefined) ? '<span class="item-description">' +item.description+ '</span>': '';		   
264		   li = $( "<li "+noImgClass+"></li>" )
265		   .data( "item.autocomplete", item )		  
266		   .append( "<a href='"+item.link+"'>"+ imgHTML + '<span class="item-title">'+ item.title + "</span>"+ description +"</a>")
267		   .appendTo( ul );
268		   return li
269		};  
270	})
271</script>
271</div>
272				</div>
273				</div>
274			</header>
275										<nav id="h-nav">
276					<div id="h-nav-inner" class="section-inner">
277						<div id="h-nav-box">
278							<div id='menu-h'><ul class=' n0'><li class='n738 show-items folder' data-nav-id='738'><div><a class=' ajax-branch' href='/738/St-Peter-and-St-Pauls-Church-Lingfield' >St Peter's &amp; St Paul's	</a><a class='menu-branch ajax' href='/738/ajax/menu_branch.php' rel='nofollow'>&nbsp;</a></div></li><li class='n737 show-items folder' data-nav-id='737'><div><a class=' ajax-branch' href='/737/St-Johns' >St John's</a><a class='menu-branch ajax' href='/737/ajax/menu_branch.php' rel='nofollow'>&nbsp;</a></div></li><li class='n843 pg' data-nav-id='843'><div><a class='' href='/843/Give' >Give</a></div></li><li class='n940 show-items folder' data-nav-id='940'><div><a class=' ajax-branch' href='/940/News' >News</a><a class='menu-branch ajax' href='/940/ajax/menu_branch.php' rel='nofollow'>&nbsp;</a></div></li><li class='n3 show-items folder' data-nav-id='3'><div><a class=' ajax-branch' href='/3/Safeguarding' >Safeguarding</a><a class='menu-branch ajax' href='/3/ajax/menu_branch.php' rel='nofollow'>&nbsp;</a></div></li><li class='n13 hide-items folder' data-nav-id='13'><div><a class='' href='/13/Get-To-Know-Us' >Get To Know Us</a></div></li><li class='n311 hide-items folder' data-nav-id='311'><div><a class='' href='/311/Contact-Us' >Contact</a></div></li></ul></div>
279						</div>
280					</div>
281				</nav>
282				
283						
284					</div>
285								<section id="body-header"><!--  -->
286				<div id="body-header-inner"  class="section-inner" ><!--  -->
287					<div id="body-header-box">
288					<div><div class='pg-gallery-fw'><div id="gallery-fw-wrapper-123" class='gallery-fw-wrapper-preset-675 breakout'>
289	<div class="gallery-fw-caption cycle-overlay"><div class="caption-description"><h1 class='pg-title'>Home</h1></div></div>
290	<div id="gallery-fw-123" class='swiper slick-slider cycle-slideshow gallery-fw-preset-675'>
291		<div class='swiper-wrapper slick-list slick-track'>
292			<div class='swiper-slide slick-slide cycle-slide im-wrapper video ' data-title='' data-description='&lt;h1 class=&#039;pg-title&#039;&gt;Home&lt;/h1&gt;' data-link="">
293				<video playsinline autoplay muted loop  poster="/_data/site/130/folder/123/bannerVid.mp4" class="bgvid">
294					<source src="/_data/site/130/folder/123/bannerVid.mp4" type="video/mp4">
295				</video>
296			</div>
297			<div class='swiper-slide slick-slide cycle-slide im-wrapper ' style='background-image:url(/cache/img/130/folder|123&sz3000x3000&cp&tn&ql&fm&bo&bc&sgcc55e57f1e&ft1737123292&bannerRupertsChristening-C-43.jpg)' data-title='' data-description='&lt;h1 class=&#039;pg-title&#039;&gt;Home&lt;/h1&gt;' data-link=""></div>
298			<div class='swiper-slide slick-slide cycle-slide im-wrapper ' style='background-image:url(/cache/img/130/folder|123&sz3000x3000&cp&tn&ql&fm&bo&bc&sg823bb311d4&ft1737123424&bannerCandleLighting.jpg)' data-title='' data-description='&lt;h1 class=&#039;pg-title&#039;&gt;Home&lt;/h1&gt;' data-link=""></div>
299			<div class='swiper-slide slick-slide cycle-slide im-wrapper ' style='background-image:url(/cache/img/130/folder|123&sz3000x3000&cp&tn&ql&fm&bo&bc&sg13ce76ff24&ft1737123623&bannerWedding.jpg)' data-title='' data-description='&lt;h1 class=&#039;pg-title&#039;&gt;Home&lt;/h1&gt;' data-link=""></div>
300			<div class='swiper-slide slick-slide cycle-slide im-wrapper ' style='background-image:url(/cache/img/130/folder|123&sz3000x3000&cp&tn&ql&fm&bo&bc&sg68bf170748&ft1737106746&bannerChristingle.jpg)' data-title='' data-description='&lt;h1 class=&#039;pg-title&#039;&gt;Home&lt;/h1&gt;' data-link=""></div>
301		</div>
302		
303		
304	</div>
305	
306</div>
307
308<style>
309	.gallery-fw-wrapper-preset-675 {min-height:60vh}
310.gallery-fw-wrapper-preset-675 .im-wrapper {background-size:cover;background-position:center center;width:100%;height:60vh}
311#gallery-fw-123 {width:100%;min-width:0px;max-width:100%;overflow:hidden}
312.gallery-fw-wrapper-preset-675 .swiper-button-prev {background:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='15 6 9 12 15 18'/></svg>") no-repeat scroll 20% 50% rgba(0, 0, 0, 0);background-size:30px 30px;left:0px;margin-top:0px}
313.gallery-fw-wrapper-preset-675 .swiper-button-next {background:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='9 6 15 12 9 18'/></svg>") no-repeat scroll 80% 50% rgba(0, 0, 0, 0);background-size:30px 30px;right:0px;margin-top:0px}
314.gallery-fw-wrapper-preset-675 .swiper-button-prev:hover, #gallery-fw-123 .swiper-button-next:hover {opacity:1}
315.gallery-fw-wrapper-preset-675 .swiper-button-prev, #gallery-fw-123 .swiper-button-next {cursor:pointer;position:absolute;height:100%;opacity:0;top:0px;width:20%;z-index:800}
316.gallery-fw-wrapper-preset-675 .swiper-pagination {text-align:center;position:absolute;overflow:hidden;z-index:500}
317.gallery-fw-wrapper-preset-675 .swiper-pagination-bullet {font-family:arial;font-size:50px;width:16px;height:16px;display:inline-block;color:#ddd;cursor:pointer}
318.gallery-fw-wrapper-preset-675 .swiper-pagination-bullet-active {color:#D69746}
319.gallery-fw-wrapper-preset-675 .gallery-fw-caption {pointer-events:none;position:absolute;bottom:0px;left:0px;right:0px;z-index:500}
320.gallery-fw-wrapper-preset-675 .gallery-fw-caption .caption-description {pointer-events:none;color:#ffffff;height:100%}
321.gallery-fw-wrapper-preset-675 .im-wrapper.video {overflow:hidden}
322.gallery-fw-wrapper-preset-675 .im-wrapper.video video {width:100%;object-fit:cover;min-height:60vh;max-height:60vh}
323@media only screen and (max-width: 767px ) {
324#gallery-fw-wrapper-123 {min-height:60vh}
325.gallery-fw-wrapper-preset-675 .im-wrapper {height:60vh}
326.gallery-fw-wrapper-preset-675 .im-wrapper.video video {object-fit:cover;min-height:60vh;max-height:60vh}
327}
328
329</style>
330<script>
331(function(){
332	var navId = 123;
333	function init() {
334		var root = document.getElementById('gallery-fw-' + navId);
335		if (!root || typeof Swiper === 'undefined') return;
336
337		var swiper = new Swiper(root, {"speed":1000,"effect":"fade","direction":"horizontal","fadeEffect":{"crossFade":true},"autoplay":{"delay":8000,"disableOnInteraction":false},"rewind":true});
338		if (typeof window.swiperLegacyAlias === 'function') window.swiperLegacyAlias(swiper);
339
340		/* Swiper auto-attaches click listeners to navigation buttons,
341		 * but on opacity:0 buttons inside our breakout/table-cell
342		 * layout those clicks were observed not firing. Bind
343		 * explicit handlers as a guarantee. Calling slideNext/Prev
344		 * while a transition is in flight is safe (Swiper's own
345		 * isLocked/animating guards handle the no-op). */
346		var prevBtn = root.querySelector('.swiper-button-prev');
347		var nextBtn = root.querySelector('.swiper-button-next');
348		if (prevBtn) prevBtn.addEventListener('click', function(e){ e.stopPropagation(); swiper.slidePrev(); });
349		if (nextBtn) nextBtn.addEventListener('click', function(e){ e.stopPropagation(); swiper.slideNext(); });
350
351		var captionEnabled = (1 === 1);
352		if (captionEnabled) {
353			var caption = root.parentNode.querySelector('.gallery-fw-caption .caption-description');
354			if (caption) {
355				/* The first slide's caption is rendered server-side (FwImage.php),
356				 * so interactive content in it (e.g. a lightbox CTA) is present at
357				 * parse time and bound by page-level init like any static markup —
358				 * no initial JS injection here. On slide change we swap in the new
359				 * slide's caption from data-description and fire a bubbling
360				 * 'gallery:caption-changed' event so any plugin that binds to
361				 * injected markup can rescan. The widget stays framework-agnostic
362				 * and never hard-codes a plugin selector. */
363				var setCaption = function(s) {
364					var slides = root.querySelectorAll('.swiper-slide:not(.swiper-slide-duplicate)');
365					var active = slides[s.realIndex];
366					caption.innerHTML = (active && active.dataset.description) ? active.dataset.description : '';
367					caption.dispatchEvent(new CustomEvent('gallery:caption-changed', { bubbles: true, detail: { slide: s.realIndex } }));
368				};
369				swiper.on('slideChangeTransitionStart', setCaption);
370			}
371		}
372
373		root.querySelectorAll('video.bgvid').forEach(function(v){
374			var p = v.play();
375			if (p && p.catch) p.catch(function(){});
376		});
377
378		root.addEventListener('click', function(e){
379			if (e.target.closest('.swiper-button-prev, .swiper-button-next, .swiper-pagination')) return;
380			var link = e.target.closest('.linkable');
381			if (!link) return;
382			var href = link.dataset.link;
383			if (href) window.location = href;
384		});
385	}
386
387	if (document.readyState === 'loading') {
388		document.addEventListener('DOMContentLoaded', init);
389	} else {
390		init();
391	}
392})();
393</script>
393
394</div></div>
395<div class="breakout">
396<div class="block-fw block-padding pale-grey-bg">
397<div class="section-inner">
398<h1 style="text-align: center;">Welcome to the United Benefice of Lingfield &amp;&nbsp;Dormansland!</h1>
399<h2 style="text-align: center;">We are a friendly, warm community committed to loving and serving all that live and visit Lingfield and Dormansland, whatever your life journey or story.</h2>
400</div>
401</div>
402</div>
403<div class="block-fw block-padding padding-bottom-ten">
404<h2 class="heading" style="text-align: center;">Our Parish is made up of two churches:</h2>
405<div class='pg-folder '>
405<script>
406function ajax_load_more(scroll){
407	$.ajax({
408		url: '/123/ajax/folder_page.php',
409		data: {'idx': '0xB267E1CF847B11F19A5EF23C9435931F', 'npage': npage },
410		type: "GET",
411		dataType: "html",
412		success: function(data) {
413			if (data) { scroll.replaceWith(data);}
414			lazyload();
415			if (typeof folder_tile_match_height === 'function'){
416				folder_tile_match_height();
417			}
418		}
419	})
420}
421</script>
421
422
423<!-- BEGIN scriptBlock -->
424<script>
425	$(function(){
426		
427	})
428</script>
428
429<!-- END scriptBlock -->
430
431<style>
432.folder-preset-836 .folder-view li .caption {color:#fff;min-height:100%}
433.folder-preset-836 .folder-view li .caption h3 {color:#fff}
434.folder-preset-836 .folder-view li .caption.over.top {top:0px}
435.folder-preset-836 .folder-view li .caption.over.bottom {bottom:0px}
436.folder-preset-836 .folder-view li .caption.fade {visibility:hidden;opacity:0;-webkit-transition:-webkit-visibility 0s linear 0.5s,opacity 0.5s linear;-moz-transition:-moz-visibility 0s linear 0.5s,opacity 0.5s linear;transition:visibility 0s linear 0.5s,opacity 0.5s linear}
437.folder-preset-836 .folder-view li:hover .caption.fade {visibility:visible;opacity:1;transition-delay:0s}
438.folder-preset-836 .folder-view li:hover .caption.over.slide,
439					  .folder-preset-836 .folder-view li.mobi-clicked .caption {height:100%}
440.mobile .folder-preset-836 .folder-view li:hover .caption.over.slide {height:0px}
441.mobile .folder-preset-836 .folder-view li.mobi-clicked .caption,
442					  .mobile .folder-preset-836 .folder-view li.mobi-clicked .caption.over.slide {height:100%}
443.folder-preset-836 .folder-tile {margin-right:-50px}
444.folder-preset-836 .folder-tile .img-block {border-style:solid}
445.folder-preset-836 .folder-tile li {width:100%;padding-right:50px}
446.folder-preset-836 .folder-tile li.item::after {content:"";display:block;height:50px;width:100%}
447
448@media screen and (min-width: 768px) {
449.folder-preset-836 .folder-tile li {width:50%}
450.folder-preset-836 .folder-tile li:nth-of-type(1n+1) {clear:none}
451.folder-preset-836 .folder-tile li:nth-of-type(2n+1) {clear:both}
452}
453
454.folder-preset-836 .folder-list li .column-image {order:0}
455.folder-preset-836 .folder-list li.img-inline .img-wrapper {margin-bottom:0px}
456.folder-preset-836 .folder-list .column-image.hidden {display:none}
457.folder-preset-836 .folder-list li div.img-block {border-style:solid}
458.folder-preset-836 .folder-list li.img-inline div.img-block {width:100%;border-style:solid}
459.folder-preset-836 .folder-list li.img-inline div.img-block img {max-height:0px}
460.folder-preset-836 .folder-list li.item::after {height:0px}
461
462
463@media screen and (max-width: 767px) {
464.folder-preset-836 .folder-list li div.img-block {width:100%;height:auto}
465.folder-preset-836 .folder-list li div.img-block .img {background-size:contain}
466}
467
468</style>
469
470<div class="folder-wrapper folder-wrapper-123  folder-preset-836 ">
471<div class="folder-options ">
472
473
474</div>
475<ul class="folder-view folder-folder folder-tile ">
476	<li id="nav_739" class="item item-739 item-redirect img-use-crop  item-idx-0xB267EB80847B11F19A5EF23C9435931F" data-idx="0xB267EB80847B11F19A5EF23C9435931F">
477		
478<div class="fg-row">
479	<div class="columns medium-6 large-6 column-image ">
480		<!-- BEGIN imgBlock -->
481		<div class="img-wrapper">
482			<div class="img-block"  href="/lib/static/img.php?im=/_data/site/130/redirect/739/stPeterBanner.jpg&sz=1500x1500&cp=1">
483	<a class="pg-link" href="/739/St-Peter-St-Pauls-Lingfield" >
484	<div class="img img-alt   lazyload" style="" data-src=""></div>
485	<div class="img img-main  lazyload" style="background-image:url(&apos;/_.gif&apos;);" data-src="/cache/img/130/redirect|739&sz900x880&cp1&tn&ql&fm&bo&bc&sgf616434c9a&ft1730132139&stPeterBanner.jpg"></div>
486	<img src='/cache/img/130/redirect|739&sz900x880&cp1&tn&ql1&fmjpg&bo&bc&sgf616434c9a&ft1730132139&stPeterBanner.jpg' alt='St Peter &amp; St Paul’s Lingfield'>
487	</a>
488</div>
489			<div class="caption over top" onclick="window.location.href='/739/St-Peter-St-Pauls-Lingfield'">
490				<div class="caption-text-wrapper">
491					<a class='pg-title-link pg-link' href='/739/St-Peter-St-Pauls-Lingfield' ><h3 class='pg-title-list'>St Peter & St Paul’s Lingfield</h3></a>
492					
493					<a href="/739/St-Peter-St-Pauls-Lingfield">Find out more</a>
494				</div>
495			</div>
496		</div>
497		<!-- END imgBlock -->
498	</div>
499	<div class="folder-details columns medium-6 large-6 column-body">
500		<a class='pg-title-link pg-link' href='/739/St-Peter-St-Pauls-Lingfield' ><h3 class='pg-title-list'>St Peter & St Paul’s Lingfield</h3></a>
501		
502		
503	</div>
504</div>
505	</li>
506	<li id="nav_740" class="item item-740 item-redirect img-use-crop  item-idx-0xB267ED5F847B11F19A5EF23C9435931F" data-idx="0xB267ED5F847B11F19A5EF23C9435931F">
507		
508<div class="fg-row">
509	<div class="columns medium-6 large-6 column-image ">
510		<!-- BEGIN imgBlock -->
511		<div class="img-wrapper">
512			<div class="img-block"  href="/lib/static/img.php?im=/_data/site/130/redirect/740/stJohnBlock.11.jpg&sz=1500x1500&cp=1">
513	<a class="pg-link" href="/740/St-John-the-Evangelist-Dormansland" >
514	<div class="img img-alt   lazyload" style="" data-src=""></div>
515	<div class="img img-main  lazyload" style="background-image:url(&apos;/_.gif&apos;);" data-src="/cache/img/130/redirect|740&sz900x880&cp1&tn&ql&fm&bo&bc&sgd245fe0108&ft1737107120&stJohnBlock.11.jpg"></div>
516	<img src='/cache/img/130/redirect|740&sz900x880&cp1&tn&ql1&fmjpg&bo&bc&sgd245fe0108&ft1737107120&stJohnBlock.11.jpg' alt='St John the Evangelist, Dormansland'>
517	</a>
518</div>
519			<div class="caption over top" onclick="window.location.href='/740/St-John-the-Evangelist-Dormansland'">
520				<div class="caption-text-wrapper">
521					<a class='pg-title-link pg-link' href='/740/St-John-the-Evangelist-Dormansland' ><h3 class='pg-title-list'>St John the Evangelist, Dormansland</h3></a>
522					
523					<a href="/740/St-John-the-Evangelist-Dormansland">Find out more</a>
524				</div>
525			</div>
526		</div>
527		<!-- END imgBlock -->
528	</div>
529	<div class="folder-details columns medium-6 large-6 column-body">
530		<a class='pg-title-link pg-link' href='/740/St-John-the-Evangelist-Dormansland' ><h3 class='pg-title-list'>St John the Evangelist, Dormansland</h3></a>
531		
532		
533	</div>
534</div>
535	</li>
536
537</ul>
538</div>
539</div></div>
540<div class="breakout">
541<div class="block-fw sunset-bg">
542<div class="trans-bg block-padding padding-extra">
543<div class="section-inner">
544<h2 class="subheading">Sunday Services At Parish Church &amp; At St&nbsp;John's&nbsp;Dormansland:</h2>
545<h4>8.00am Said Eucharist</h4>
546<h4>10.00am Sung Eucharist</h4>
547<div class="button-cta-wrapper align-left"><a class="button-cta button-white button-minor" href="/836/Services">St Peter &amp; St Paul's Services</a></div>
548<div class="button-cta-wrapper align-left"><a class="button-cta button-white button-minor" href="/849/Services">St John's Services</a></div>
549</div>
550</div>
551</div>
552</div>
553<div class="block-fw block-padding padding-bottom-ten">
554<div class="section-inner"><div class='pg-related'>
554<script>
555function ajax_load_more(scroll){
556	$.ajax({
557		url: '/123/ajax/folder_page.php',
558		data: {'idx': '0xB267E1CF847B11F19A5EF23C9435931F', 'npage': npage },
559		type: "GET",
560		dataType: "html",
561		success: function(data) {
562			if (data) { scroll.replaceWith(data);}
563			lazyload();
564			if (typeof folder_tile_match_height === 'function'){
565				folder_tile_match_height();
566			}
567		}
568	})
569}
570</script>
570
571
572<!-- BEGIN scriptBlock -->
573<script>
574	$(function(){
575		
576	})
577</script>
577
578<!-- END scriptBlock -->
579
580<style>
581.folder-preset-835 .folder-view li .caption {color:#fff;min-height:100%}
582.folder-preset-835 .folder-view li .caption h3 {color:#fff}
583.folder-preset-835 .folder-view li .caption.over.top {top:0px}
584.folder-preset-835 .folder-view li .caption.over.bottom {bottom:0px}
585.folder-preset-835 .folder-view li .caption.fade {visibility:hidden;opacity:0;-webkit-transition:-webkit-visibility 0s linear 0.5s,opacity 0.5s linear;-moz-transition:-moz-visibility 0s linear 0.5s,opacity 0.5s linear;transition:visibility 0s linear 0.5s,opacity 0.5s linear}
586.folder-preset-835 .folder-view li:hover .caption.fade {visibility:visible;opacity:1;transition-delay:0s}
587.folder-preset-835 .folder-view li:hover .caption.over.slide,
588					  .folder-preset-835 .folder-view li.mobi-clicked .caption {height:100%}
589.mobile .folder-preset-835 .folder-view li:hover .caption.over.slide {height:0px}
590.mobile .folder-preset-835 .folder-view li.mobi-clicked .caption,
591					  .mobile .folder-preset-835 .folder-view li.mobi-clicked .caption.over.slide {height:100%}
592.folder-preset-835 .folder-tile {margin-right:-50px}
593.folder-preset-835 .folder-tile .img-block {border-style:solid}
594.folder-preset-835 .folder-tile li {width:100%;padding-right:50px}
595.folder-preset-835 .folder-tile li.item::after {content:"";display:block;height:50px;width:100%}
596
597@media screen and (min-width: 670px) {
598.folder-preset-835 .folder-tile li {width:50%}
599.folder-preset-835 .folder-tile li:nth-of-type(1n+1) {clear:none}
600.folder-preset-835 .folder-tile li:nth-of-type(2n+1) {clear:both}
601}
602@media screen and (min-width: 768px) {
603.folder-preset-835 .folder-tile li {width:33.333333333333%}
604.folder-preset-835 .folder-tile li:nth-of-type(2n+1) {clear:none}
605.folder-preset-835 .folder-tile li:nth-of-type(3n+1) {clear:both}
606}
607
608.folder-preset-835 .folder-list li .column-image {order:0}
609.folder-preset-835 .folder-list li.img-inline .img-wrapper {margin-bottom:0px}
610.folder-preset-835 .folder-list .column-image.hidden {display:none}
611.folder-preset-835 .folder-list li div.img-block {border-style:solid}
612.folder-preset-835 .folder-list li.img-inline div.img-block {width:100%;border-style:solid}
613.folder-preset-835 .folder-list li.img-inline div.img-block img {max-height:0px}
614.folder-preset-835 .folder-list li.item::after {height:0px}
615
616
617@media screen and (max-width: 767px) {
618.folder-preset-835 .folder-list li div.img-block {width:100%;height:auto}
619.folder-preset-835 .folder-list li div.img-block .img {background-size:contain}
620}
621
622</style>
623
624<div class="folder-wrapper folder-wrapper-0 folder-related folder-preset-835 ">
625<div class="folder-options ">
626
627
628</div>
629<ul class="folder-view folder-folder folder-tile ">
630	<li id="nav_13" class="item item-13 item-folder img-use-crop  item-idx-0xB267E3B3847B11F19A5EF23C9435931F" data-idx="0xB267E3B3847B11F19A5EF23C9435931F">
631		
632<div class="fg-row">
633	<div class="columns medium-3 large-3 column-image ">
634		<!-- BEGIN imgBlock -->
635		<div class="img-wrapper">
636			<div class="img-block"  href="/lib/static/img.php?im=/_data/site/130/folder/13/listWhoWeAre.jpg&sz=1500x1500&cp=1">
637	<a class="pg-link" href="/13/Get-To-Know-Us" >
638	<div class="img img-alt   lazyload" style="" data-src=""></div>
639	<div class="img img-main  lazyload" style="background-image:url(&apos;/_.gif&apos;);" data-src="/cache/img/130/folder|13&sz520x480&cp1&tn&ql&fm&bo&bc&sg2935368614&ft1737633942&listWhoWeAre.jpg"></div>
640	<img src='/cache/img/130/folder|13&sz520x480&cp1&tn&ql1&fmjpg&bo&bc&sg2935368614&ft1737633942&listWhoWeAre.jpg' alt='Get To Know Us'>
641	</a>
642</div>
643			<div class="caption over top" onclick="window.location.href='/13/Get-To-Know-Us'">
644				<div class="caption-text-wrapper">
645					<a class='pg-title-link pg-link' href='/13/Get-To-Know-Us' ><h3 class='pg-title-list'>Get To Know Us</h3></a>
646					
647					<a href="/13/Get-To-Know-Us">Find out more</a>
648				</div>
649			</div>
650		</div>
651		<!-- END imgBlock -->
652	</div>
653	<div class="folder-details columns medium-9 large-9 column-body">
654		<a class='pg-title-link pg-link' href='/13/Get-To-Know-Us' ><h3 class='pg-title-list'>Get To Know Us</h3></a>
655		
656		
657	</div>
658</div>
659	</li>
660	<li id="nav_840" class="item item-840 item-pg img-use-crop  item-idx-0xB2728888847B11F19A5EF23C9435931F" data-idx="0xB2728888847B11F19A5EF23C9435931F">
661		
662<div class="fg-row">
663	<div class="columns medium-3 large-3 column-image ">
664		<!-- BEGIN imgBlock -->
665		<div class="img-wrapper">
666			<div class="img-block"  href="/lib/static/img.php?im=/_data/site/130/pg/840/bannerYouth.jpg&sz=1500x1500&cp=1">
667	<a class="pg-link" href="/840/Youth-Hub" >
668	<div class="img img-alt   lazyload" style="" data-src=""></div>
669	<div class="img img-main  lazyload" style="background-image:url(&apos;/_.gif&apos;);" data-src="/cache/img/130/pg|840&sz520x480&cp1&tn&ql&fm&bo&bc&sgd6f7cf1141&ft1738144056&bannerYouth.jpg"></div>
670	<img src='/cache/img/130/pg|840&sz520x480&cp1&tn&ql1&fmjpg&bo&bc&sgd6f7cf1141&ft1738144056&bannerYouth.jpg' alt='Youth Hub'>
671	</a>
672</div>
673			<div class="caption over top" onclick="window.location.href='/840/Youth-Hub'">
674				<div class="caption-text-wrapper">
675					<a class='pg-title-link pg-link' href='/840/Youth-Hub' ><h3 class='pg-title-list'>Youth Hub</h3></a>
676					
677					<a href="/840/Youth-Hub">Find out more</a>
678				</div>
679			</div>
680		</div>
681		<!-- END imgBlock -->
682	</div>
683	<div class="folder-details columns medium-9 large-9 column-body">
684		<a class='pg-title-link pg-link' href='/840/Youth-Hub' ><h3 class='pg-title-list'>Youth Hub</h3></a>
685		
686		
687	</div>
688</div>
689	</li>
690	<li id="nav_819" class="item item-819 item-folder img-use-crop  item-idx-0xB272562A847B11F19A5EF23C9435931F" data-idx="0xB272562A847B11F19A5EF23C9435931F">
691		
692<div class="fg-row">
693	<div class="columns medium-3 large-3 column-image ">
694		<!-- BEGIN imgBlock -->
695		<div class="img-wrapper">
696			<div class="img-block"  href="/lib/static/img.php?im=/_data/site/130/folder/819/bannerPopIn.jpg&sz=1500x1500&cp=1">
697	<a class="pg-link" href="/819/Community" >
698	<div class="img img-alt   lazyload" style="" data-src=""></div>
699	<div class="img img-main  lazyload" style="background-image:url(&apos;/_.gif&apos;);" data-src="/cache/img/130/folder|819&sz520x480&cp1&tn&ql&fm&bo&bc&sg991935e392&ft1737
699559473&bannerPopIn.jpg"></div>
700	<img src='/cache/img/130/folder|819&sz520x480&cp1&tn&ql1&fmjpg&bo&bc&sg991935e392&ft1737559473&bannerPopIn.jpg' alt='Community'>
701	</a>
702</div>
703			<div class="caption over top" onclick="window.location.href='/819/Community'">
704				<div class="caption-text-wrapper">
705					<a class='pg-title-link pg-link' href='/819/Community' ><h3 class='pg-title-list'>Community</h3></a>
706					
707					<a href="/819/Community">Find out more</a>
708				</div>
709			</div>
710		</div>
711		<!-- END imgBlock -->
712	</div>
713	<div class="folder-details columns medium-9 large-9 column-body">
714		<a class='pg-title-link pg-link' href='/819/Community' ><h3 class='pg-title-list'>Community</h3></a>
715		
716		
717	</div>
718</div>
719	</li>
720
721</ul>
722</div>
723</div></div>
724</div>
725<div class="breakout">
726<div class="block-fw block-padding pale-bg">
727<div class="section-inner">
728<div class="block-flex">
729<div class="block-flex-double block-center">
730<h2>WE ARE AN INCLUSIVE CHURCH</h2>
731<p class="p1">We are an inclusive Church with a mission to reach and connect with all in our community and are part of the national Inclusive Church Network.</p>
732<p class="p1">This means that &ldquo;We believe in inclusive church &ndash; a church which celebrates and affirms every person and does not discriminate against people on grounds of disability, economic power, ethnicity, gender, gender identity, learning disability, mental health, neurodiversity, or sexuality or any other grounds that anyone can think of that excludes rather than includes".</p>
733</div>
734<div class="block-flex-double block-image"><img src="/_data/site/130/folder/123/bannerChoirChatting.jpg" /></div>
735</div>
736</div>
737</div>
738</div>
739					</div>
740				</div>
741			</section>
742
743					<main id="main-content">
744						<div id="main-content-inner" class="section-inner">
745							<div id="main-content-box">
746								
747												<div id="c-col" class='no-lc no-rc '>
748					<div id="c-col-inner">
749					<div id="c-col-box">
750									<div id="content-header"><!--  -->
751				
752			</div>
753				
754						<div id="content-box" class="layout-0xDCE5D343847B11F19A5EF23C9435931F">
755							<!-- content -->
756<div class="item-folder ">
757
758
759
760<div class='pg-gallery-av'></div>
761
762
763</div>
764<!-- end of content -->
765
766						</div>
767				
768									<div id="content-footer"><!--  -->
769				
770			</div>
771					</div>
772					</div>
773				</div>
774								
775							</div>
776						</div>
777					</main>
778								<section id="body-footer">
779				<div id="body-footer-inner"  class="section-inner" ><!--  -->
780					<div id="body-footer-box">
781					
782					</div>
783				</div>
784			</section>
785								<footer id="footer">
786				<div id="footer-inner" class="section-inner">
787					<div id="footer-box">
788						<div class="block-fw footer-bg">
789<div class="section-inner">
790<div class="section-upper">
791<div class="footer-logo"><a href="/"><img src="/_data/site/130/_default/unitedBeneficeLingDormsWhite.svg" alt="St Peter and St Paul&rsquo;s Lingfield Logo" /></a></div>
792</div>
793<div class="footer-logo inclusive-church"><a href="https://www.inclusive-church.org/" target="_blank" rel="noopener noreferrer"><img src="/_data/site/130/_default/footerLogoInclusive.png" alt="Inclusive Church Logo" /></a></div>
794<div><div class="connect-wrapper">
795	<ul>
796		<a title="St Peter and St Paul’s Lingfield on X" class="twitter" href="https://x.com/LingfieldChurch" target="_blank" rel="noopener noreferrer">
797			<li>Twitter</li>
798		</a>
799		<a title="Call St Peter and St Paul’s Lingfield" class="phone" href="tel:01342832021" target="_blank" rel="noopener noreferrer">
800			<li>Phone</li>
801		</a> 
802	</ul>
803</div>
804</div>
805<p style="text-align: center;"><a href="/115/Contact-Us">Contact</a> | <a href="/798/Safeguarding-Policy">Safeguarding</a> | <a href="/722/Privacy-Data-Protection-Policy">Privacy</a> | <a href="/8/Sitemap">Sitemap</a></p>
806<hr />
807<div class="section-lower"><h6>Copyright &copy; 
807<script type="text/javascript">// <![CDATA[
808document.write(new Date().getFullYear());
809// ]]></script>
809 St Peter and St Paul’s Lingfield. All Rights Reserved. Designed &amp; Powered by the <a href="https://www.churchpages.co.uk" target="_blank" rel="noopener noreferrer">Church Pages Initiative</a></h6></div>
810</div>
811</div>
812						<span class="powered">Powered by 
813							<a href='https://www.khooseller.co.uk' target='_blank'>Khooweb e-commerce website specialists</a>
814						</span>
815					</div>
816				</div>
817			</footer>
818				</div>
819			</div>
820		</div>
821
822	</div>
823
824	
825	
825<script src='/js/plugins/cookieconsent/dist/cookieconsent.umd.js?v=5'></script>
vendor: 1 bytes, line 825
825
826<script src='/js/alpine-init.js?v=5'></script>
vendor: 1 bytes, line 826
826
827<script>
828$(function() {
829$("#h-nav").sticky({ topSpacing: 0 });
830 $('#browser-box').on('click','a[href*="#"]:not([href="#"])', function() {
831    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
832      var target = $(this.hash);
833      target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
834      if (target.length) {
835        $('html,body').animate({
836          scrollTop: target.offset().top
837        }, 1200, 'easeOutCubic');
838        return false;
839      }
840    }
841  });
842});
843
844</script>
vendor: 1 bytes, line 844
844
845<script defer src='/js/plugins/popupwindow.js?v=5'></script>
vendor: 1 bytes, line 845
845
846<script src='/js/stores/modals.js?v=5'></script>
vendor: 1 bytes, line 846
846
847<script src='/js/stores/slideout.js?v=5'></script>
vendor: 1 bytes, line 847
847
848<script src='/js/component/slideoutForm.js?v=5'></script>
vendor: 1 bytes, line 848
848
849<script src='/js/component/fieldValidator.js?v=5'></script>
vendor: 1 bytes, line 849
849
850<script src='/js/component/suggestionBox.js?v=5'></script>
vendor: 1 bytes, line 850
850
851<script src='/js/component/progressBar.js?v=5'></script>
vendor: 1 bytes, line 851
851
852<script src='/js/component/successRedirect.js?v=5'></script>
vendor: 1 bytes, line 852
852
853<script src='/js/component/tinyMceModalForm.js?v=5'></script>
vendor: 1 bytes, line 853
853
854<script defer src='/js/default_body.js?v=5'></script>
vendor: 1 bytes, line 854
854
855<script type="text/plain" data-category="analytics">
856<!-- Matomo -->
857  var _paq = _paq || [];
858  _paq.push(['trackPageView']);
859  _paq.push(['enableLinkTracking']);
860  (function() {
861    var u="https://stats.khoosys.net/";
862    _paq.push(['setTrackerUrl', u+'piwik.php']);
863    _paq.push(['setSiteId', '386']);
864    
865    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
866    g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
867  })();
868<!-- End Matomo Code -->
869</script>
869
870
871	
871<script src="/_default/js/cookie_consent.htm"></script>
871
872    <!-- ========================================================================= -->
873    <!-- Modal HTML. We wrap it in a simple x-data                               -->
874    <!-- to ensure it's part of Alpine's initialization process.                 -->
875    <!-- ========================================================================= -->
876    <div id="alpine-modal-root" class="modern-form" 
877        x-data
878        @htmx:before-request="$store.modals.clearTopModalErrors()"
879        @htmx:after-request="$store.modals.handleHtmxResponse(event)"
880        @htmx:after-swap="$store.modals.bindFormValidation(event)"
881        @close-top-modal="$store.modals.close()"
882        > 
883        <!-- The x-data makes this an official Alpine component -->
884
885        <!-- BEGIN: Global Alpine/HTMX Modal Stack -->
886        <template x-if="$store.modals.stack.length > 0"> <!-- THE CRITICAL FIX IS HERE -->
887            <div class="modal-stack-container" 
888                 @keydown.escape="$store.modals.close()"
889                 x-cloak>
890        
891                <!-- The blackout background. Closes the topmost modal when clicked.
892                     Tracks the topmost modal's z-base (minus 1) so that a modal
893                     elevated above an "-above-modal" slideout (z-base 2200) dims
894                     the slideout too; the default case stays at 1999 via the CSS. -->
895                <div class="blackout-bg" @click="$store.modals.close()"
896                     :style="$store.modals.top && $store.modals.top.zBase ? { zIndex: $store.modals.top.zBase - 1 } : {}"></div>
897
898                <!-- This loops through each open modal and "stacks" them visually.
899                     Each modal carries its own z-base (2000 by default, 2200 when
900                     opened from inside an elevated slideout — see modals.js open()),
901                     keeping the dialog above the modal blackout, the slideout panel
902                     (1100 / 2100 elevated), and the legacy \Core\Dialog stack (1001). -->
903                <template x-for="(modal, index) in $store.modals.stack" :key="index">
904                    <div class="dialog-wrapper" :style="{ zIndex: (modal.zBase || 2000) + index }">
905                        <div class="dialog" :style="{ maxWidth: modal.width || '600px' }">
906                            
907                            <!-- ======================================================= -->
908                            <!-- BEGIN: "HTML" Dynamic Content from HTMX PRESET          -->
909                            <!-- ======================================================= -->
910                            <template x-if="modal.type === 'html'">
911                                <div x-html="modal.content"></div>
912                            </template>
913    
914                            <!-- ======================================================= -->
915                            <!-- BEGIN: "FORM" PRESET                                    -->
916                            <!-- ======================================================= -->
917                            <template x-if="modal.type === 'form'">
918                                <div class="dialog-content-wrapper" x-data="{
919                                        title: modal.title || 'Dialog',
920                                        confirmText: modal.confirmText || 'Save Changes',
921                                        loadUrl: modal.loadUrl || '',
922                                        postUrl: modal.postUrl || '',
923                                        context: modal.context || '',
924                                        clearError(event) {
925                                            const fieldName = event.target.name;
926                                            // If there's a name and a corresponding error exists, delete it.
927                                            if (fieldName && $store.modals.top?.errors?.[fieldName]) {
928                                                delete $store.modals.top.errors[fieldName];
929                                                // If it was a field-specific error, the form is no longer fatal.
930                                                // A general fatal error will remain.
931                                                if ($store.modals.top.isFatal && !$store.modals.top.errors.general) {
932                                                    $store.modals.top.isFatal = false;
933                                                }
934                                                $store.modals._renderErrors();
935                                            }
936                                        }
937                                    }"
938                                   x-init="Alpine.nextTick(() => htmx.process($el))">
939                                   
940                                    <!-- 1. The Header (Now part of the shell) -->
941                                    <div class="dialog-header">
942                                        <div class="dialog-title" x-text="title"></div>
943                                        <button class="dialog-close" @click="$store.modals.close()">&times;</button>
944                                    </div>
945
946                                    <!-- 2. The Form -->
947                                    <!-- Bind fieldValidator once the body's htmx content lands so
948                                         .required / .digits / min / max are enforced client-side,
949                                         mirroring the slideout and legacy Core\Dialog. Without this
950                                         a `max` on a text/digits input is never checked (native
951                                         HTML5 max only applies to type=number). bind() self-guards
952                                         against the repeat afterSwaps of nested panel loads.
953
954                                         `context` (which can be a JSON array of every ticked row id)
955                                         travels as a hidden input, NOT hx-vals: hx-vals is inherited
956                                         by descendants, so the .dialog-body loader GET below would
957                                         carry the whole id list in its query string and 414 on a
958                                         large selection. htmx collects enclosing-form inputs on the
959                                         form's own POST only. -->
960                                    <form
961                                        :hx-post="postUrl"
962                                        hx-swap="none"
963                                        hx-disabled-elt="find .button-submit"
964                                        x-init="$el.addEventListener('htmx:afterSwap', () => window.fieldValidator && window.fieldValidator.bind($el))"
965                                        @input.debounce.250ms="clearError($event)"
966                                    >
967                                        <input type="hidden" name="context" :value="context" />
968                                        <div class="validation-error -general"
969                                            data-error-general
970                                            style="display:none">
971                                        </div>
972                                        <div class="dialog-body modern-form"
973                                            :hx-get="loadUrl"
974                                            hx-trigger="load"
975                                            hx-swap="innerHTML"
976                                            hx-indicator="#loading-spinner" 
977                                            >                                            
978                                            <div id="loading-spinner" class="htmx-indicator">
979                                                <div class="loader"></div>
980                                            </div>
981                                        </div>
982
983                                        <div class="dialog-buttons">
984                                            <button type="button" class="button-cancel" @click="$store.modals.close()">Cancel</button>
985                                            <button type="submit" class="button-submit" :disabled="$store.modals.top?.isFatal" x-text="confirmText"></button>
986                                        </div>
987                                    </form>
988                                </div>
989                            </template>
990
991                            <!-- ======================================================= -->
992                            <!-- BEGIN: "CONFIRM" PRESET                                 -->
993                            <!-- ======================================================= -->
994                            <template x-if="modal.type === 'confirm'">
995                                <div class="dialog-content-wrapper">
996                                    <div class="dialog-header">
997                                        <div class="dialog-title" x-text="modal.title || 'Confirm'"></div>
998                                        <button class="dialog-close" @click="$store.modals.close()">&times;</button>
999                                    </div>
1000                                    <div class="dialog-body">
1001                                        <template x-if="modal.bodyHtml"><div x-html="modal.bodyHtml"></div></template>
1002                                        <template x-if="!modal.bodyHtml"><div class="info-box" x-text="modal.message || modal.description || 'Are you sure?'"></div></template>
1003                                    </div>
1004                                    <div class="dialog-buttons">
1005                                        <button class="button-cancel" @click="$store.modals.close()">
1006                                            <span x-text="modal.cancelText || 'Cancel'"></span>
1007                                        </button>
1008                                        <button :class="modal.destructive ? 'button-destructive' : 'button-submit'"
1009                                                @click="
1010                                                    if (modal.okUrl) { window.location.assign(modal.okUrl); return; }
1011                                                    // Function-valued onOk (inline callers) or string method on targetId (Node::modalConfirm)
1012                                                    if (typeof modal.onOk === 'function') {
1013                                                        modal.onOk(...(modal.okArgs || []));
1014                                                    } else if (modal.targetId && modal.onOk) {
1015                                                        const targetEl = document.getElementById(modal.targetId);
1016                                                        if (targetEl && Alpine.$data(targetEl) && typeof Alpine.$data(targetEl)[modal.onOk] === 'function') {
1017                                                            Alpine.$data(targetEl)[modal.onOk](...(modal.okArgs || []));
1018                                                        }
1019                                                    }
1020                                                    $store.modals.close();
1021                                                ">
1022                                            <span x-text="modal.okText || modal.confirmText || 'OK'"></span>
1023                                        </button>
1024                                    </div>
1025                                </div>
1026                            </template>
1027
1028                            <!-- ======================================================= -->
1029                            <!-- BEGIN: "INPUT CONFIRM" PRESET                           -->
1030                            <!-- ======================================================= -->
1031                            <template x-if="modal.type === 'inputConfirm'">
1032                                <!-- This component has its own internal state for the user's input -->
1033                                <div class="dialog-content-wrapper" x-data="{ userInput: '' }">
1034                                    <div class="dialog-header">
1035                                        <div class="dialog-title" x-text="modal.title || 'Confirm Action'"></div>
1036                                        <button class="dialog-close" @click="$store.modals.close()">&times;</button>
1037                                    </div>
1038                                    <div class="dialog-body modern-form">
1039                                        <!-- The main instructional message -->
1040                                        <div class="info-box" x-text="modal.message || 'Please confirm your action.'"></div>
1041
1042                                        <!-- The input field for validation -->
1043                                        <div class="form-section">
1044                                            <div class="form-group">
1045                                                <input type="text"
1046                                                    x-model="userInput"
1047                                                    :placeholder="modal.requiredText"
1048                                                    autocomplete="off"
1049                                                    @keydown.enter.prevent="if (userInput === modal.requiredText) $refs.submitButton.click()"
1050                                                />
1051                                                <label x-text="modal.label || 'Please type the confirmation text'"></label>
1052                                            </div>
1053                                        </div>
1054                                    </div>
1055                                    <div class="dialog-buttons">
1056                                        <button class="button-cancel" @click="$store.modals.close()">
1057                                            <span x-text="modal.cancelText || 'Cancel'"></span>
1058                                        </button>
1059                                        <button class="button-submit"
1060                                                x-ref="submitButton"
1061                                                :disabled="userInput !== modal.requiredText"
1062                                                @click="
1063                                                    if (modal.targetId && modal.onOk) {
1064                                                        const targetEl = document.getElementById(modal.targetId);
1065                                                        if (targetEl) Alpine.$data(targetEl)[modal.onOk](...(modal.okArgs || []));
1066                                                    }
1067                                                    $store.modals.close();
1068                                                ">
1069                                            <span x-text="modal.okText || 'OK'"></span>
1070                                        </button>
1071                                    </div>
1072                                </div>
1073                            </template>
1074
1075                            <!-- ======================================================= -->
1076                            <!-- BEGIN: "PROGRESS" PRESET (NEW!)                         -->
1077                            <!-- ======================================================= -->
1078                            <template x-if="modal.type === 'progress'">
1079                                <!--
1080                                This block is now pure structure. The logic comes from the progressBar component.
1081                                It's initialized with the taskId passed in the modal data object.
1082                                -->
1083                                 <div class="dialog-content-wrapper" 
1084                                    x-data="progressBar(modal.taskId, modal.stoppable)" 
1085                                    x-cloak
1086                                >
1087                                    <!-- The rest of your template remains exactly the same! -->
1088                                    <div class="dialog-header"><div class="dialog-title">Processing...</div></div>
1089                                    <div class="dialog-body">
1090                                        <p class="progress-status" x-text="statusText"
1091                                        :class="hasFailed ? 'validation-error' : ''"></p>
1092                                        <div style="background: #eee; border-radius: 5px; overflow: hidden;">
1093                                            <div style="width: 0%; background: #3498db; height: 20px; text-align: center; color: white; transition: width 0.3s ease;"
1094                                                :style="{ width: percent + '%' }"
1095                                                x-text="percent > 0 ? percent + '%' : ''"
1096                                                :class="hasFailed ? 'bg-fail' : ''"
1097                                            >
1098                                            </div>
1099                                        </div>
1100                                    </div>
1101                                    <div class="dialog-buttons">
1102                                        <!-- The new, optional Stop button -->
1103                                        <button type="button" class="button-destructive" 
1104                                                x-show="isStoppable && !isComplete && !hasFailed && !isStopping" 
1105                                                @click="stopTask()">
1106                                            Stop
1107                                        </button>
1108
1109                                        <!-- A disabled version for better UX after clicking stop -->
1110                                        <button type="button" class="button-destructive" disabled
1111                                                x-show="isStopping">
1112                                            Stopping...
1113                                        </button>
1114
1115                                        <!-- Your existing close button for failures -->
1116                                        <button type="button" class="button-cancel" 
1117                                                x-show="hasFailed" 
1118                                                @click="closeAndCleanup()">
1119                                            Close
1120                                        </button>
1121                                    </div>
1122                                </div>
1123                            </template>
1124
1125                            <!-- ======================================================= -->
1126                            <!-- BEGIN: "SUCCESS REDIRECT" PRESET (NEW!)                 -->
1127                            <!-- ======================================================= -->
1128                            <template x-if="modal.type === 'success'">
1129                                <!--
1130                                The component is initialized with the message and URL from the modal data.
1131                                The @destroy directive ensures we clean up timers if the user hits Escape.
1132                                -->
1133                                <div class="dialog-content-wrapper" 
1134                                    x-data="successRedirect(modal.message, modal.redirectUrl)" 
1135                                    @destroy="destroy()"
1136                                    x-cloak>
1137                                    
1138                                    <div class="dialog-header"><div class="dialog-title">Success</div></div>
1139                                    <div class="dialog-body" style="text-align: center;">
1140                                        <!-- You can add a success icon here if you like -->
1141                                        <p style="margin: 1rem 0;" x-text="message"></p>
1142                                    </div>
1143                                    <div class="dialog-buttons">
1144                                        <!-- The OK button calls redirectNow() and shows the countdown -->
1145                                        <button type="button" class="button-submit" @click="redirectNow()">
1146                                            OK <span x-text="'(' + countdown + ')'"></span>
1147                                        </button>
1148                                    </div>
1149                                </div>
1150                            </template>
1151
1152                        </div>
1153                    </div>
1154                </template>
1155            </div>
1156        </template>
1157        <!-- END: Global Alpine/HTMX Modal Stack -->
1158
1159    </div> <!-- End of #alpine-modal-root -->
1160
1161    <!-- ======================================================= -->
1162    <!-- SLIDE-OUT PANEL COMPONENT (Styled for .modern-form)   -->
1163    <!-- ======================================================= -->
1164    <div id="slideout-panel-root" class="modern-form"
1165        x-data="slideoutForm()"
1166    >
1167        <!-- Overlay -->
1168        <div 
1169            class="slideout-overlay"
1170            :class="{ '-below-topbar': $store.slideout.panelClass && $store.slideout.panelClass.indexOf('-below-topbar') !== -1, '-above-modal': $store.slideout.panelClass && $store.slideout.panelClass.indexOf('-above-modal') !== -1 }"
1171            @click="handleOverlayClick()"
1172            x-show="$store.slideout.isOpen && (!$store.slideout.panelClass || $store.slideout.panelClass.indexOf('-object-map-list') === -1)"
1173            x-cloak
1174            x-transition:enter="transition-opacity ease-in-out duration-300"
1175            x-transition:enter-start="opacity-0"
1176            x-transition:enter-end="opacity-100"
1177            x-transition:leave="transition-opacity ease-in-out duration-300"
1178            x-transition:leave-start="opacity-100"
1179            x-transition:leave-end="opacity-0"
1180        ></div>
1181
1182        <!-- Panel -->
1183        <div 
1184            class="slideout-panel"
1185            :class="$store.slideout.panelClass.split(' ').filter(function (c) { return c; })"
1186            x-show="$store.slideout.isOpen"
1187            x-cloak
1188            x-transition:enter="transition ease-in-out duration-300 transform"
1189            x-transition:enter-start="translate-x-full"
1190            x-transition:enter-end="translate-x-0"
1191            x-transition:leave="transition ease-in-out duration-300 transform"
1192            x-transition:leave-start="translate-x-0"
1193            x-transition:leave-end="translate-x-full"
1194            :style="$store.slideout.currentWidth ? { width: $store.slideout.currentWidth } : {}"
1195        >
1196            <!-- Header -->
1197            <div class="slideout-header">
1198                <div class="slideout-header-text">
1199                    <h2 class="slideout-title" x-text="$store.slideout.title"></h2>
1200                    <p class="slideout-subtitle" x-show="$store.slideout.subt
1200itle" x-text="$store.slideout.subtitle" x-cloak></p>
1201                </div>
1202                <div id="slideout-head-slot" class="slideout-head-slot"></div>
1203                <button @click="handleCloseClick()" class="slideout-close" aria-label="Close panel">&times;</button>
1204            </div>
1205
1206            <!-- Content shell: teleports (e.g. object-map list) mount as direct children;
1207                 htmx fragments load into #slideout-htmx-body so innerHTML swaps never
1208                 wipe Alpine teleport anchors on this container. -->
1209            <div id="slideout-content" class="slideout-body">
1210                <div id="slideout-htmx-body"
1211                     hx-trigger="load-slideout-content"
1212                     hx-swap="innerHTML"></div>
1213            </div>
1214
1215            <!-- Footer (form type only) -->
1216            <div class="slideout-footer"
1217                 x-show="$store.slideout.type === 'form' && !$store.slideout.hideFooter"
1218                 x-cloak>
1219                <div id="slideout-foot-left" class="slideout-foot-left"></div>
1220                <div class="slideout-foot-actions">
1221                    <button type="button" class="btn button-cancel" @click="cancelExplicit()">Cancel</button>
1222                    <div id="slideout-foot-actions"></div>
1223                </div>
1224            </div>
1225        </div>
1226
1227        <iframe id="slideout-save-frame" name="slideout-save-frame" class="slideout-save-frame"
1228                title="slideout save target" tabindex="-1" aria-hidden="true"></iframe>
1229    </div>
1230
1231    <!-- ======================================================= -->
1232    <!-- GUIDED TUTORIAL OVERLAY (engine mount point)            -->
1233    <!-- The player builds its dim-backdrop + popover in <body>; -->
1234    <!-- this stable root just hosts the Alpine component.       -->
1235    <!-- Only mounted where the tutorial JS bundle is registered  -->
1236    <!-- (admin) — the slot is left empty otherwise; see _foot.php -->
1237    <!-- ======================================================= -->
1238
1239    <!-- Hidden form – submits same data as original -->
1240    <form id="advanced-search-hidden-form" x-data
1241        hx-post="/index.php?url=/index.htm"
1242        hx-target="#search-results-content"
1243        hx-select="#search-results-content"
1244        hx-swap="innerHTML"
1245        style="display:none;"
1246        @htmx:after-request="handleSearchSuccess(event, 'advanced-search-template')"
1247        >
1248        <div id="advanced-search-hidden-fields"></div>
1249    </form>
1250
1251    <template id="show-loader-loader-template">
1252        <div style="padding:80px 0; text-align:center; font-size:1.1em; color:#666;">
1253            <div class="loader" style="display:inline-block; vertical-align:middle;"></div>
1254        </div>
1255    </template>
1256<script>
1257    document.body.addEventListener('htmx:beforeRequest', function(evt) {
1258        // Get the element that will be updated (the swap target)
1259        let target = evt.detail.target;
1260
1261        // If no explicit target, fall back to the requesting element
1262        if (!target) {
1263            const requestConfig = evt.detail.xhr; // not directly available, so use the elt
1264            target = evt.target;
1265        }
1266
1267        // Also check if the actual swap target (from hx-target on trigger) has the class
1268        // HTMX sets evt.detail.target to the swap target element
1269        if (target && target.classList && target.classList.contains('show-loader')) {
1270            const loaderTemplate = document.getElementById('show-loader-loader-template');
1271            
1272            if (loaderTemplate && !target.querySelector('.htmx-loader-overlay')) { // prevent duplicates
1273                const overlay = document.createElement('div');
1274                overlay.className = 'htmx-loader-overlay';
1275                
1276                Object.assign(overlay.style, {
1277                    position: 'absolute',
1278                    top: '0',
1279                    left: '0',
1280                    width: '100%',
1281                    height: '100%',
1282                    zIndex: '100',
1283                    display: 'flex',
1284                    alignItems: 'center',
1285                    justifyContent: 'center',
1286                    backgroundColor: 'rgba(255,255,255,0.8)',
1287                    backdropFilter: 'blur(2px)'
1288                });
1289
1290                const loaderClone = loaderTemplate.content.cloneNode(true);
1291                overlay.appendChild(loaderClone);
1292
1293                // Ensure relative positioning
1294                const computedStyle = window.getComputedStyle(target);
1295                if (computedStyle.position === 'static') {
1296                    target.style.position = 'relative';
1297                }
1298
1299                target.appendChild(overlay);
1300            }
1301        }
1302    });
1303</script>
1303
1304    
1304<script>
1305    /**
1306     * Creates a reusable object with logic for managing a selection.
1307     * This is a "mixin" that we will add to our main Alpine component.
1308     * @param {string} initialId - The ID of the item that should be selected on page load.
1309     */
1310    function selectionManagerMixin(initialId) {
1311        return {
1312            // --- Properties ---
1313            initialSelectedId: initialId,
1314
1315            // --- Methods ---
1316            initializeSelection() {
1317                // Explicit initial id (detail-context pages) — select unconditionally.
1318                if (this.initialSelectedId && this.initialSelectedId !== '0') {
1319                    setTimeout(() => {
1320                        Alpine.store('selection').select(this.initialSelectedId);
1321                    }, 0);
1322                    return;
1323                }
1324                // Read the URL-persisted selection first: clear() strips ?selrow from the
1325                // URL synchronously (history.replaceState), so reading it after is too late.
1326                let selrow = '';
1327                try { selrow = new URL(window.location.href).searchParams.get('selrow') || ''; } catch (e) {}
1328
1329                // No server-preselected row on this page. The selection store is a
1330                // global singleton shared across pages, so a selection set on another
1331                // screen (e.g. a product-variant idx picked on the custom-price page)
1332                // survives an admin partial-swap navigation. Clear it so detail panes
1333                // keyed on $store.selection.selectedId don't fetch with a foreign id.
1334                Alpine.store('selection').clear();
1335
1336                // Then restore that selection so a refresh keeps the same row — but only
1337                // if that row is actually present in the current list.
1338                if (selrow) this._restorePersistedSelection(selrow);
1339            },
1340
1341            // A single setTimeout(0) races row render: on list pages where htmx/Alpine
1342            // reprocess the table after load, the row can appear a tick or two later, so
1343            // the one-shot lookup missed it and the selection was silently dropped (looked
1344            // like the selection "jumped" away on refresh). Retry across a few frames until
1345            // the row exists, then select it; give up quietly if it never shows (e.g. it's
1346            // on another paginated page).
1347            _restorePersistedSelection(selrow, attempt = 0) {
1348                const sel = (window.CSS && CSS.escape) ? CSS.escape(selrow) : selrow;
1349                if (document.querySelector('tr[data-selected-id="' + sel + '"]')) {
1350                    Alpine.store('selection').select(selrow);
1351                    return;
1352                }
1353                if (attempt < 20) {
1354                    setTimeout(() => this._restorePersistedSelection(selrow, attempt + 1), 30);
1355                }
1356            }
1357        };
1358    }
1359
1360    /**
1361     * The primary handler for after ANY search request completes.
1362     * It updates the search tags and resets the selection pane.
1363     */
1364    function handleSearchSuccess(event, templateId) {
1365        if (event.detail.successful) {
1366            
1367            // Get the raw payload from the request
1368            const payload = event.detail.requestConfig.parameters;
1369
1370
1371            // Set the tags using the payload
1372            Alpine.store('searchTags').setFromPayload(payload, templateId);
1373            
1374            Alpine.store('selection').clear();
1375        } else {
1376            console.error('[handleSearchSuccess] A search request was not successful.');
1377        }
1378    }
1379
1380
1381    window.handleAdvancedSearchSuccess = (event, templateId) => {
1382        if (event.detail.successful) {
1383            Alpine.store('slideout').close();
1384        }
1385        handleSearchSuccess(event, templateId);
1386    };
1387
1388    /**
1389     * openBulkModal — click handler for Node::modalBulkForm bulk-action menus.
1390     *
1391     * Three scopes:
1392     *   - 'selection' : collect .p-check:checked values from #list_form, bail
1393     *                   out with a notify if none selected, open a form modal
1394     *                   with the checked-id count in the loadUrl query string
1395     *                   and the ids JSON-encoded in `context` for the action
1396     *                   handler.
1397     *   - 'selection-into' : like 'selection', but also needs the single
1398     *                   highlighted row (`$store.selection.selectedId`) as a
1399     *                   *target*. Bails with a notify if nothing is highlighted,
1400     *                   substitutes the `__TARGET__` sentinel in loadUrl/postUrl
1401     *                   with the target idx (so it lands in the URL path segment
1402     *                   the action handler reads), and excludes the target from
1403     *                   the checked-id sources. Used by the customer "Merge
1404     *                   into selected" action.
1405     *   - 'results'   : no id collection; the current URL's query string is
1406     *                   appended to both loadUrl and postUrl so the action
1407     *                   handler can re-run the current search. `context` is
1408     *                   the literal string 'results'.
1409     *
1410     * Pairs with:
1411     *   - Node::modalBulkForm() — renders the trigger @click handler.
1412     *   - fetch/html/*_bulk.php loader — reads ?count= / query-string
1413     *     params to render the confirmation message.
1414     *   - fetch/action/*_bulk.php handler — reads $oREQUEST->context to
1415     *     distinguish selection (JSON array of ids) vs results (literal
1416     *     'results' plus query-string search params).
1417     */
1418    window.openBulkModal = function(title, loadUrl, postUrl, confirmText, scope, width) {
1419        scope = scope || 'selection';
1420
1421        if (scope === 'selection' || scope === 'selection-into') {
1422            // 'selection-into' also needs the highlighted row as a target: inject
1423            // it into the URL path (__TARGET__ sentinel) up front, then fall
1424            // through to the same checked-source collection as plain 'selection'.
1425            let target = null;
1426            if (scope === 'selection-into') {
1427                target = Alpine.store('selection')?.selectedId;
1428                if (!target) {
1429                    notify('No target customer', 'Click a customer row to pick the merge target first.', 'info');
1430                    return;
1431                }
1432                loadUrl = loadUrl.replaceAll('__TARGET__', target);
1433                postUrl = postUrl.replaceAll('__TARGET__', target);
1434            }
1435
1436            const listForm = document.getElementById('list_form');
1437            const rootSel  = listForm ? listForm.querySelectorAll('input.p-check:checked')
1438                                      : document.querySelectorAll('#list_form input.p-check:checked');
1439            let checked = Array.from(rootSel).map(el => el.value);
1440            // the target can't be a source (can't merge a customer into itself)
1441            if (target) checked = checked.filter(id => id !== target);
1442            if (checked.length === 0) {
1443                notify('Nothing selected', 'Tick a checkbox on at least one row first.', 'info');
1444                return;
1445            }
1446            const sep = loadUrl.includes('?') ? '&' : '?';
1447            Alpine.store('modals').open({
1448                type:        'form',
1449                title:       title,
1450                loadUrl:     loadUrl + sep + 'count=' + checked.length,
1451                postUrl:     postUrl,
1452                confirmText: confirmText || 'Confirm',
1453                context:     JSON.stringify(checked),
1454                width:       width || ''
1455            });
1456            return;
1457        }
1458
1459        if (scope === 'results') {
1460            // The active filters live in the searchTags store — they're posted
1461            // to the list via htmx.ajax() without ever being written to the URL
1462            // (only chip *removal* prunes the URL). So window.location.search is
1463            // stale and would make the bulk action operate on a different set
1464            // than the one on screen. Prefer the store's authoritative filter
1465            // set; fall back to the URL for legacy pages that don't use tags.
1466            const tagStore = Alpine.store('searchTags');
1467            let extra;
1468            if (tagStore && Array.isArray(tagStore.tags) && tagStore.tags.length) {
1469                const params = new URLSearchParams();
1470                tagStore.tags.forEach(t => {
1471                    if (t.value !== '' && t.value != null) params.append(t.name, t.value);
1472                });
1473                extra = params.toString();
1474            } else {
1475                const qs = window.location.search || '';
1476                extra = qs ? qs.replace(/^\?/, '') : '';
1477            }
1478            const loadSep = loadUrl.includes('?') ? '&' : '?';
1479            const postSep = postUrl.includes('?') ? '&' : '?';
1480            Alpine.store('modals').open({
1481                type:        'form',
1482                title:       title,
1483                loadUrl:     loadUrl + (extra ? loadSep + extra : ''),
1484                postUrl:     postUrl + (extra ? postSep + extra : ''),
1485                confirmText: confirmText || 'Confirm',
1486                context:     'results',
1487                width:       width || ''
1488            });
1489            return;
1490        }
1491
1492        console.error('openBulkModal: unknown scope', scope);
1493    };
1494
1495    /**
1496     * Global submit_list bridge for legacy Jaxon list-action dialogs.
1497     *
1498     * Pages converted to the modern htmx + modern-form blueprint no longer
1499     * include the old hidden `<form id="unisearch-form">` that the legacy
1500     * `submit_list({list_action, list_dlg_data})` callback used to populate
1501     * and submit. This shim is invoked by the Jaxon dialog `cbfunction` and
1502     * builds a temporary POST form on the fly so existing PHP `list_action`
1503     * handlers (delete / merge / email / set_group / etc.) keep working
1504     * without per-page rewires.
1505     *
1506     * If a page defines its own `submit_list` (e.g. orders.htm, which has
1507     * its own hidden legacy form for backwards compat), that wins.
1508     */
1509    if (typeof window.submit_list !== 'function') {
1510        window.submit_list = function(data) {
1511            const checked = [];
1512            document.querySelectorAll('input.p-check:checked').forEach(el => {
1513                checked.push(el.value);
1514            });
1515
1516            const form = document.createElement('form');
1517            form.method = 'post';
1518            form.action = location.pathname + location.search;
1519            form.style.display = 'none';
1520
1521            const addField = (name, value) => {
1522                const input = document.createElement('input');
1523                input.type = 'hidden';
1524                input.name = name;
1525                input.value = value;
1526                form.appendChild(input);
1527            };
1528
1529            addField('list_action',  data.list_action || '');
1530            addField('list_dlg_data', data.list_dlg_data || '');
1531            addField('p_checked',    checked.join(','));
1532
1533            document.body.appendChild(form);
1534            form.submit();
1535        };
1536    }
1537    </script>
1537
1538    <!-- alpine-init.js is served via AssetCatalog ('alpine.init', registered in
1539         _default ModuleInterface::registerIncludes) so it gets the cache-buster
1540         version query. Do not re-add a hardcoded script tag here. -->
1541</body>
1542</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.