PageSourceSearch

https://www.grace.com.au/wp-content/themes/shoredigital/js/main.js?ver=6.8.9

js grace.com.au collected 2026-09-24 22:28:06 UTC 66,018 bytes, 1,656 lines download raw bytes

1jQuery(document).ready(function( $ ) {
2
3    // START Hamburger menu
4    $(document).on('mouseup', function(e) {  
5	    // cache your elements
6	    const $target = $(e.target);
7	    const $containers = $('#masthead, .mega-menu, .menu-button, .menu-button-desktop, .responsive-navigation, .quote-modal, .simple-menu-content');
8
9	    // check if click is outside all of these
10	    if (!$target.closest($containers).length) { 
11	        $('.menu-toggle, .menu-button-desktop').removeClass('toggled');
12	        $('.menu-toggle').closest('header').find('.site-navigation').removeClass('active');
13	        $('body').removeClass('disabled');
14	        $('html').removeClass('no-scroll');
15
16	        $('#masthead').removeClass('header--mega-menu');
17	        $('.site-header').removeClass('show-mega-menu');
18	        $('.desktop-toggle-menu-contents').removeClass('active');
19	        $('.mega-menu-parent, .header-menu-parent, .header-menu-parent, .mega-menu-container, .parent-mega-menu, .parent-header-menu, .mega-menu-button, .mega-menu-mobile-button, .mega-menu-content')
20	          .removeClass('active d-active');
21	        $('.mega-menu-parent, #search-mega-menu-toggle').removeClass('d-active m-active');
22	        $('.site-header-content').removeClass('d-toggled');
23	    }
24	});
25
26	$(document).on('click', '.menu-button', function(){
27		$(this).toggleClass('active');
28        $(this).find('.menu-toggle').toggleClass('toggled');
29        $(this).closest('header').find('.site-navigation').toggleClass('active');
30        $('body').toggleClass('disabled');
31        $('html').toggleClass('no-scroll');
32
33        // Clear Selections
34        $('.mega-menu-content, .mega-menu-parent, .parent-mega-menu').removeClass('m-active');
35        $('.mega-menu-mobile-button').removeClass('active');
36        $('.mega-menu-container, .mega-menu-parent, #search-mega-menu-toggle').removeClass('active d-active m-active');
37
38        $('.desktop-toggle-menu-contents .mega-menu-container').toggleClass('d-active');
39        $('.mega-menu-parent[data-target="personal"], .parent-mega-menu[data-menu="personal"], .mega-menu-parent[data-target="first"], .parent-mega-menu[data-menu="first"]').addClass('m-active');
40    });
41
42    $(document).on('click', '.menu-button-desktop', function(){
43        $(this).toggleClass('toggled');
44        $('.menu-button').find('.menu-toggle').toggleClass('toggled');
45        $(this).closest('header').find('.site-navigation').toggleClass('active');
46        $('body').toggleClass('disabled');
47        $('html').toggleClass('no-scroll');
48        $('.desktop-toggle-menu-contents').toggleClass('active');
49        $('.site-header-content').toggleClass('d-toggled');
50
51        // Clear Selections
52        $('.mega-menu-content, .mega-menu-parent, .parent-mega-menu').removeClass('d-active m-active');
53        $('.mega-menu-mobile-button').removeClass('active');
54        $('.mega-menu-container, .mega-menu-parent, #search-mega-menu-toggle').removeClass('active d-active m-active');
55
56        $('#masthead').toggleClass('header--mega-menu');
57
58        $('.desktop-toggle-menu-contents .mega-menu-container').toggleClass('d-active');
59        $('.desktop-toggle-menu-contents .parent-mega-menu[data-menu="Services"], .desktop-toggle-menu-contents .mega-menu-parent[data-target="Services"]').addClass('d-active m-active');
60    });
61
62    $(document).on('click', '.menu-bar-heading', function(){
63    	$("html, body").animate({ scrollTop: 0 }, "slow");
64    	return false;
65    });
66
67    $(document).on('click', '.page-menu-nav-toggle', function(){
68    	$(this).toggleClass('m-active');
69    	$(this).next('div').toggleClass('m-active');
70    });
71
72    $(document).on('click', '.page-menu-bar-content a', function(){
73    	$(this).closest('.page-menu-bar-col').find('.page-menu-nav-toggle').removeClass('m-active');
74    	$(this).closest('.page-menu-bar-col').find('.page-menu-nav-toggle').next('div').removeClass('m-active');
75    });
76
77    $(document).on('click', '.mobile-back-link', function(){
78    	// Clear Selections
79    	$('.mega-menu-content, .mega-menu-parent, .parent-mega-menu').removeClass('m-active');
80    	$('.mega-menu-container, .mega-menu-parent, #search-mega-menu-toggle').removeClass('active d-active m-active');
81
82    });
83
84	$('.sub-menu-toggle').click(function(){
85		$(this).next().slideToggle();
86	});
87
88	// Mobile sub nav toggle
89	$(document).on('click', '.sub-nav-toggle', function(e){
90		if ($(window).width() <= 1023) {
91			$(this).prev().toggleClass('active');
92			$(this).toggleClass('active');
93			$(this).next().slideToggle(400);
94		}
95	});
96	// END Hamburger menu	
97
98	// Open video popup
99	$(document).on('click', '.e-video-button', function () {
100		var heading = $(this).text(),
101			url = $(this).attr('data-video');
102
103		$('.video-popup').removeClass('active').addClass('active');
104		$('html').removeClass('no-scroll');
105
106		setTimeout(function () {
107			$('html').addClass('no-scroll');
108		}, 150);
109	});
110
111	$(".video-popup-close").on("click", function () {
112		setTimeout(function () {
113			$('.video-popup').removeClass('active');
114			$('html').removeClass('no-scroll');
115		}, 150);
116	});
117
118	// Close popup
119	$('.video-popup').mouseup(function (e) {
120		if (!$('.video-popup-content').is(e.target) && $('.video-popup-wrapper').has(e.target).length === 0) {
121			$('.video-popup').removeClass('active');
122			$('html').removeClass('no-scroll');
123		}
124	});
125
126	$(document).on('click', '.e-download', function () {
127		$('.e-page-2').addClass('active');
128	});
129
130	$(document).on('click, mouseover', '.results-button', function () {
131		$(this).hide();
132		$('.results-form').show();
133	});
134
135	//Add current class to mega menu item
136	$('.mega-menu-all-link a.current').closest('.parent-mega-menu[data-menu="personal"]').closest('.mega-menu').find('.mega-menu-parent[data-target="personal"]').addClass('current');
137	$('.current_page_item').closest('.parent-mega-menu[data-menu="personal"]').closest('.mega-menu').find('.mega-menu-parent[data-target="personal"]').addClass('current');
138
139	$('.mega-menu-all-link a.current').closest('.parent-mega-menu[data-menu="business"]').closest('.mega-menu').find('.mega-menu-parent[data-target="business"]').addClass('current');
140	$('.current_page_item').closest('.parent-mega-menu[data-menu="business"]').closest('.mega-menu').find('.mega-menu-parent[data-target="business"]').addClass('current');
141
142	// Add current mega menu state
143	const currentMenu = $('.current-menu-item').closest('.parent-mega-menu').attr('data-menu');
144	$('.mega-menu-parent[data-target="'+currentMenu+'"]').addClass('current-mega-menu');
145
146	// Mega menu parent button
147	$(document).on('click', '.mega-menu-parent, #search-mega-menu-toggle', function () {
148		var target = $(this).attr('data-target');
149
150		// Clear selections
151		$('.parent-mega-menu, .mega-menu-button, .mega-menu-mobile-button, .mega-menu-content').removeClass('active d-active');
152		$(this).siblings().removeClass('d-active').removeClass('m-active');
153
154		$(this).addClass('d-active');
155
156		// Mobile
157		$('.parent-mega-menu, .mega-menu-content').removeClass('m-active');
158		$(this).toggleClass('m-active');
159
160		if ( $(this).hasClass('d-active') ){
161			$('.mega-menu-container').addClass('d-active');
162
163			// Disable scrolling
164			$('body').addClass('disabled');
165			$('html').addClass('no-scroll');
166
167			// Add class to site-header
168			$('.site-header').addClass('show-mega-menu');
169
170			$('.parent-mega-menu[data-menu="'+target+'"]').addClass('d-active');
171			$('.parent-mega-menu[data-menu="'+target+'"]').addClass('m-active');
172
173		} else{
174			$('.mega-menu-container').removeClass('d-active');
175
176			// Disable scrolling
177			$('body').removeClass('disabled');
178			$('html').removeClass('no-scroll');
179
180			// Add class to site-header
181			$('.site-header').removeClass('show-mega-menu');
182
183			$('.parent-mega-menu[data-menu="'+target+'"]').removeClass('d-active');
184			$('.parent-mega-menu[data-menu="'+target+'"]').removeClass('m-active');
185		}
186
187		// Reset navigator position
188		$('.button-navigator').css('top','0');
189
190	});
191
192	// Mega menu parent button
193	$(document).on('click mouseenter', '.header-menu-parent, .header-search-button', function () {
194		var target = $(this).attr('data-target');
195
196		// Clear selections
197		$('.parent-header-menu, .header-menu-button, .header-menu-mobile-button, .header-menu-content').removeClass('active d-active');
198		$(this).siblings().removeClass('d-active').removeClass('m-active');
199
200		$(this).addClass('d-active');
201
202		// Mobile
203		$('.parent-header-menu, .header-menu-content').removeClass('m-active');
204		$(this).toggleClass('m-active');
205
206		if ( $(this).hasClass('d-active') ){
207			$('.header-menu-container').addClass('d-active');
208
209			// Disable scrolling
210			// $('body').addClass('disabled');
211			// $('html').addClass('no-scroll');
212
213			// Add class to site-header
214			$('.site-header').addClass('show-header-menu');
215
216			$('.parent-header-menu[data-menu="'+target+'"]').addClass('d-active');
217			$('.parent-header-menu[data-menu="'+target+'"]').addClass('m-active');
218
219		} else{
220			$('.header-menu-container').removeClass('d-active');
221
222			// Disable scrolling
223			$('body').removeClass('disabled');
224			$('html').removeClass('no-scroll');
225
226			// Add class to site-header
227			$('.site-header').removeClass('show-header-menu');
228
229			$('.parent-header-menu[data-menu="'+target+'"]').removeClass('d-active');
230			$('.parent-header-menu[data-menu="'+target+'"]').removeClass('m-active');
231		}
232
233		// Reset navigator position
234		$('.button-navigator').css('top','0');
235
236	});
237
238	// Desktop only: auto close mega menu after 1.5 seconds
239	if (window.innerWidth > 1024) {
240	    let megaMenuTimeout;
241
242	    const $menuArea = $('.header-menu-parents');
243
244	    const closeMegaMenu = () => {
245	        $('.menu-toggle, .menu-button-desktop').removeClass('toggled');
246	        $('.menu-toggle').closest('header').find('.site-navigation').removeClass('active');
247
248	        $('body').removeClass('disabled');
249	        $('html').removeClass('no-scroll');
250
251	        $('#masthead').removeClass('header--mega-menu');
252	        $('.site-header').removeClass('show-mega-menu');
253
254	        $('.desktop-toggle-menu-contents').removeClass('active');
255
256	        $('.header-menu-parent, .mega-menu-container, .parent-header-menu, .mega-menu-button, .mega-menu-mobile-button, .mega-menu-content')
257	            .removeClass('active d-active');
258
259	        $('.header-menu-parent, #search-mega-menu-toggle')
260	            .removeClass('d-active m-active');
261
262	        $('.site-header-content').removeClass('d-toggled');
263	    };
264
265	    $menuArea.on('mouseleave', function (e) {
266	        const nextElement = e.relatedTarget;
267
268	        // Do not close if the mouse is still inside another menu area
269	        if (nextElement && $menuArea.toArray().some(el => el.contains(nextElement))) {
270	            return;
271	        }
272
273	        clearTimeout(megaMenuTimeout);
274
275	        megaMenuTimeout = setTimeout(() => {
276	            closeMegaMenu();
277	        }, 1500);
278	    });
279
280	    $menuArea.on('mouseenter', function () {
281	        clearTimeout(megaMenuTimeout);
282	    });
283
284	    $('.mega-menu-parent').on('click', function () {
285	        //closeMegaMenu();
286	    });
287	}
288
289
290	// Mega menu close button
291	$(document).on('click', '.mega-menu-close', function () {
292		$('body').removeClass('disabled');
293		$('html').removeClass('no-scroll');
294		$('#masthead').removeClass('header--mega-menu');
295		$('.site-header').removeClass('show-mega-menu');
296		$('.mega-menu-parent, .mega-menu-container, .parent-mega-menu, .mega-menu-button, .mega-menu-mobile-button, .mega-menu-content').removeClass('active d-active m-active');
297	});
298
299	$(document).on('click', '.mega-menu-button', function () {
300		var target = $(this).text(),
301			navigatorPos = $(this).position().top;
302
303		// Clear selection
304		$(this).closest('.parent-mega-menu').find('.mega-menu-button, .mega-menu-content, .mega-menu-mobile-button').removeClass('active');
305
306		$(this).addClass('active');
307
308		$('.mega-menu-content[data-content="'+target+'"]').addClass('active');
309
310		// Set navigator position
311		$('.button-navigator').css('top', navigatorPos+'px');
312
313		$('.mega-menu-mobile-button[data-menu="'+target+'"]').addClass('active');
314
315		$('.mega-menu-content[data-content="'+target+'"]').addClass('m-active');
316	});
317
318	$(document).on('click', '.mega-menu-mobile-button', function () {
319		var target = $(this).attr('data-menu'),
320			navigatorPos = $(this).position().top;
321
322		$(this).toggleClass('active');
323
324		$('.mega-menu-content[data-content="'+target+'"], .mega-menu-button[data-menu="'+target+'"]').toggleClass('active');
325
326		$('.mega-menu-content[data-content="'+target+'"]').toggleClass('m-active');
327
328		$('.button-navigator').css('top', navigatorPos+'px');
329	});
330
331	$(document).on('mouseup', 'body',function(e){  
332
333	    var searchHasFocus = $('#s').is(':focus');
334	    if(!searchHasFocus && $('#searchsubmit').has(e.target).length === 0){
335	        $('#s, #searchsubmit').removeClass('active');
336	        $('.search-toggle').removeClass('toggled');
337	    }
338	});
339
340	$(document).on('click', '.search-toggle', function () {
341		$(this).addClass('toggled');
342		$(this).closest('#searchform').find('#s').addClass('active').focus();
343		$(this).closest('#searchform').find('#searchsubmit').addClass('active');
344	});
345
346	// Scroll to fix.
347	$(window).scroll(function(event){
348
349		var top_of_element = $(".site-content").offset().top,
350			bottom_of_element = $(".site-content").offset().top + $("#masthead").outerHeight(),
351			bottom_of_screen = $(window).scrollTop() + $(window).innerHeight(),
352			top_of_screen = $(window).scrollTop();
353
354	    if (top_of_screen < bottom_of_element){
355	        $('#masthead').removeClass('header-fixed');
356	    } else {
357	        $('#masthead').addClass('header-fixed');	
358	    }
359
360	    
361	});
362
363	headerHideOnScroll();
364
365	function headerHideOnScroll(){
366    	// Hide Header on scroll down.
367		var didScroll;
368		var lastScrollTop = 0;
369		var delta = 5;
370		var navbarHeight = $('#masthead').height();
371		$(window).scroll(function(event){
372		    didScroll = true;
373		});
374		setInterval(function() {
375		    if (didScroll) {
376		        var st = $(this).scrollTop();
377		        
378		        // Make sure they scroll more than delta
379		        if(Math.abs(lastScrollTop - st) <= delta)
380		            return;
381		        
382		        // If they scrolled down and are past the navbar, add class .nav-up.
383		        // This is necessary so you never see what is "behind" the navbar.
384		        if (st > lastScrollTop && st > navbarHeight){
385		            // Scroll Down
386		            $('.site-header').addClass('header--offscreen');
387		            
388		        } else {
389		        	// Scroll Up
390		            if(st + $(window).height() < $(document).height()) {
391		                $('.site-header').removeClass('header--offscreen');
392		            }
393		        }
394		        
395		        lastScrollTop = st;
396		        didScroll = false;
397		    }
398		}, 150);
399    }// http://jsfiddle.net/mariusc23/s6mLJ/31/
400
401	// Trustpilot
402	//jQuery(window).on("load", function() {
403		if( $('.trustpilot').length ){
404
405			var settings = {
406			  "url": "https://api.trustpilot.com/v1/business-units/find?apikey=KhY2y4b9CHmoOH2nYbXbbgNRhLq3Fxl0&name=grace.com.au",
407			  "method": "GET",
408			  "timeout": 0,
409			  "headers": {
410			    "Content-Type": "application/json"
411			  }
412			};
413
414			jQuery.ajax(settings).done(function (trustpilotData) {
415                
416			  	var tpReviews = trustpilotData.numberOfReviews.total,
417			  		tpReviewsRating = trustpilotData.score.trustScore,
418			  		tpStars = trustpilotData.score.stars;
419
420				$('.trustpilot-stars-image').attr('src', 'https://cdn.trustpilot.net/brand-assets/4.0.0/stars/stars-'+tpStars+'.svg');
421				$('.trustpilot-trustscore').html(tpReviewsRating);
422				$('.trustpilot-reviews').html(tpReviews);
423				$('.trustpilot-stars').html(tpStars);
424				$('.trustpilot-logo').attr('src', 'https://cdn.trustpilot.net/brand-assets/1.1.0/logo-black.svg');
425				$('.trustpilot-logo-white').attr('src', 'https://cdn.trustpilot.net/brand-assets/1.1.0/logo-white.svg');
426
427				// Pass data to schema
428				// trustpilotSchema(tpReviews, tpReviewsRating);
429
430				// Show widget
431				$('.trustpilot').removeClass('tp-hide');
432			});
433		}
434
435		// if( $('.trustpilot[data-layout="3"]').length ){
436
437		// 	var tpSettings = {
438		// 	  "url": "https://api.trustpilot.com/v1/business-units/5e40ed7cf51bb10001748164/reviews?apikey=KhY2y4b9CHmoOH2nYbXbbgNRhLq3Fxl0&name=grace.com.au",
439		// 	  "method": "GET",
440		// 	  "timeout": 0,
441		// 	  "headers": {
442		// 	    "Content-Type": "application/json"
443		// 	  }
444		// 	};
445
446		// 	$.ajax(tpSettings).done(function (tpData) {
447		// 		var review = tpData.reviews;
448
449		// 		$(review).each(function(){
450
451		// 			var month = new Array();
452		// 				month[0] = "January";
453		// 				month[1] = "February";
454		// 				month[2] = "March";
455		// 				month[3] = "April";
456		// 				month[4] = "May";
457		// 				month[5] = "June";
458		// 				month[6] = "July";
459		// 				month[7] = "August";
460		// 				month[8] = "September";
461		// 				month[9] = "October";
462		// 				month[10] = "November";
463		// 				month[11] = "December";
464
465		// 			var dateCreated = new Date(this.createdAt),
466		// 				tpDate = dateCreated.getDate()+' '+month[dateCreated.getMonth()],
467		// 				tpReview = ( this.text.length > 100 ) ? this.text.substr(0,100)+'...' : this.text;
468
469		// 			if( this.stars > 3 ){
470		// 				$('.tp-three .tp-slider').append('<div class="tp-slide"><div class="tp-slide-header"><img width="115" src="https://cdn.trustpilot.net/brand-assets/4.0.0/stars/stars-'+this.stars+'.svg"><div class="tp-review-date">'+tpDate+'</div></div><div class="tp-slide-content"><div class="tp-review-title">'+this.title+'</div><div class="tp-review-text">'+tpReview+'</div></div><div class="tp-slide-footer"><div class="tp-consumer">'+this.consumer.displayName+'</div></div>');
471		// 			}
472		// 		});
473
474
475		// 		$('.tp-three .tp-slider').slick({
476		// 		  dots: false,
477		// 		  infinite: true,
478		// 		  speed: 300,
479		// 		  slidesToShow: 3,
480		// 		  slidesToScroll: 3,
481		// 		  responsive: [
482		// 		    {
483		// 		      breakpoint: 1025,
484		// 		      settings: {
485		// 		        slidesToShow: 2,
486		// 		        slidesToScroll: 2
487		// 		      }
488		// 		    },
489		// 		    {
490		// 		      breakpoint: 800,
491		// 		      settings: {
492		// 		        slidesToShow: 1,
493		// 		        slidesToScroll: 1
494		// 		      }
495		// 		    }
496		// 		    // You can unslick at a given breakpoint now by adding:
497		// 		    // settings: "unslick"
498		// 		    // instead of a settings object
499		// 		  ]
500		// 		});	
501		// 	});
502
503		// 	var settings = {
504		// 	  "url": "https://api.trustpilot.com/v1/business-units/find?apikey=KhY2y4b9CHmoOH2nYbXbbgNRhLq3Fxl0&name=grace.com.au",
505		// 	  "method": "GET",
506		// 	  "timeout": 0,
507		// 	  "headers": {
508		// 	    "Content-Type": "application/json"
509		// 	  }
510		// 	};
511
512		// 	jQuery.ajax(settings).done(function (trustpilotData) {
513			             
514		// 	  	var tpReviews = trustpilotData.numberOfReviews.total,
515		// 	  		tpReviewsRating = trustpilotData.score.trustScore,
516		// 	  		tpStars = trustpilotData.score.stars;
517				
518		// 		// Pass data to schema
519		// 		// trustpilotSchema(tpReviews, tpReviewsRating);
520		// 	});
521		// }
522		if ($('.trustpilot[data-layout="3"]').length) {
523			var tpSettings = {
524				"url": "https://api.trustpilot.com/v1/business-units/5e40ed7cf51bb10001748164/reviews?apikey=KhY2y4b9CHmoOH2nYbXbbgNRhLq3Fxl0&name=grace.com.au",
525				"method": "GET",
526				"timeout": 0,
527				"headers": {
528					"Content-Type": "application/json"
529				}
530			};
531		
532			$.ajax(tpSettings).done(function (tpData) {
533				var reviews = tpData.reviews;
534		
535				// Predefined background colors
536				var avatarColors = ["#7FDC98", "#A8EEEA", "#F4F6AA"];
537		
538				$(reviews).each(function () {
539					var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "
539November", "December"];
540					var dateCreated = new Date(this.createdAt);
541					var tpDate = dateCreated.getDate() + ' ' + monthNames[dateCreated.getMonth()] + ' ' + dateCreated.getFullYear();
542		
543					var fullReviewText = this.text;
544					var shortReviewText = fullReviewText.length > 200 ? fullReviewText.substr(0, 200) + '...' : fullReviewText;
545		
546					// Get first name initials for profile icon
547					var initials = this.consumer.displayName.split(" ").map(word => word[0]).join("").toUpperCase();
548		
549					// Get a random color from the array
550					var randomColor = avatarColors[Math.floor(Math.random() * avatarColors.length)];
551	
552					var reviewCount = this.consumer.numberOfReviews || "1"; // Default to 1 if missing
553	
554					var userCountry = this.consumer.location ? this.consumer.location.countryCode : "AU"; // Default to AU
555	
556					var locationSVG = `
557					<svg width="12" height="16" viewBox="0 0 12 16" fill="none" xmlns="http://www.w3.org/2000/svg">
558						<path fill-rule="evenodd" clip-rule="evenodd" d="M6.00029 0H5.99971C4.41185 0.00190356 2.88783 0.668991 1.76243 1.85783C0.636727 3.04698 0.00181081 4.66138 0 6.34741V6.34775C0 8.60279 0.985365 10.9599 2.80505 13.1675C3.62319 14.1656 4.54384 15.0642 5.54992 15.8467L5.54988 15.8468L5.555 15.8506C5.68699 15.9483 5.84325 16 6.00261 16C6.16196 16 6.31822 15.9483 6.45022 15.8506L6.45026 15.8507L6.45552 15.8466C7.45975 15.0637 8.37861 14.1651 9.1951 13.1673C11.0119 10.9599 12 8.60293 12 6.34775V6.34741C11.9982 4.66138 11.3633 3.04698 10.2376 1.85783C9.11217 0.668991 7.58815 0.00190356 6.00029 0ZM2.86591 3.05046C3.69565 2.17394 4.82286 1.67988 6 1.67988C7.17714 1.67988 8.30435 2.17394 9.13409 3.05046C9.96354 3.92666 10.4278 5.11294 10.4278 6.34775C10.4278 8.2231 9.56543 9.96721 8.54306 11.3717C7.61686 12.6441 6.57938 13.6102 5.99999 14.1064C5.42058 13.6103 4.38311 12.6444 3.45693 11.3722C2.43458 9.96792 1.57219 8.2238 1.57219 6.34775C1.57219 5.11294 2.03646 3.92666 2.86591 3.05046Z" fill="#AEB3B6"/>
559						<circle cx="6" cy="6" r="2" fill="#AEB3B6"/>
560					</svg>`;
561		
562					var reviewHTML = `
563						<div class="tp-slide">
564							<div class="tp-review-card">
565								<div class="tp-header">
566									<div class="tp-avatar" style="background: ${randomColor};">${initials}</div>
567									<div class="tp-user-info">
568										<strong>${this.consumer.displayName}</strong>
569										<div class="tp-user-meta">
570											${reviewCount} Reviews ${locationSVG} ${userCountry}
571										</div>
572									</div>
573								</div>
574		
575								<div class="tp-divider"></div>
576		
577								<div class="tp-stars">
578									<img src="https://cdn.trustpilot.net/brand-assets/4.0.0/stars/stars-${this.stars}.svg">
579								</div>
580		
581								<div class="tp-review-content">
582									<div class="tp-review-title">${this.title}</div>
583									<div class="tp-review-text">${shortReviewText}</div>
584								</div>
585		
586								<div class="tp-date">
587									<strong class="tp-date-title">Date of experience:</strong> <span class="tp-date-text">${tpDate}</span>
588								</div>
589							</div>
590						</div>
591					`;
592		
593					$('.tp-three .tp-slider').append(reviewHTML);
594				});
595		
596				// Initialize Slick Slider
597				$('.tp-three .tp-slider').slick({
598					dots: true,
599					arrows: true,
600					infinite: true,
601					speed: 500,
602					slidesToShow: 3,
603					slidesToScroll: 1,
604					autoplay: true,
605					autoplaySpeed: 3000,
606					prevArrow: '<div class="slick-prev"><svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="47" y="47" width="46" height="46" rx="23" transform="rotate(180 47 47)" stroke="#858C91" stroke-width="2"/><path d="M18.1304 23.3809L26.8804 14.6309C26.9617 14.5496 27.0583 14.4852 27.1645 14.4412C27.2707 14.3972 27.3845 14.3745 27.4995 14.3745C27.6145 14.3745 27.7283 14.3972 27.8345 14.4412C27.9408 14.4852 28.0373 14.5496 28.1186 14.6309C28.1999 14.7122 28.2644 14.8087 28.3084 14.915C28.3524 15.0212 28.375 15.135 28.375 15.25C28.375 15.365 28.3524 15.4788 28.3084 15.585C28.2644 15.6913 28.1999 15.7878 28.1186 15.8691L19.9865 24L28.1186 32.1309C28.2828 32.2951 28.375 32.5178 28.375 32.75C28.375 32.9822 28.2828 33.2049 28.1186 33.3691C27.9544 33.5332 27.7317 33.6255 27.4995 33.6255C27.2673 33.6255 27.0446 33.5332 26.8805 33.3691L18.1304 24.6191C18.0491 24.5378 17.9846 24.4413 17.9405 24.3351C17.8965 24.2289 17.8738 24.115 17.8738 24C17.8738 23.885 17.8965 23.7712 17.9405 23.6649C17.9846 23.5587 18.0491 23.4622 18.1304 23.3809Z" fill="#858C91"/></svg></div>',
607					nextArrow: '<div class="slick-next"><svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="46" height="46" rx="23" stroke="#858C91" stroke-width="2"/><path d="M29.8695 24.6191L21.1195 33.3691C21.0383 33.4504 20.9417 33.5148 20.8355 33.5588C20.7293 33.6028 20.6155 33.6255 20.5005 33.6255C20.3855 33.6255 20.2717 33.6028 20.1655 33.5588C20.0592 33.5148 19.9627 33.4504 19.8814 33.3691C19.8001 33.2878 19.7356 33.1913 19.6916 33.085C19.6476 32.9788 19.625 32.865 19.625 32.75C19.625 32.635 19.6476 32.5212 19.6916 32.415C19.7356 32.3087 19.8001 32.2122 19.8814 32.1309L28.0135 24L19.8814 15.8691C19.7172 15.7049 19.625 15.4822 19.625 15.25C19.625 15.0178 19.7172 14.7951 19.8814 14.6309C20.0456 14.4668 20.2683 14.3745 20.5005 14.3745C20.7327 14.3745 20.9554 14.4668 21.1195 14.6309L29.8695 23.3809C29.9509 23.4622 30.0154 23.5587 30.0595 23.6649C30.1035 23.7711 30.1262 23.885 30.1262 24C30.1262 24.115 30.1035 24.2288 30.0595 24.3351C30.0154 24.4413 29.9509 24.5378 29.8695 24.6191Z" fill="#858C91"/></svg></div>',
608					responsive: [
609						{
610							breakpoint: 1025,
611							settings: {
612								slidesToShow: 2,
613								slidesToScroll: 1
614							}
615						},
616						{
617							breakpoint: 768,
618							settings: {
619								slidesToShow: 1,
620								slidesToScroll: 1
621							}
622						}
623					]
624				});
625			});
626		}
627
628		if ($('.trustpilot[data-layout="6"]').length) {
629			var tag = $('.trustpilot[data-layout="6"]').attr('data-tag');
630
631			var tpSettings = {
632				"url": "https://api.trustpilot.com/v1/business-units/5e40ed7cf51bb10001748164/reviews?apikey=YRNkfZGlbjAhuJLtxlI4KDBNLVHghzsP&name=grace.com.au&stars=3,4,5&tagValue="+tag+"&perPage=15&page=1",
633				"method": "GET",
634				"timeout": 0,
635				"headers": {
636					"Content-Type": "application/json"
637				}
638			};
639		
640			$.ajax(tpSettings).done(function (tpData) {
641				var reviews = tpData.reviews;
642		
643				// Predefined background colors
644				var avatarColors = ["#7FDC98", "#A8EEEA", "#F4F6AA"];
645		
646				$(reviews).each(function () {
647					var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "
647November", "December"];
648					var dateCreated = new Date(this.createdAt);
649					var tpDate = dateCreated.getDate() + ' ' + monthNames[dateCreated.getMonth()] + ' ' + dateCreated.getFullYear();
650		
651					var fullReviewText = this.text;
652					var shortReviewText = fullReviewText.length > 200 ? fullReviewText.substr(0, 200) + '...' : fullReviewText;
653		
654					// Get first name initials for profile icon
655					var initials = this.consumer.displayName.split(" ").map(word => word[0]).join("").toUpperCase();
656		
657					// Get a random color from the array
658					var randomColor = avatarColors[Math.floor(Math.random() * avatarColors.length)];
659	
660					var reviewCount = this.consumer.numberOfReviews || "1"; // Default to 1 if missing
661	
662					var userCountry = this.consumer.location ? this.consumer.location.countryCode : "AU"; // Default to AU
663	
664					var locationSVG = `
665					<svg width="12" height="16" viewBox="0 0 12 16" fill="none" xmlns="http://www.w3.org/2000/svg">
666						<path fill-rule="evenodd" clip-rule="evenodd" d="M6.00029 0H5.99971C4.41185 0.00190356 2.88783 0.668991 1.76243 1.85783C0.636727 3.04698 0.00181081 4.66138 0 6.34741V6.34775C0 8.60279 0.985365 10.9599 2.80505 13.1675C3.62319 14.1656 4.54384 15.0642 5.54992 15.8467L5.54988 15.8468L5.555 15.8506C5.68699 15.9483 5.84325 16 6.00261 16C6.16196 16 6.31822 15.9483 6.45022 15.8506L6.45026 15.8507L6.45552 15.8466C7.45975 15.0637 8.37861 14.1651 9.1951 13.1673C11.0119 10.9599 12 8.60293 12 6.34775V6.34741C11.9982 4.66138 11.3633 3.04698 10.2376 1.85783C9.11217 0.668991 7.58815 0.00190356 6.00029 0ZM2.86591 3.05046C3.69565 2.17394 4.82286 1.67988 6 1.67988C7.17714 1.67988 8.30435 2.17394 9.13409 3.05046C9.96354 3.92666 10.4278 5.11294 10.4278 6.34775C10.4278 8.2231 9.56543 9.96721 8.54306 11.3717C7.61686 12.6441 6.57938 13.6102 5.99999 14.1064C5.42058 13.6103 4.38311 12.6444 3.45693 11.3722C2.43458 9.96792 1.57219 8.2238 1.57219 6.34775C1.57219 5.11294 2.03646 3.92666 2.86591 3.05046Z" fill="#AEB3B6"/>
667						<circle cx="6" cy="6" r="2" fill="#AEB3B6"/>
668					</svg>`;
669		
670					var reviewHTML = `
671						<div class="tp-slide">
672							<div class="tp-review-card">
673								<div class="tp-header">
674									<div class="tp-avatar" style="background: ${randomColor};">${initials}</div>
675									<div class="tp-user-info">
676										<strong>${this.consumer.displayName}</strong>
677										<div class="tp-user-meta">
678											${reviewCount} Reviews ${locationSVG} ${userCountry}
679										</div>
680									</div>
681								</div>
682		
683								<div class="tp-divider"></div>
684		
685								<div class="tp-stars">
686									<img src="https://cdn.trustpilot.net/brand-assets/4.0.0/stars/stars-${this.stars}.svg">
687								</div>
688		
689								<div class="tp-review-content">
690									<div class="tp-review-title">${this.title}</div>
691									<div class="tp-review-text">${shortReviewText}</div>
692								</div>
693		
694								<div class="tp-date">
695									<strong class="tp-date-title">Date of experience:</strong> <span class="tp-date-text">${tpDate}</span>
696								</div>
697							</div>
698						</div>
699					`;
700		
701					$('.tp-six .tp-slider').append(reviewHTML);
702				});
703		
704				// Initialize Slick Slider
705				$('.tp-six .tp-slider').slick({
706					dots: true,
707					arrows: true,
708					infinite: true,
709					speed: 500,
710					slidesToShow: 3,
711					slidesToScroll: 1,
712					autoplay: true,
713					autoplaySpeed: 3000,
714					prevArrow: '<div class="slick-prev"><svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="47" y="47" width="46" height="46" rx="23" transform="rotate(180 47 47)" stroke="#858C91" stroke-width="2"/><path d="M18.1304 23.3809L26.8804 14.6309C26.9617 14.5496 27.0583 14.4852 27.1645 14.4412C27.2707 14.3972 27.3845 14.3745 27.4995 14.3745C27.6145 14.3745 27.7283 14.3972 27.8345 14.4412C27.9408 14.4852 28.0373 14.5496 28.1186 14.6309C28.1999 14.7122 28.2644 14.8087 28.3084 14.915C28.3524 15.0212 28.375 15.135 28.375 15.25C28.375 15.365 28.3524 15.4788 28.3084 15.585C28.2644 15.6913 28.1999 15.7878 28.1186 15.8691L19.9865 24L28.1186 32.1309C28.2828 32.2951 28.375 32.5178 28.375 32.75C28.375 32.9822 28.2828 33.2049 28.1186 33.3691C27.9544 33.5332 27.7317 33.6255 27.4995 33.6255C27.2673 33.6255 27.0446 33.5332 26.8805 33.3691L18.1304 24.6191C18.0491 24.5378 17.9846 24.4413 17.9405 24.3351C17.8965 24.2289 17.8738 24.115 17.8738 24C17.8738 23.885 17.8965 23.7712 17.9405 23.6649C17.9846 23.5587 18.0491 23.4622 18.1304 23.3809Z" fill="#858C91"/></svg></div>',
715					nextArrow: '<div class="slick-next"><svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="46" height="46" rx="23" stroke="#858C91" stroke-width="2"/><path d="M29.8695 24.6191L21.1195 33.3691C21.0383 33.4504 20.9417 33.5148 20.8355 33.5588C20.7293 33.6028 20.6155 33.6255 20.5005 33.6255C20.3855 33.6255 20.2717 33.6028 20.1655 33.5588C20.0592 33.5148 19.9627 33.4504 19.8814 33.3691C19.8001 33.2878 19.7356 33.1913 19.6916 33.085C19.6476 32.9788 19.625 32.865 19.625 32.75C19.625 32.635 19.6476 32.5212 19.6916 32.415C19.7356 32.3087 19.8001 32.2122 19.8814 32.1309L28.0135 24L19.8814 15.8691C19.7172 15.7049 19.625 15.4822 19.625 15.25C19.625 15.0178 19.7172 14.7951 19.8814 14.6309C20.0456 14.4668 20.2683 14.3745 20.5005 14.3745C20.7327 14.3745 20.9554 14.4668 21.1195 14.6309L29.8695 23.3809C29.9509 23.4622 30.0154 23.5587 30.0595 23.6649C30.1035 23.7711 30.1262 23.885 30.1262 24C30.1262 24.115 30.1035 24.2288 30.0595 24.3351C30.0154 24.4413 29.9509 24.5378 29.8695 24.6191Z" fill="#858C91"/></svg></div>',
716					responsive: [
717						{
718							breakpoint: 1025,
719							settings: {
720								slidesToShow: 2,
721								slidesToScroll: 1
722							}
723						},
724						{
725							breakpoint: 768,
726							settings: {
727								slidesToShow: 1,
728								slidesToScroll: 1
729							}
730						}
731					]
732				});
733			});
734		}
735
736		if ($('.trustpilot[data-layout="7"]').length) {
737			var tpSettings = {
738				"url": "https://api.trustpilot.com/v1/business-units/5e40ed7cf51bb10001748164/reviews?apikey=YRNkfZGlbjAhuJLtxlI4KDBNLVHghzsP&name=grace.com.au&stars=3,4,5&tagValue=GBS&perPage=15&page=2",
739				"method": "GET",
740				"timeout": 0,
741				"headers": {
742					"Content-Type": "application/json"
743				}
744			};
745		
746			$.ajax(tpSettings).done(function (tpData) {
747				var reviews = tpData.reviews;
748		
749				// Predefined background colors
750				var avatarColors = ["#7FDC98", "#A8EEEA", "#F4F6AA"];
751		
752				$(reviews).each(function () {
753					var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "
753November", "December"];
754					var dateCreated = new Date(this.createdAt);
755					var tpDate = dateCreated.getDate() + ' ' + monthNames[dateCreated.getMonth()] + ' ' + dateCreated.getFullYear();
756		
757					var fullReviewText = this.text;
758					var shortReviewText = fullReviewText.length > 200 ? fullReviewText.substr(0, 200) + '...' : fullReviewText;
759		
760					// Get first name initials for profile icon
761					var initials = this.consumer.displayName.split(" ").map(word => word[0]).join("").toUpperCase();
762		
763					// Get a random color from the array
764					var randomColor = avatarColors[Math.floor(Math.random() * avatarColors.length)];
765	
766					var reviewCount = this.consumer.numberOfReviews || "1"; // Default to 1 if missing
767	
768					var userCountry = this.consumer.location ? this.consumer.location.countryCode : "AU"; // Default to AU
769	
770					var locationSVG = `
771					<svg width="12" height="16" viewBox="0 0 12 16" fill="none" xmlns="http://www.w3.org/2000/svg">
772						<path fill-rule="evenodd" clip-rule="evenodd" d="M6.00029 0H5.99971C4.41185 0.00190356 2.88783 0.668991 1.76243 1.85783C0.636727 3.04698 0.00181081 4.66138 0 6.34741V6.34775C0 8.60279 0.985365 10.9599 2.80505 13.1675C3.62319 14.1656 4.54384 15.0642 5.54992 15.8467L5.54988 15.8468L5.555 15.8506C5.68699 15.9483 5.84325 16 6.00261 16C6.16196 16 6.31822 15.9483 6.45022 15.8506L6.45026 15.8507L6.45552 15.8466C7.45975 15.0637 8.37861 14.1651 9.1951 13.1673C11.0119 10.9599 12 8.60293 12 6.34775V6.34741C11.9982 4.66138 11.3633 3.04698 10.2376 1.85783C9.11217 0.668991 7.58815 0.00190356 6.00029 0ZM2.86591 3.05046C3.69565 2.17394 4.82286 1.67988 6 1.67988C7.17714 1.67988 8.30435 2.17394 9.13409 3.05046C9.96354 3.92666 10.4278 5.11294 10.4278 6.34775C10.4278 8.2231 9.56543 9.96721 8.54306 11.3717C7.61686 12.6441 6.57938 13.6102 5.99999 14.1064C5.42058 13.6103 4.38311 12.6444 3.45693 11.3722C2.43458 9.96792 1.57219 8.2238 1.57219 6.34775C1.57219 5.11294 2.03646 3.92666 2.86591 3.05046Z" fill="#AEB3B6"/>
773						<circle cx="6" cy="6" r="2" fill="#AEB3B6"/>
774					</svg>`;
775		
776					var reviewHTML = `
777						<div class="tp-slide">
778							<div class="tp-review-card">
779								<div class="tp-header">
780									<div class="tp-avatar" style="background: ${randomColor};">${initials}</div>
781									<div class="tp-user-info">
782										<strong>${this.consumer.displayName}</strong>
783										<div class="tp-user-meta">
784											${reviewCount} Reviews ${locationSVG} ${userCountry}
785										</div>
786									</div>
787								</div>
788		
789								<div class="tp-divider"></div>
790		
791								<div class="tp-stars">
792									<img src="https://cdn.trustpilot.net/brand-assets/4.0.0/stars/stars-${this.stars}.svg">
793								</div>
794		
795								<div class="tp-review-content">
796									<div class="tp-review-title">${this.title}</div>
797									<div class="tp-review-text">${shortReviewText}</div>
798								</div>
799		
800								<div class="tp-date">
801									<strong class="tp-date-title">Date of experience:</strong> <span class="tp-date-text">${tpDate}</span>
802								</div>
803							</div>
804						</div>
805					`;
806		
807					$('.tp-seven .tp-slider').append(reviewHTML);
808				});
809		
810				// Initialize Slick Slider
811				$('.tp-seven .tp-slider').slick({
812					dots: true,
813					arrows: true,
814					infinite: true,
815					speed: 500,
816					slidesToShow: 3,
817					slidesToScroll: 1,
818					autoplay: true,
819					autoplaySpeed: 3000,
820					prevArrow: '<div class="slick-prev"><svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="47" y="47" width="46" height="46" rx="23" transform="rotate(180 47 47)" stroke="#858C91" stroke-width="2"/><path d="M18.1304 23.3809L26.8804 14.6309C26.9617 14.5496 27.0583 14.4852 27.1645 14.4412C27.2707 14.3972 27.3845 14.3745 27.4995 14.3745C27.6145 14.3745 27.7283 14.3972 27.8345 14.4412C27.9408 14.4852 28.0373 14.5496 28.1186 14.6309C28.1999 14.7122 28.2644 14.8087 28.3084 14.915C28.3524 15.0212 28.375 15.135 28.375 15.25C28.375 15.365 28.3524 15.4788 28.3084 15.585C28.2644 15.6913 28.1999 15.7878 28.1186 15.8691L19.9865 24L28.1186 32.1309C28.2828 32.2951 28.375 32.5178 28.375 32.75C28.375 32.9822 28.2828 33.2049 28.1186 33.3691C27.9544 33.5332 27.7317 33.6255 27.4995 33.6255C27.2673 33.6255 27.0446 33.5332 26.8805 33.3691L18.1304 24.6191C18.0491 24.5378 17.9846 24.4413 17.9405 24.3351C17.8965 24.2289 17.8738 24.115 17.8738 24C17.8738 23.885 17.8965 23.7712 17.9405 23.6649C17.9846 23.5587 18.0491 23.4622 18.1304 23.3809Z" fill="#858C91"/></svg></div>',
821					nextArrow: '<div class="slick-next"><svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="46" height="46" rx="23" stroke="#858C91" stroke-width="2"/><path d="M29.8695 24.6191L21.1195 33.3691C21.0383 33.4504 20.9417 33.5148 20.8355 33.5588C20.7293 33.6028 20.6155 33.6255 20.5005 33.6255C20.3855 33.6255 20.2717 33.6028 20.1655 33.5588C20.0592 33.5148 19.9627 33.4504 19.8814 33.3691C19.8001 33.2878 19.7356 33.1913 19.6916 33.085C19.6476 32.9788 19.625 32.865 19.625 32.75C19.625 32.635 19.6476 32.5212 19.6916 32.415C19.7356 32.3087 19.8001 32.2122 19.8814 32.1309L28.0135 24L19.8814 15.8691C19.7172 15.7049 19.625 15.4822 19.625 15.25C19.625 15.0178 19.7172 14.7951 19.8814 14.6309C20.0456 14.4668 20.2683 14.3745 20.5005 14.3745C20.7327 14.3745 20.9554 14.4668 21.1195 14.6309L29.8695 23.3809C29.9509 23.4622 30.0154 23.5587 30.0595 23.6649C30.1035 23.7711 30.1262 23.885 30.1262 24C30.1262 24.115 30.1035 24.2288 30.0595 24.3351C30.0154 24.4413 29.9509 24.5378 29.8695 24.6191Z" fill="#858C91"/></svg></div>',
822					responsive: [
823						{
824							breakpoint: 1025,
825							settings: {
826								slidesToShow: 2,
827								slidesToScroll: 1
828							}
829						},
830						{
831							breakpoint: 768,
832							settings: {
833								slidesToShow: 1,
834								slidesToScroll: 1
835							}
836						}
837					]
838				});
839			});
840		}
841	
842	
843
844		if( $('.trustpilot[data-layout="sidebar"]').length ){
845
846			var tpSettings = {
847			  "url": "https://api.trustpilot.com/v1/business-units/5e40ed7cf51bb10001748164/reviews?apikey=KhY2y4b9CHmoOH2nYbXbbgNRhLq3Fxl0&name=grace.com.au",
848			  "method": "GET",
849			  "timeout": 0,
850			  "headers": {
851			    "Content-Type": "application/json"
852			  }
853			};
854
855			$.ajax(tpSettings).done(function (tpData) {
856				var review = tpData.reviews;
857
858				$(review).each(function(){
859
860					var month = new Array();
861						month[0] = "January";
862						month[1] = "February";
863						month[2] = "March";
864						month[3] = "April";
865						month[4] = "May";
866						month[5] = "June";
867						month[6] = "July";
868						month[7] = "August";
869						month[8] = "September";
870						month[9] = "October";
871						month[10] = "November";
872						month[11] = "December";
873
874					var dateCreated = new Date(this.createdAt),
875						tpDate = dateCreated.getDate()+' '+month[dateCreated.getMonth()],
876						tpReview = ( this.text.length > 100 ) ? this.text.substr(0,100)+'...' : this.text;
877					if( this.stars > 3 ){
878						$('.tp-sidebar .tp-slider').append('<div class="tp-slide"><div class="tp-slide-header"><img width="115" src="https://cdn.trustpilot.net/brand-assets/4.0.0/stars/stars-'+this.stars+'.svg"><div class="tp-review-date">'+tpDate+'</div></div><div class="tp-slide-content"><div class="tp-review-title">'+this.title+'</div><div class="tp-review-text">'+tpReview+'</div></div><div class="tp-slide-footer"><div class="tp-consumer">'+this.consumer.displayName+'</div></div>');
879					}
880				});
881
882
883				$('.tp-sidebar .tp-slider').slick({
884				  dots: false,
885				  infinite: true,
886				  speed: 300,
887				  slidesToShow: 1,
888				  slidesToScroll: 1,
889				  responsive: [
890				    {
891				      breakpoint: 1025,
892				      settings: {
893				        slidesToShow: 1,
894				        slidesToScroll: 1
895				      }
896				    },
897				    {
898				      breakpoint: 800,
899				      settings: {
900				        slidesToShow: 1,
901				        slidesToScroll: 1
902				      }
903				    }
904				    // You can unslick at a given breakpoint now by adding:
905				    // settings: "unslick"
906				    // instead of a settings object
907				  ]
908				});	
909
910				var settings = {
911				  "url": "https://api.trustpilot.com/v1/business-units/find?apikey=KhY2y4b9CHmoOH2nYbXbbgNRhLq3Fxl0&name=grace.com.au",
912				  "method": "GET",
913				  "timeout": 0,
914				  "headers": {
915				    "Content-Type": "application/json"
916				  }
917				};
918
919				jQuery.ajax(settings).done(function (trustpilotData) {
920				             
921				  	var tpReviews = trustpilotData.numberOfReviews.total,
922				  		tpReviewsRating = trustpilotData.score.trustScore,
923				  		tpStars = trustpilotData.score.stars;
924
925					console.log(tpReviews, tpReviewsRating);	  
926					// Pass data to schema
927					// trustpilotSchema(tpReviews, tpReviewsRating);
928				});
929			});
930		}
931
932		$(window).on('load', function() {
933			// check if using trust pilot iframe to send to Pass data to schema
934			if($('.trustpilot-widget').length > 0){
935				var settings = {
936					"url": "https://api.trustpilot.com/v1/business-units/find?apikey=KhY2y4b9CHmoOH2nYbXbbgNRhLq3Fxl0&name=grace.com.au",
937					"method": "GET",
938					"timeout": 0,
939					"headers": {
940					  "Content-Type": "application/json"
941					}
942				  };
943	  
944				  jQuery.ajax(settings).done(function (trustpilotData) {
945				             
946					var tpReviews = trustpilotData.numberOfReviews.total,
947						tpReviewsRating = trustpilotData.score.trustScore,
948						tpStars = trustpilotData.score.stars;
949
950				  // Pass data to schema
951				//   trustpilotSchema(tpReviews, tpReviewsRating);
952			  });
953			}
954		});
955		
956
957		// Schema
958		function trustpilotSchema(tpReviews, tpReviewsRating){
959		    var el = document.createElement("script");
960		    el.type = "application/ld+json";
961		    el.text = JSON.stringify({
962		      "@context": "http://schema.org/",
963		      "@type": "Product",
964		      "name": document.title,
965		      "aggregateRating": {
966		        "@type": "AggregateRating", 
967		        "worstRating": "1",
968		        "bestRating": "5",
969		        "ratingCount": tpReviews,
970				"ratingValue": tpReviewsRating
971		      }
972		    });
973
974		    document.querySelector("head").appendChild(el);
975		}
976	//});
977
978
979	// Branch locator autocomplete type interval
980	var typeTimer, typeInterval = 800;
981
982	// Trigger branch locator autocomplete
983	/*$(document).on('keyup', '#branch-location', function () {
984
985		var blKeywords = $(this).val();
986
987		if( blKeywords.length > 2 ){
988
989			clearTimeout(typeTimer);
990			typeTimer = setTimeout(locatorAutocomplete(blKeywords), typeInterval);
991		} else{
992			$('#bl-autocomplete').empty();
993		}
994	});
995
996	// Branch locator autocomplete function
997	function locatorAutocomplete(keywords){
998		$.post( sd.ajaxURL,
999		{
1000		    action : 'branch_locator_autocomplete',
1001		    branchKeywords : keywords
1002		},
1003		function(data){
1004		    if(data != 'empty'){
1005		        $('#bl-autocomplete').html(data);
1006		    } else{
1007		    	$('#bl-autocomplete').empty();
1008		    }
1009		}).done(function() {
1010			var state = $('.ac-address').attr('data-state');
1011
1012			$("#branch-state").val(state.replace(/\s/g, ''));
1013		}).fail(function(jqXHR, textStatus, errorThrown) {
1014		    console.log(jqXHR);
1015            console.log(textStatus);
1016            console.log(errorThrown );
1017		}).always(function() {
1018		});
1019	}*/
1020
1021	// Clear  branch locator autocomplete if it is not in focus
1022	$(document).on('mouseup mousedown', 'body',function(e){  
1023	    if (!$('#branch-locator').is(e.target) && $('#bl-autocomplete').has(e.target).length === 0 ){ 
1024	        $('#bl-autocomplete').empty();
1025	    }
1026	});
1027	
1028
1029	// Geocode typed address
1030	$(document).on('change keyup input mouseup', '#branch-location', function () {
1031
1032		var blKeywords = $(this).val();
1033
1034		// Clear state field
1035		//$("#branch-state").val('');
1036
1037		// Clear error messages
1038		$('.bl-error-msg').empty();
1039
1040		// Clear error field
1041		$('#branch-location').removeClass('field-error');
1042
1043		if( blKeywords.length > 2 ){
1044
1045			clearTimeout(typeTimer);
1046			typeTimer = setTimeout(locatorGeocode(blKeywords, 0), typeInterval);
1047		} 
1048	});
1049
1050	function locatorGeocode(keywords, rerun=0){
1051		var geocoder;
1052
1053		var state;
1054
1055		geocoder = new google.maps.Geocoder();
1056
1057		geocoder.geocode({
1058			'address' : keywords, componentRestrictions: {
1059		        country: "AU"
1060		     },
1061		}, function(results, status) {
1062			
1063		    if (status == google.maps.GeocoderStatus.OK) {
1064
1065		        // var coordinates = results[0].geometry.location,
1066		        $(results[0].address_components).each(function(key, value){
1067					if ( $.inArray('administrative_area_level_1', value.types) !== -1 && $.inArray('political', value.types) !== -1 ){
1068					    state = value.short_name;
1069
1070					    $("#branch-state").val(state);
1071
1072					    if( rerun != 1 ){
1073						    $('#bl-autocomplete').html('<div class="ac-content"><div class="ac-list"><div class="ac-item"><svg width="10" version="1.1" id="marker" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"viewBox="0 0 17.1 22.8" style="enable-background:new 0 0 17.1 22.8;" xml:space="preserve"> <path fill="#DB2E27" d="M1.8,13.4l6,8.6c0.3,0.4,0.9,0.5,1.3,0.2c0.1-0.1,0.2-0.1,0.2-0.2l6-8.6c0.1-0.1,0.1-0.2,0.2-0.2l0-0.1 C18,9.3,16.9,4.2,13,1.7C9.2-0.7,4.1,0.4,1.6,4.2c-1.8,2.7-1.8,6.2,0,9l0,0l0,0.1C1.7,13.3,1.8,13.3,1.8,13.4z M8.6,5.2 c1.9,0,3.4,1.5,3.4,3.4c0,1.9-1.5,3.4-3.4,3.4c-1.9,0-3.4-1.5-3.4-3.4C5.1,6.8,6.7,5.2,8.6,5.2z"/> </svg><span class="ac-address" data-state="'+state+'">'+results[0].formatted_address+'</span></div></div></div>');
1074						}
1075
1076					    $('#search-branch').attr('data-searchable', 1);
1077					}
1078				});
1079		
1080			} else{
1081		    	$('#search-branch').attr('data-searchable', 0);
1082		    }
1083		});
1084	}
1085
1086	// Branch locator search button actions
1087	$(document).on('click', '#search-branch', function () {
1088
1089		var blState = $('#branch-state').val(),
1090			blKeywords = $('#branch-location').val(),
1091			blService = $('select[name="service-type"]').find(":selected").val();
1092
1093		// Re-check if the address entered is valid
1094		locatorGeocode(blKeywords, 1);
1095
1096		setTimeout(function(){
1097			if( $('#search-branch').attr('data-searchable') == 0 ){
1098				// Add error message when address is not valid
1099				$('.bl-error-msg').html('Please enter a valid address.');
1100
1101				// Add error class to search field
1102				$('#branch-location').addClass('field-error');
1103
1104			}  else {
1105
1106				// Clear search results
1107				$('#bl-results').empty();
1108
1109				// Clear autocomplete
1110				$('#bl-autocomplete').empty();
1111
1112				// Show loading screen
1113				$('.bl-loading').fadeIn(100);
1114
1115				if( blState.length > 0 || blService.length > 0){
1116					$.post( sd.ajaxURL,
1117					{
1118					    action : 'branch_locator_search',
1119					    branchKeywords : blKeywords,
1120					    branchState : blState,
1121					    branchService : blService
1122					},
1123					function(data){
1124					    if(data){
1125					        $('#bl-results').html(data);
1126					    } 
1127					}).done(function() {
1128						$('#branch-location').removeClass('field-error');
1129
1130						$('.bl-error-msg').empty();
1131
1132						// Hide loading screen
1133						$('.bl-loading').fadeOut(100);
1134					}).fail(function(jqXHR, textStatus, errorThrown) {
1135				    console.log(jqXHR);
1136		            console.log(textStatus);
1137		            console.log(errorThrown );
1138					}).always(function() {
1139					});
1140				}
1141			}
1142		}, 300);
1143	});
1144
1145	// Clear branch locator search field
1146	$(document).on('click', '#branch-location', function () {
1147		$('#branch-location').removeClass('field-error');
1148
1149		// Clear error messages
1150		$('.bl-error-msg').empty();
1151	});
1152
1153	// Branch locator map button actions
1154	$(document).on('click', '#map-button', function () {
1155		var states = ['NSW', 'QLD', 'NT', 'WA', 'SA', 'VIC', 'ACT', 'TAS'];
1156
1157		var blState = $('#branch-state').val(),
1158			blKeywords = $('#branch-location').val(),
1159			blService = $('select[name="service-type"]').find(":selected").val(),
1160			blServiceName = $('select[name="service-type"]').find(":selected").text();
1161
1162		// Re-check if the address entered is valid
1163		locatorGeocode(blKeywords, 1);
1164
1165		setTimeout(function(){
1166			if( $('#search-branch').attr('data-searchable') == 0 ){
1167				// Add error message when address is not valid
1168				$('.bl-error-msg').html('Please enter a valid address.');
1169
1170				// Add error class to search field
1171				$('#branch-location').addClass('field-error');
1172			} else {
1173				// Clear search results
1174				$('#bl-results').empty();
1175				
1176				// Show loading screen
1177				$('.bl-loading').fadeIn(300);
1178
1179				if( blState.length > 0 || blService.length > 0){
1180					$.post( sd.ajaxURL,
1181					{
1182					    action : 'branch_locator_map',
1183					    branchKeywords : blKeywords,
1184					    branchState : blState,
1185					    branchService : blService,
1186					    branchServiceName : blServiceName
1187					},
1188					function(data){
1189					    if(data){
1190					        $('#bl-results').html(data);
1191					    } 
1192					}).done(function() {
1193						$('#branch-location').removeClass('field-error');
1194
1195						$('.bl-error-msg').empty();
1196
1197						// Hide loading screen
1198						$('.bl-loading').fadeOut(300);
1199					}).fail(function(jqXHR, textStatus, errorThrown) {
1200				    console.log(jqXHR);
1201		            console.log(textStatus);
1202		            console.log(errorThrown );
1203					}).always(function() {
1204					});
1205				} else{ // actions if field is empty
1206					// Add error class to search field
1207					$('#branch-location').addClass('field-error');
1208
1209					// Clear search results
1210					$('#bl-results').empty();
1211
1212					// Hide loading screen
1213					$('.bl-loading').fadeOut(300);
1214				}
1215			}
1216		}, 300);
1217	});
1218
1219	$(document).on('change', '.bl-service', function () {
1220        if( $('.map-container').length > 0 ){
1221        	$('#map-button').trigger('click');
1222        } else{
1223        	$('#search-branch').trigger('click');
1224        }
1225    });
1226
1227    if( sd.pageID == '30' ){
1228    	var service = window.location.hash;
1229
1230    	if( service == '#information-management' ){
1231    		$('.bl-service option[value="records"]').prop('selected',true);
1232    		$('#search-branch').trigger('click');
1233    	}
1234
1235    	if( service == '#removals' ){
1236    		$('.bl-service option[value="removals"]').prop('selected',true);
1237    		$('#search-branch').trigger('click');
1238    	}
1239    }
1240
1241	$(document).on('click', '.ac-item', function () {
1242		var state = $(this).find('.ac-address').attr('data-state');
1243
1244		$('#branch-location').val($(this).find('.ac-address').text());
1245
1246		$("#branch-state").val(state);
1247
1248		$('#bl-autocomplete').empty();
1249	});
1250
1251	$(document).on('click', '#back-to-top', function () {
1252	  $("html, body").animate({ scrollTop: 0 }, "slow");
1253	  return false;
1254	});
1255
1256	/*
1257	// Google places autocomplete
1258    var addressField = document.getElementById('branch-location'),
1259    	selectedPlace;
1260
1261    if (addressField){
1262
1263        $(addressField).keydown(function(){
1264          selectedPlace = false;
1265          $("#branch-state").val('');
1266        });
1267
1268        function initialize() {
1269          
1270          var options = {
1271            types: ['address'],
1272            componentRestrictions: {
1273              country: 'au'
1274            }
1275          };
1276
1277          autocomplete = new google.maps.places.Autocomplete(addressField, options);
1278          google.maps.event.addListener(autocomplete, 'place_changed', function() {
1279            var place = autocomplete.getPlace(),
1280                state = '', suburb = '',
1281                placesearch = $(addressField).val();
1282
1283            for (var i = 0; i < place.address_components.length; i++) {
1284              for (var j = 0; j < place.address_components[i].types.length; j++) {
1285
1286                // Get state
1287                if (place.address_components[i].types[j] == "locality") {
1288                    var suburb = place.address_components[i].long_name;
1289                }
1290
1291                // Get suburb
1292                if (place.address_components[i].types[j] == "administrative_area_level_1") {
1293                    var state = place.address_components[i].short_name;
1294
1295                    $("#branch-state").val(state);
1296                }
1297
1298                // Get postal code
1299                if (place.address_components[i].types[j] == "postal_code") {
1300
1301                  	/*var allowedPostcodes = sd_object.allowedPostal, // Get post codes from Wordpress dashboard
1302                  		selectedPostcode = place.address_components[i].long_name,
1303                  		multiplePostal = false;
1304
1305                  		// Display selected postcode on console
1306                  		console.log(selectedPostcode);
1307
1308                  	if (allowedPostcodes.indexOf(', ') > -1) { 
1309
1310                  		var getPostcodes = allowedPostcodes.split(', ');
1311
1312                  		$.each(getPostcodes, function( index, value ) {
1313
1314                  		  	var limitPostcodes = value.split('-');
1315                  		
1316                  		  	if (selectedPostcode >= limitPostcodes[0] && selectedPostcode <= limitPostcodes[1]) {
1317                  		  		multiplePostal = true;
1318                  		  		return false;
1319                  		  	} else{
1320                  		  		multiplePostal = false;
1321                  		  	}
1322
1323			                
1324                  		});
1325
1326                  		if ( multiplePostal == true ) {
1327                  		  $('.address-verification').html('');
1328                  		  $(addressField).removeClass('form-error');
1329                  		  $(addressField).attr('data-status', 'valid');
1330                  		  selectedPlace = true;
1331                  		  //Set delivery details for checkout
1332                  		  Cookies.set("delivery_postcode", selectedPostcode);
1333                  		  Cookies.set("delivery_state", state);
1334                  		  Cookies.set("delivery_suburb", suburb);
1335                  		} else{
1336                  		  
1337                  		  $('.address-verification').html('We cannot service in the area you have selected.');
1338                  		  $(addressField).addClass('form-error');
1339                  		  $(addressField).attr('data-status', 'invalid');
1340                  		  selectedPlace = false;
1341                  		}
1342
1343                  	} else{
1344                  		var limitPostcodes = allowedPostcodes.split('-');
1345
1346		                if (selectedPostcode >= limitPostcodes[0] && selectedPostcode <= limitPostcodes[1]) {
1347		                  $('.address-verification').html('');
1348		                  $(addressField).removeClass('form-error');
1349		                  $(addressField).attr('data-status', 'valid');
1350		                  selectedPlace = true;
1351		                  //Set delivery details for checkout
1352		                  Cookies.set("delivery_postcode", selectedPostcode);
1353		                  Cookies.set("delivery_state", state);
1354		                  Cookies.set("delivery_suburb", suburb);
1355		                } else{
1356		                  
1357		                  $('.address-verification').html('We cannot service in the area you have selected.');
1358		                  $(addressField).addClass('form-error');
1359		                  $(addressField).attr('data-status', 'invalid');
1360		                  selectedPlace = false;
1361		                }
1362	              	}
1363
1364                }
1365              }
1366            }
1367          })
1368        }
1369        google.maps.event.addDomListener(window, "load", initialize);
1370    } */
1371
1372    if( sd.pageID == '13733' ){
1373    	pageAutocomplete('input_1_4');
1374    }
1375
1376    if( sd.pageID == '14493' ){
1377    	pageAutocomplete('input_20_4');
1378    }
1379
1380    if( sd.pageID == '14494' ){
1381    	pageAutocomplete('input_21_4');
1382    }
1383	
1384	setTimeout(function () {
1385
1386	if( sd.pageID == '24' ){
1387    	pageAutocomplete('Address');
1388    }
1389	}, 2000 );
1390
1391	if( sd.pageID == '17540' ){
1392		pardotAutocomplete('pardot-address');
1393		pageAutocomplete('00N9q000000OQx6');
1394		pageAutocomplete('00N9q000000OQxB');
1395	}
1396
1397
1398	// Google places autocomplete
1399	function pageAutocomplete(fieldID){
1400    var addressField = document.getElementById(fieldID),
1401    	selectedPlace = false;
1402    	if (addressField){
1403			$(addressField).keydown(function(){
1404				$(this).attr('data-valid', 0);
1405			});
1406			
1407			var options = {
1408				types: ['geocode']
1409			};
1410          
1411			var autocomplete = new google.maps.places.Autocomplete(addressField, options);
1412			google.maps.event.addListener(autocomplete, 'place_changed', function() {
1413				var place = autocomplete.getPlace(),
1414					state ='', suburb = '', postcode = '', country='';
1415					console.log(place);
1416				for (var i = 0; i < place.address_components.length; i++) {
1417							for (var j = 0; j < place.address_components[i].types.length; j++) {
1418								// Get state
1419								if (place.address_components[i].types[j] == "administrative_area_level_1") {
1420									var state = place.address_components[i].long_name;
1421									var state_short = place.address_components[i].short_name;
1422								}
1423						// Get suburb
1424						if (place.address_components[i].types[j] == "locality") {
1425							var suburb = place.address_components[i].long_name;
1426						}
1427						if (place.address_components[i].types[j] == "postal_code") {
1428							var postcode = place.address_components[i].long_name;
1429						}
1430
1431						if (place.address_components[i].types[j] == "country") {
1432							var country = place.address_components[i].long_name;
1433						}
1434					}
1435				}
1436
1437				console.log(suburb + ' ' + state_short + ' ' + postcode + ', '+ country);
1438
1439				if( sd.pageID == '24' ){
1440					console.log(place.formatted_address);
1441					$('#Address').val(place.formatted_address);
1442				}
1443          	});
1444        }
1445    }
1446
1447    function pardotAutocomplete(fieldID){
1448    var addressField = document.getElementById(fieldID),
1449    	selectedPlace = false;
1450    	if (addressField){
1451			$(addressField).keydown(function(){
1452				$(this).attr('data-valid', 0);
1453			});
1454			
1455			var options = {
1456				types: ['geocode']
1457			};
1458          
1459			var autocomplete = new google.maps.places.Autocomplete(addressField, options);
1460			google.maps.event.addListener(autocomplete, 'place_changed', function() {
1461				var place = autocomplete.getPlace(),
1462					state ='', city = '', postcode = '', country='';
1463					console.log(place);
1464				for (var i = 0; i < place.address_components.length; i++) {
1465					for (var j = 0; j < place.address_components[i].types.length; j++) {
1466						// Get state
1467						if (place.address_components[i].types[j] == "administrative_area_level_1") {
1468							var state = place.address_components[i].long_name;
1469							var state_short = place.address_components[i].short_name;
1470
1471							$('#state').val(state);
1472						}
1473						// Get city
1474						if (place.address_components[i].types[j] == "locality") {
1475							var city = place.address_components[i].long_name;
1476							$('#city').val(city);
1477						}
1478						if (place.address_components[i].types[j] == "postal_code") {
1479							var postcode = place.address_components[i].long_name;
1480							$('#zip').val(postcode);
1481						}
1482
1483						if (place.address_components[i].types[j] == "country") {
1484							var country = place.address_components[i].long_name;
1485
1486							$('#country').val(country);
1487						}
1488					}
1489				}
1490
1491				console.log(city + ' ' + state_short + ' ' + postcode + ', '+ country);
1492
1493				if( sd.pageID == '24' ){
1494					console.log(place.formatted_address);
1495					$('#Address').val(place.formatted_address);
1496				}
1497          	});
1498        }
1499    }
1500
1501    /*$(document).on("gform_confirmation_loaded", function (e, form_id) {
1502      // code to run upon successful form submission
1503      // Google Analytics
1504      dataLayer.push({
1505      	"event" : "marketo.success",
1506      	"formId" : form_id,
1507      	"marketo.form_values": vals,
1508      	"marketo.thank_you_url": thankYouURL
1509      });	
1510    });*/
1511
1512    // Add space for Elementor Menu Anchor link
1513	$(window).on('elementor/frontend/init', function () {
1514        elementorFrontend.hooks.addFilter(
1515            'frontend/handlers/menu_anchor/scroll_offset',
1516            function (offset) {
1517                return offset + 100; // Adjust based on header height
1518            }
1519        );
1520    });
1521	
1522});
1523
1524document.addEventListener('DOMContentLoaded', function () {
1525	// Create popup overlay
1526	const popupOverlay = document.createElement('div');
1527	popupOverlay.id = 'home-quotePopup';
1528
1529	// Create popup content
1530	const popupContent = document.createElement('div');
1531	popupContent.classList.add('popup-content');
1532
1533	// Create close button
1534	const closeButton = document.createElement('span');
1535	closeButton.classList.add('close-button');
1536	closeButton.innerHTML = '&times;';
1537
1538	// Create iframe
1539	const iframe = document.createElement('iframe');
1540	iframe.src = 'https://calendar.cirrusinsight.com/smart-schedule/grace-scheduling/removal-call-back';
1541	iframe.width = '1000';
1542	iframe.height = '700';
1543	iframe.frameBorder = '0';
1544	iframe.allowFullscreen = true;
1545
1546	// Assemble popup
1547	popupContent.appendChild(closeButton);
1548	popupContent.appendChild(iframe);
1549	popupOverlay.appendChild(popupContent);
1550	document.body.appendChild(popupOverlay);
1551
1552	// Grace quote content
1553	const quoteContent = document.querySelector('.grace-quote-content');
1554
1555	// Function to attach click event
1556	function attachTrigger() {
1557		let trigger;
1558
1559		if (window.innerWidth <= 1023) {
1560			// Mobile: Search inside home-quick-free-quote
1561			const homeQuickFreeQuote = document.querySelector('.home-quick-free-quote');
1562			if (homeQuickFreeQuote) {
1563				trigger = homeQuickFreeQuote.querySelector('.quote-form-button[data-action="callback"]');
1564			}
1565		} else {
1566			// Desktop: Search globally
1567			trigger = document.querySelector('.quote-form-button[data-action="callback"]');
1568		}
1569
1570		if (trigger) {
1571			trigger.addEventListener('click', function (e) {
1572				e.preventDefault();
1573				popupOverlay.classList.add('show');
1574				if (quoteContent) quoteContent.style.display = 'none';
1575			});
1576		}
1577	}
1578
1579	// Attach initially
1580	attachTrigger();
1581
1582	// Also reattach on window resize (because screen might resize after load)
1583	window.addEventListener('resize', function () {
1584		attachTrigger();
1585	});
1586
1587	// Close popup
1588	function closePopup() {
1589		popupOverlay.classList.remove('show');
1590		setTimeout(() => {
1591			if (quoteContent) quoteContent.style.display = '';
1592		}, 400); // matches CSS transition duration
1593	}
1594
1595	closeButton.addEventListener('click', closePopup);
1596
1597	window.addEventListener('click', function (e) {
1598		if (e.target === popupOverlay) {
1599			closePopup();
1600		}
1601	});
1602});
1603
1604function initWidget(root){
1605	if(!root || root.dataset.dgReady) return;
1606	root.dataset.dgReady = '1';
1607	var search   = root.querySelector('.dg-search-input');
1608	var buttons  = root.querySelectorAll('.dg-filter-btn');
1609	var sections = root.querySelectorAll('.dg-section');
1610	var empty    = root.querySelector('.dg-no-results');
1611	var active   = 'all';
1612	function apply(){
1613		var q = (search ? search.value : '').trim().toLowerCase();
1614		var anyVisible = false;
1615		sections.forEach(function(sec){
1616			var sid = sec.getAttribute('data-state-id');
1617			var stateMatch = (active === 'all' || active === sid);
1618			var visible = 0;
1619			sec.querySelectorAll('.dg-card').forEach(function(card){
1620				var hay = card.getAttribute('data-search') || '';
1621				var match = stateMatch && (q === '' || hay.indexOf(q) !== -1);
1622				card.style.display = match ? '' : 'none';
1623				if(match){ visible++; }
1624			});
1625			sec.style.display = visible > 0 ? '' : 'none';
1626			if(visible > 0){ anyVisible = true; }
1627		});
1628		if(empty){ empty.style.display = anyVisible ? 'none' : ''; }
1629	}
1630	if(search){ search.addEventListener('input', apply); }
1631	buttons.forEach(function(btn){
1632		btn.addEventListener('click', function(){
1633			buttons.forEach(function(b){ b.classList.remove('is-active'); b.setAttribute('aria-pressed','false'); });
1634			btn.classList.add('is-active');
1635			btn.setAttribute('aria-pressed','true');
1636			active = btn.getAttribute('data-state-id') || 'all';
1637			apply();
1638		});
1639	});
1640	apply();
1641}
1642function initAll(){
1643	var nodes = document.querySelectorAll('.dg-guides');
1644	for(var i=0;i<nodes.length;i++){ initWidget(nodes[i]); }
1645}
1646if(document.readyState !== 'loading'){ initAll(); }
1647else { document.addEventListener('DOMContentLoaded', initAll); }
1648// Elementor editor preview support
1649
1650	jQuery(window).on('elementor/frontend/init', function(){
1651		if(window.elementorFrontend && elementorFrontend.hooks){
1652			elementorFrontend.hooks.addAction('frontend/element_ready/dg_guides.default', function($scope){
1653				initWidget($scope[0]);
1654			});
1655		}
1656	});

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.