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 & Dormansland! We're a friendly, warm community committed to loving & serving all that live & visit Lingfield & 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 & Dormansland Churches"> 20<meta property="og:description" content="Welcome to the United Benefice of Lingfield & Dormansland! We're a friendly, warm community committed to loving & serving all that live & visit Lingfield & 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 & Dormansland Churches"> 24<meta name="twitter:description" content="Welcome to the United Benefice of Lingfield & Dormansland! We're a friendly, warm community committed to loving & serving all that live & visit Lingfield & 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 & St Paul's </a><a class='menu-branch ajax' href='/738/ajax/menu_branch.php' rel='nofollow'> </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'> </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'> </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'> </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 & Dormansland Church Logo" /></a></div> 204<div class="search-slide-down-btn"> </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 & St Paul's </a><a class='menu-branch ajax' href='/738/ajax/menu_branch.php' rel='nofollow'> </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'> </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'> </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'> </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='<h1 class='pg-title'>Home</h1>' 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='<h1 class='pg-title'>Home</h1>' 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='<h1 class='pg-title'>Home</h1>' 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='<h1 class='pg-title'>Home</h1>' 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='<h1 class='pg-title'>Home</h1>' 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 & 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('/_.gif');" 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 & 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('/_.gif');" 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 & At St John's 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 & 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('/_.gif');" 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('/_.gif');" 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('/_.gif');" 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 “We believe in inclusive church – 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’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 ©
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 & 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()">×</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()">×</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()">×</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">×</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.