1var module_210543151938=void $(document).ready(function(){$("[data-rd-testimonials]").each(function(){const $root=$(this);function removeTestimonialsModule(){const section=$root.closest("section.m-rd-testimonials");section&§ion.length?section.remove():$root.remove()}const mode=($root.attr("data-rd-testimonials-mode")||"cms").toLowerCase(),loop="true"===String($root.attr("data-rd-testimonials-loop")||"").trim().toLowerCase(),$viewport=$root.find("[data-rd-testimonials-viewport]"),$prev=$root.find("[data-rd-testimonials-prev]"),$next=$root.find("[data-rd-testimonials-next]"),reviewMaxHeight=Math.max(0,parseInt($root.attr("data-rd-testimonials-review-max-height")||"0",10)||0),desktopMq=window.matchMedia("(min-width: 64rem)");function initialsFromName(name){const s=String(name||"").trim();if(!s)return"?";const parts=s.split(/\s+/).filter(Boolean);return parts.length>=2?(parts[0][0]+parts[parts.length-1][0]).toUpperCase():s.slice(0,2).toUpperCase()}function buildArticleFromReview(review){const rawRating=Number(review&&review.rating),rating=Number.isFinite(rawRating)&&rawRating>0?Math.min(5,Math.max(1,Math.round(rawRating))):5,content=review&&review.content?String(review.content):"",author=review&&review.author_name?String(review.author_name):"",$article=$('<article class="m-rd-testimonials__card"></article>'),$stars=$('<div class="m-rd-testimonials__stars"></div>').attr("aria-label","Rating "+rating+" out of 5");for(let i=1;i<=5;i++)$('<span class="m-rd-testimonials__star" aria-hidden="true">â </span>').toggleClass("is-on",i<=rating).appendTo($stars);$article.append($stars);const $quote=$('<div class="m-rd-testimonials__quote rd-module-surface__body"></div>');$quote.css("white-space","pre-line"),reviewMaxHeight>0&&($quote.addClass("m-rd-testimonials__quote--scroll"),$quote.css("max-height",reviewMaxHeight+"px")),$quote.text(content),$article.append($quote);const $attr=$('<div class="m-rd-testimonials__attribution"></div>'),$avatar=$('<span class="m-rd-testimonials__avatar" data-rd-testimonials-initial aria-hidden="true"></span>').text(initialsFromName(author)),$name=$('<span class="m-rd-testimonials__name"></span>').text(author);return $attr.append($avatar,$name),$article.append($attr),$article[0]}let pageIndex=0,pageWrappers=[];function renderViewport(){return $viewport.empty(),pageWrappers.length?(pageWrappers.forEach(function($page,i){i===pageIndex?$page.removeAttr("hidden"):$page.attr("hidden","hidden"),$viewport.append($page)}),pageWrappers.length<=1?($prev.prop("disabled",!0),void $next.prop("disabled",!0)):loop?($prev.prop("disabled",!1),void $next.prop("disabled",!1)):($prev.prop("disabled",pageIndex<=0),void $next.prop("disabled",pageIndex>=pageWrappers.length-1))):($prev.prop("disabled",!0),void $next.prop("disabled",!0))}function buildPagesFromStoredArticles(articleNodes){const groups=function(arr,size){const out=[];for(let i=0;i<arr.length;i+=size)out.push(arr.slice(i,i+size));return out}(articleNodes,desktopMq.matches?3:1);pageWrappers=groups.map(function(group){const $ul=$('<ul class="m-rd-testimonials__grid"></ul>');return group.forEach(function(node){const $clone=$(node.cloneNode(!0));!function($article){const $av=$article.find("[data-rd-testimonials-initial]");if(!$av.length)return;const name=$article.find(".m-rd-testimonials__name").text()||"";"?"!==$av.text()&&$av.text().trim()||$av.text(initialsFromName(name))}($clone);const $li=$('<li class="m-rd-testimonials__cell"></li>');$li.append($clone),$ul.append($li)}),$('<div class="m-rd-testimonials__page"></div>').append($ul)}),pageIndex>=pageWrappers.length&&(pageIndex=Math.max(0,pageWrappers.length-1)),renderViewport()}function go(delta){const len=pageWrappers.length;if(len<=1)return;if(loop)return pageIndex=((pageIndex+delta)%len+len)%len,void renderViewport();const next=pageIndex+delta;next<0||next>=len||(pageIndex=next,renderViewport())}$prev.on("click",function(){go(-1)}),$next.on("click",function(){go(1)}),desktopMq.addEventListener&&desktopMq.addEventListener("change",function(){const stored=$root.data("rdTestimonialsArticles");stored&&stored.length&&buildPagesFromStoredArticles(stored)}),"api"===mode?function(){const url=$root.attr("data-rd-testimonials-api-url");if(!url)return;$root.find("[data-rd-testimonials-loading]").remove();const apiState={nextPage:1,totalPages:null,loading:!1,loadedIds:{}};function fetchApiPage(pageNumber){const pageUrl=function(baseUrl,pageNumber){if(!baseUrl)return"";try{const parsed=new URL(baseUrl,window.location.origin);return parsed.searchParams.set("page",String(pageNumber)),parsed.searchParams.set("current_page",String(pageNumber)),parsed.toString()}catch(e){const split=String(baseUrl).split("#"),hash=split.length>1?"#"+split.slice(1).join("#"):"",beforeHash=split[0],hasQuery=beforeHash.indexOf("?")>=0;return beforeHash+(hasQuery?"&":"?")+"page="+encodeURIComponent(pageNumber)+"¤t_page="+encodeURIComponent(pageNumber)+hash}}(url,pageNumber);return pageUrl?fetch(pageUrl,{credentials:"omit",mode:"cors"}).then(function(r){if(!r.ok)throw new Error("Bad response");return r.json()}).then(function(data){const pagination=data&&data.meta&&data.meta.pagination?data.meta.pagination:{},nextPage=parseInt(pagination.next_page,10),totalPages=parseInt(pagination.total_pages,10);return apiState.totalPages=Number.isFinite(totalPages)?totalPages:apiState.totalPages,Number.isFinite(nextPage)&&nextPage>pageNumber?apiState.nextPage=nextPage:apiState.nextPage=pageNumber+1,Number.isFinite(apiState.totalPages)&&apiState.nextPage>apiState.totalPages&&(apiState.nextPage=null),data&&data.reviews||[]}):Promise.reject(new Error("Bad API URL"))}function fetchNextApiPage(){return apiState.loading||!apiState.nextPage?Promise.resolve(0):(apiState.loading=!0,fetchApiPage(apiState.nextPage).then(function(reviews){return function(reviews){const originals=$root.data("rdTestimonialsArticles")||[],newArticles=reviews.filter(function(review){const id=review&&null!=review.id?String(review.id):"";return!id||!apiState.loadedIds[id]&&(apiState.loadedIds[id]=!0,!0)}).map(buildArticleFromReview),merged=originals.concat(newArticles);return $root.data("rdTestimonialsArticles",merged),buildPagesFromStoredArticles(merged),newArticles.length}(reviews)}).finally(function(){apiState.loading=!1}))}fetchNextApiPage().then(function(addedCount){if(!($root.data("rdTestimonialsArticles")||[]).length||!addedCount)return void removeTestimonialsModule();const oldGo=go;go=function(delta){const lenBefore=pageWrappers.length;delta>0&&pageIndex>=lenBefore-1&&apiState.nextPage?fetchNextApiPage().then(function(newCount){if(newCount>0){const lenAfter=pageWrappers.length;if(lenAfter>lenBefore)return pageIndex=Math.min(pageIndex+1,lenAfter-1),void renderViewport()}oldGo(delta)}).catch(function(){oldGo(delta)}):oldGo(delta)}}).catch(function(){removeTestimonialsModule()})}():function(){const $source=$root.find("[data-rd-testimonials-cms-source]"),originals=$source.find("[data-rd-testimonials-cms-item] > article").map(function(){return $(this).clone(!0)[0]}).get();if($source.remove(),!originals.length)return $viewport.html('<p class="m-rd-testimonials__empty"></p>'),$prev.prop("disabled",!0),void $next.prop("disabled",!0);$root.data("rdTestimonialsArticles",originals),pageIndex=0,buildPagesFromStoredArticles(originals)}()})}); 2//# sourceURL=https://4478314.fs1.hubspotusercontent-na1.net/hubfs/4478314/hub_generated/module_assets/1/210543151938/1783374714974/module_rd-testimonials.js
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.