1 const toggleSwitch = document.getElementById('high_contrast_toggle'); 2 const highContrastBtn = document.getElementById('high_contrast'); 3 const overlay = document.getElementById('site-overlay'); 4 const bsNotifyEnhancer = () => { 5 const notify = document.getElementById('__bs_notify__'); 6 if (!notify) { 7 return false; 8 } 9 notify.setAttribute('role', 'region'); 10 if (!notify.hasAttribute('aria-label') && !notify.hasAttribute('aria-labelledby')) { 11 notify.setAttribute('aria-label', 'BrowserSync connection status'); 12 } 13 return true; 14 }; 15 if (!bsNotifyEnhancer()) { 16 const observer = new MutationObserver((mutations, obs) => { 17 if (bsNotifyEnhancer()) { 18 obs.disconnect(); 19 } 20 }); 21 observer.observe(document.body, { childList: true, subtree: true }); 22 } 23 24 25 26 setTimeout(() => { 27 overlay.classList.add('hidden'); 28 }, 50); 29 30 toggleSwitch.addEventListener('click', toggleHighContrast); 31 32 highContrastBtn.addEventListener('click', function(e) { 33 if (e.target.id !== 'high_contrast_toggle') { 34 toggleHighContrast(); 35 } 36 }); 37 38function ensureHighContrastStylesheet() { 39 if (document.getElementById('high-contrast-css') || !window.anglianHighContrastStylesheet) { 40 return; 41 } 42 43 var stylesheet = document.createElement('link'); 44 stylesheet.id = 'high-contrast-css'; 45 stylesheet.rel = 'stylesheet'; 46 stylesheet.href = window.anglianHighContrastStylesheet; 47 document.head.appendChild(stylesheet); 48} 49 50function toggleHighContrast() { 51 toggleSwitch.classList.toggle('active'); 52 document.documentElement.classList.toggle('high-contrast'); 53 54 if (document.documentElement.classList.contains('high-contrast')) { 55 ensureHighContrastStylesheet(); 56 } 57 58 // Save state 59 if (document.documentElement.classList.contains('high-contrast')) { 60 localStorage.setItem('highContrast', 'true'); 61 62 // Set cookies so the it's enabled on page load. 63 const cookieDays = 30; 64 const date = new Date(); 65 date.setTime(date.getTime() + (cookieDays*24*60*60*1000)); 66 const expires = "expires="+ date.toUTCString(); 67 document.cookie = "high_contrast_mode=1;" + expires + ";path=/"; 68 69 } else { 70 localStorage.removeItem('highContrast'); 71 document.cookie = "high_contrast_mode=0;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/"; 72 } 73} 74 75 76// Google Translate calls this after its deferred API script has loaded. 77window.googleTranslateElementInit = function () { 78 if (window.google && google.translate && google.translate.TranslateElement) { 79 new google.translate.TranslateElement( 80 {pageLanguage: 'en'}, 81 'google_translate_el' 82 ); 83 } 84}; 85 86function loadGoogleTranslate() { 87 if ( 88 document.querySelector('script[data-google-translate]') || 89 (window.google && google.translate && google.translate.TranslateElement) 90 ) { 91 return; 92 } 93 94 var script = document.createElement('script'); 95 script.src = 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'; 96 script.async = true; 97 script.dataset.googleTranslate = 'true'; 98 document.head.appendChild(script); 99} 100 101var translateControl = document.querySelector('.translate'); 102if (translateControl) { 103 translateControl.addEventListener('pointerenter', loadGoogleTranslate, { once: true }); 104 translateControl.addEventListener('focusin', loadGoogleTranslate, { once: true }); 105 translateControl.addEventListener('touchstart', loadGoogleTranslate, { once: true, passive: true }); 106 translateControl.addEventListener('click', loadGoogleTranslate, { once: true }); 107} 108 109function loadDeferredIframes() { 110 var iframes = document.querySelectorAll('iframe[data-src]'); 111 var loadIframe = function (iframe) { 112 iframe.src = iframe.dataset.src; 113 iframe.removeAttribute('data-src'); 114 }; 115 116 if (!('IntersectionObserver' in window)) { 117 iframes.forEach(loadIframe); 118 return; 119 } 120 121 var observer = new IntersectionObserver(function (entries, currentObserver) { 122 entries.forEach(function (entry) { 123 if (entry.isIntersecting) { 124 loadIframe(entry.target); 125 currentObserver.unobserve(entry.target); 126 } 127 }); 128 }, { rootMargin: '0px' }); 129
130 iframes.forEach(function (iframe) { 131 observer.observe(iframe); 132 }); 133} 134function initFooterMap(element) { 135 if (!window.L || element.dataset.mapReady) { 136 return; 137 } 138 139 var lat = parseFloat(element.dataset.mapLat); 140 var lng = parseFloat(element.dataset.mapLng); 141 if (isNaN(lat) || isNaN(lng)) { 142 return; 143 } 144 145 element.dataset.mapReady = '1'; 146 var map = L.map(element).setView({lon: lng, lat: lat}, 15); 147 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { 148 maxZoom: 19 149 }).addTo(map); 150 L.control.scale().addTo(map); 151 L.marker({lon: lng, lat: lat}).addTo(map); 152} 153 154function loadDeferredMap() { 155 var element = document.querySelector('#map[data-map-lat]'); 156 if (!element) { 157 return; 158 } 159 160 var start = function () { 161 if (window.L) { 162 initFooterMap(element); 163 return; 164 } 165 166 var assets = window.anglianLeafletAssets; 167 if (!assets || element.dataset.mapLoading) { 168 return; 169 } 170 171 element.dataset.mapLoading = '1'; 172 // The stylesheet has to be in place before the map measures itself, 173 // otherwise the tiles are laid out against an unstyled container. 174 new Promise(function (resolve) { 175 var stylesheet = document.createElement('link'); 176 stylesheet.rel = 'stylesheet'; 177 stylesheet.href = assets.style; 178 stylesheet.onload = resolve; 179 stylesheet.onerror = resolve; 180 document.head.appendChild(stylesheet); 181 }).then(function () { 182 var script = document.createElement('script'); 183 script.src = assets.script; 184 script.onload = function () { 185 initFooterMap(element); 186 }; 187 document.body.appendChild(script); 188 }); 189 }; 190 191 if (!('IntersectionObserver' in window)) { 192 start(); 193 return; 194 } 195 196 var observer = new IntersectionObserver(function (entries, currentObserver) { 197 entries.forEach(function (entry) { 198 if (entry.isIntersecting) { 199 start(); 200 currentObserver.unobserve(entry.target); 201 } 202 }); 203 }, { rootMargin: '200px 0px' }); 204 205 observer.observe(element); 206} 207 208function loadDeferredFeedAssets() { 209 var assets = window.anglianDeferredFeedAssets; 210 if (!assets) { 211 return; 212 } 213 214 var loadedFeeds = {}; 215 var loadFeed = function (feed) { 216 if (loadedFeeds[feed] || !assets[feed]) { 217 return; 218 } 219 220 loadedFeeds[feed] = true; 221 var styleLoads = assets[feed].styles.map(function (href) { 222 return new Promise(function (resolve) { 223 var stylesheet = document.createElement('link'); 224 stylesheet.rel = 'stylesheet'; 225 stylesheet.href = href; 226 stylesheet.onload = resolve; 227 stylesheet.onerror = resolve; 228 document.head.appendChild(stylesheet); 229 }); 230 }); 231 232 Promise.all(styleLoads).then(function () { 233 assets[feed].scripts.forEach(function (asset) { 234 if (asset.data) { 235 var data = document.createElement('script'); 236 data.text = asset.data; 237 document.body.appendChild(data); 238 } 239 240 var script = document.createElement('script'); 241 script.src = asset.src; 242 script.async = true; 243 document.body.appendChild(script); 244 }); 245 }); 246 }; 247 248 var feedTargets = [ 249 { selector: '.facebook-feed', feed: 'facebook' }, 250 { selector: '#sb_instagram', feed: 'instagram' } 251 ]; 252 253 if (!('IntersectionObserver' in window)) { 254 feedTargets.forEach(function (target) { 255 loadFeed(target.feed); 256 }); 257 return; 258 } 259 260 var observer = new IntersectionObserver(function (entries, currentObserver) { 261 entries.forEach(function (entry) { 262 if (entry.isIntersecting) { 263 loadFeed(entry.target.dataset.deferredFeed); 264 currentObserver.unobserve(entry.target); 265 } 266 }); 267 }, { rootMargin: '100px 0px' }); 268 269 feedTargets.forEach(function (target) { 270 var element = document.querySelector(target.selector); 271 if (element) { 272 element.dataset.deferredFeed = target.feed; 273 observer.observe(element); 274 } 275 }); 276} 277 278jQuery( document ).ready(function() { 279 loadDeferredFeedAssets(); 280 loadDeferredIframes(); 281 loadDeferredMap(); 282 //BACK TO TOP 283 jQuery('.backtotop').on("click", function () { 284 jQuery("html, body").animate({ scrollTop: 0 }); 285 }); 286 //back button on mobile 287 jQuery('#stickynav .back-button').on("click",function() { 288 var target = jQuery(this).attr('data-link'); 289 window.location.replace(target); 290 }) 291 //SCROLLING 292 jQuery('body').scroll(function(){ 293 var windowtop = jQuery('body').scrollTop(); 294 jQuery('.container-white-laurel').css('background-position-y',950-(windowtop/5)); 295 if (jQuery(window).width() < 992) { 296 if (windowtop > 100) { 297 jQuery('.back-button').fadeIn(); 298 } else { 299 jQuery('.back-button').hide(); 300 } 301 } else { 302 jQuery('.back-button').hide(); 303 } 304 }); 305 306 //WINDOW RESIZE 307 jQuery(window).resize(function(){ 308 if(jQuery('.header-images-slick-slider')[0] === undefined) return; 309 jQuery('.header-images-slick-slider')[0].slick.refresh(); 310 311 if (jQuery('body').width() > 750) { 312 313 var current = jQuery(".navbar-nav li.active"); 314 hovericon(current); 315 jQuery('.back-button').hide(); 316 } 317 }); 318 319 320 //Partners 321 jQuery('.partner-slider').slick({ 322 speed: 1000, 323 slidesToShow: 5, 324 slidesToScroll: 1, 325 arrows: true, 326 nextArrow: '.next-slide-lower', 327 prevArrow: '.prev-slide-lower', 328 autoplay: true, 329 accessibility: false, 330 responsive: [ 331 { 332 breakpoint: 1000, 333 settings: { 334 slidesToShow: 3, 335 } 336 }, 337 { 338 breakpoint: 760, 339 settings: { 340 slidesToShow: 2, 341 } 342 }, 343 ] 344 }); 345 //remove aria hidden 346 // jQuery('.partner-slider').parents('[aria-hidden="true"]').removeAttr('aria-hidden'); 347 //Hide partner arrows if less than 6 slides 348 if (!(jQuery('.slick-track .slick-slide').length > 6)) { 349 jQuery('.slick-controls-lower').hide(); 350 } 351 jQuery('.partners').fadeIn(); 352 //Homepage SLider 353 var homeSlider = jQuery('.header-images-slick-slider'); 354 var loadSliderImage = function(image) { 355 if (!image || !image.dataset.src) { 356 return; 357 } 358 359 image.srcset = image.dataset.srcset; 360 image.sizes = image.dataset.sizes; 361 image.src = image.dataset.src; 362 image.removeAttribute('data-src'); 363 image.removeAttribute('data-srcset'); 364 image.removeAttribute('data-sizes'); 365 }; 366 367 var loadSlideAt = function(slick, index) { 368 if (!slick || !slick.$slides || !slick.$slides.length) { 369 return; 370 } 371 372 loadSliderImage(slick.$slides.eq(index % slick.$slides.length).find('.image-slider__image[data-src]').get(0)); 373 }; 374 375 // Only the first slide is in the initial HTML. Autoplay stays on, but the 376 // following slide is fetched after the page has finished loading and each 377 // later slide is fetched one rotation ahead, so they never compete with the 378 // hero image for bandwidth during the initial render. 379 homeSlider.on('init', function(event, slick) { 380 var preloadNext = function() { 381 loadSlideAt(slick, slick.currentSlide + 1); 382 }; 383 384 if (document.readyState === 'complete') { 385 preloadNext(); 386 } else { 387 window.addEventListener('load', preloadNext, { once: true }); 388 } 389 }); 390 391 homeSlider.on('beforeChange', function(event, slick, currentSlide, nextSlide) { 392 loadSlideAt(slick, nextSlide); 393 }); 394 395 homeSlider.on('afterChange', function(event, slick, currentSlide) { 396 loadSlideAt(slick, currentSlide + 1); 397 }); 398 399 homeSlider.slick({ 400 dots: true, 401 speed: 1000, 402 fade: true, 403 autoplay: true,
404 arrows: false, 405 accessibility: false, 406 appendDots: '#slider_nav' 407 }); 408 //Twitter 409 jQuery('.slick-twitter').slick({ 410 slidesToShow: 1, 411 slidesToScroll: 1, 412 nextArrow: '.next-tweet', 413 prevArrow: '.prev-tweet', 414 accessibility: false, 415 adaptiveHeight: true, 416 fade: true 417 }); 418 //Lightbox 419 jQuery('body').on('click', '[data-toggle="lightbox"]', function(event) { 420 event.preventDefault(); 421 jQuery(this).ekkoLightbox({ 422 loadingMessage: '<div class="spinner-grow" role="status"> <span class="sr-only">Loading...</span></div>', 423 alwaysShowClose : true, 424 showArrows : true, 425 leftArrow: '<i class="fas fa-chevron-circle-left left"></i>', 426 rightArrow: '<i class="fas fa-chevron-circle-right right"></i>', 427 }); 428 }); 429 //Menu hover 430 //set to under current item - school icon 431 if( jQuery(".navbar .navbar-nav li.active").length ){ 432 var onloadleft = jQuery(".navbar .navbar-nav li.active").offset().left; 433 var leftpadding = jQuery(".navbar .navbar-nav li.active").width()/2-18; 434 } else { 435 var onloadleft = jQuery(".navbar .navbar-nav li:first-child").offset().left; 436 var leftpadding = jQuery(".navbar .navbar-nav li:first-child").width()/2-18; 437 } 438 jQuery(".navbar .currenthover").css("left",onloadleft+leftpadding); 439 jQuery(".navbar .currenthover").css("display","block"); 440 if(jQuery('.navbar .navbar-nav li.active').is('.navbar-nav li:last-child')) { 441 jQuery(".navbar .currenthover").hide(); 442 var lasthover = jQuery('.navbar .navbar-nav li.active').prev('li'); 443 hovericon(lasthover); 444 } 445 jQuery(".navbar-nav li").on("mouseover", function () { 446 if(jQuery(this).is(':last-child')) { 447 var lasthover = jQuery(this).prev('li'); 448 hovericon(lasthover); 449 } else { 450 hovericon(this); 451 } 452 }); 453 //MOBILE MENU - DONT LINK THROUGH TO PARENT PAGES 454 if (jQuery(window).width() < 992) { 455 jQuery('.menu-item-has-children').children('a').click(function(e) { 456 e.preventDefault(); 457 }); 458 //copy parent into menu 459 jQuery( "#mainnav li.menu-item-has-children" ).each(function( index ) { 460 var url = jQuery(this).children().attr('href'); 461 if (url == "#"){return;} 462 var parent_item_html = jQuery(this).children('a').html(); 463 jQuery(this).find('.dropdown-menu').prepend('<li><a class="dropdown-item" href="'+url+'">'+parent_item_html+'</a></li>'); 464 }); 465 //copy parent into menu for sidebars 466 jQuery( "#sidebar-menu li.menu-item-has-children" ).each(function( index ) { 467 var url = jQuery(this).children().attr('href'); 468 if (url == "#"){return;} 469 var parent_item_html = jQuery(this).children('a').html(); 470 jQuery(this).find('.sub-menu').prepend('<li><a class="dropdown-item" href="'+url+'">'+parent_item_html+'</a></li>'); 471 }); 472 } 473 474 //SIDEBAR MENU ON MOBILE 475 jQuery("#sidebar-menu").each(function (i, el) { 476 var isWrapped = false; 477 var $parent = jQuery(el).parent(); 478 var $el = jQuery(el); 479 480 var check = function() { 481 if (jQuery(window).width() < 780 && !isWrapped) { 482 if (jQuery('#sidebar-menu li:not(.sub-menu li)').length > 4) { 483 $wrap = jQuery('<div class="mobile-sidebarnav-contain"></div>') 484 $down = jQuery('<div class="showall"><i class="fas fa-chevron-circle-down"></i></div>'); 485 486 $el.wrapAll($wrap); 487 $el.parent().append($down); 488 isWrapped = true; 489 $down.click(function (e) { 490 $el.parent().toggleClass("open"); 491 }); 492 } 493 } else if(jQuery(window).width() >= 780 && isWrapped) { 494 $parent.append($el); 495 $parent.find(".mobile-sidebarnav-contain").remove(); 496 isWrapped = false; 497 } 498 }; 499 jQuery(window).resize(check); 500 check(); 501 }); 502 503 504 //add class if has submenu for top buttons 505 jQuery('#menu-top-buttons li').has("i").addClass('hasdropdown'); 506 507 //Homepage Tabs 508 jQuery('.homepage-tabs-nav .tab_button').on("click", function () { 509 jQuery('.homepage-tabs-nav .tab_button').removeClass('active'); 510 jQuery(this).addClass('active'); 511 var num = jQuery('.homepage-tabs-nav .tab_button').index(this)+1; 512 jQuery('.tabcontent .container').removeClass('active'); 513 jQuery('.tabcontent #tab-'+num).addClass('active'); 514 }); 515 516 //Newspage Pagnation 517 jQuery(".newseventcontainer").slice(0, 6).show(); 518 jQuery("#loadMore").on("click", function(e){ 519 e.preventDefault(); 520 jQuery(".newseventcontainer:hidden").slice(0, 3).slideDown(); 521 if(jQuery(".newseventcontainer:hidden").length == 0) { 522 jQuery("#loadMore").text("No More Posts").addClass("disabled"); 523 } 524 }); 525 526 //Newspage Newsletter Pagnation 527 jQuery(".newslettercontainer").slice(0, 6).show(); 528 jQuery("#loadMore").on("click", function(e){ 529 e.preventDefault(); 530 jQuery(".newslettercontainer:hidden").slice(0, 600).slideDown(); 531 if(jQuery(".newslettercontainer:hidden").length == 0) { 532 jQuery("#loadMore").text("No More Posts").addClass("disabled"); 533 } 534 }); 535 536 //Add search to burger menu 537 var search_html = jQuery('.google_search #searchform').parent().html(); 538 search_html = '<div id="mobilesearch">'+search_html+'</div>'; 539 jQuery('#mainnav').prepend(search_html); 540 541 //Clicking on search form button 542 jQuery(".searchformcontain .btn").on("click", function () { 543 jQuery(this).closest("form").submit(); 544 }); 545 546 //Search Form Submit 547 jQuery("input[name='s']").closest("form").on("submit", function () { 548 var searchvalue = jQuery(this).val(); 549 location.href = 'https://'+document.location.hostname+'?s='+searchvalue; 550 }); 551 552 //Remove top pixels when anchor link present 553 function offsetAnchor() { 554 if (location.hash.length !== 0) { 555 jQuery('body').scrollTop(jQuery(location.hash).position().top-200); 556 jQuery(location.hash).find('a.btn-primary').click(); 557 } 558 } 559 window.setTimeout(offsetAnchor, 0); 560 561 //Staff With pics page read more 562 jQuery('.read-more-button').on( "click", function() { 563 jQuery(this).parent().find('.allcontent,.desc_short').toggle(); 564 jQuery(this).text(jQuery(this).text() == 'More' ? 'Less' : 'More'); 565 }); 566 //Register an Interest form on vacancies page 567 if (document.body.classList.contains('page-template-vacancies')) {
568 jQuery('input:file').change(function(e){ 569 var filename = new String(e.target.files[0].name); 570 var file = '<p class="fileuploadname"><i class="fas fa-file-alt"></i> <span>'+filename+'</span></p>'; 571 jQuery('.cv_upload small').append(file); 572 }); 573 jQuery('.vacancy .btn-primary').click(function(){ 574 jQuery(this).text(function(i,old){ 575 return old=='View details' ? 'Hide details' : 'View details'; 576 }); 577 }); 578 } 579 580 581}); 582 583function hovericon(location){ 584 var newleft = jQuery(location).offset().left; 585 var leftpadding = jQuery(location).width()/2-18; 586 jQuery(".navbar .currenthover").css("left",newleft+leftpadding); 587 jQuery(".navbar .currenthover").css("display","block"); 588} 589 590(function() { 591 // Check if the body has the class "wp-admin" 592 if (document.body.classList.contains('wp-admin')) { 593 594 tinymce.PluginManager.add('custom_button', function(editor, url) { 595 editor.addButton('custom_button', { 596 title: 'Add Button', 597 icon: 'icon dashicons-before dashicons-format-aside', 598 onclick: function() { 599 // Add your custom button functionality here 600 601 let button_url = prompt("Please enter your URL", ""); 602 let button_text = prompt("Please enter your button text", ""); 603 let button_target = prompt("Would you like your page to open in a new window? Enter Yes or No.", ""); 604 605 if (button_target.toLowerCase() === 'yes') { 606 editor.insertContent('<a target="_blank" href="' + button_url + '" class="custom_button"><button class="btn">' + button_text + '</button></a>'); 607 } else { 608 editor.insertContent('<a href="' + button_url + '" class="custom_button"><button class="btn">' + button_text + '</button></a>'); 609 } 610 } 611 }); 612 }); 613 614 tinymce.PluginManager.add('colour_block', function(editor, url) { 615 editor.addButton('colour_block', { 616 title: 'Add Colour block', 617 icon: 'icon dashicons-before dashicons-format-aside', 618 onclick: function() { 619 // Add your custom button functionality here 620 621 editor.insertContent('<table class="custom_colour_block"><tbody><tr><td>Add content here</td></tr></tbody></table>'); 622 623 } 624 }); 625 }); 626 627 628 } 629 630 631 632 633})();
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.