1/* @license GPL-2.0-or-later https://www.drupal.org/licensing/faq */ 2const searchSetup=function(settings){const id_prefix=settings.prefex;const index_name=settings.index_name;const app_id=settings.app_id;const api_key=settings.api_key;const params=new Proxy(new URLSearchParams(window.location.search),{get:(searchParams,prop)=>searchParams.get(prop)});var setupSettings={indexName:index_name,searchClient:algoliasearch(app_id,api_key),searchFunction:function(h){h.search();}};if(params.type&&settings.search_filters)setupSettings.initialUiState={[index_name]:{refinementList:{type:params.type.split('&')}}};const search=instantsearch(setupSettings);const industryLogo=function(industries){return industries[0];};const industryDisplay=function(industries){if(Array.isArray(industries))return industries.slice(0,4).join(', ');if(settings.search_filters){element=jQuery('.ais-HierarchicalMenu-link.ais-HierarchicalMenu-link--selected span.ais-HierarchicalMenu-label');if(element.length)return element.first().text();}if(settings.facetFilter.length){if(settings.facetFilter[0][0].startsWith('industry.lvl0'))return settings.facetFilter[0][0].replace('industry.lvl0:','');if(settings.facetFilter[0][0].startsWith('industry.lvl1'))return settings.facetFilter[0][0].replace('industry.lvl1:','');}return industries.lvl0.slice(0,4).join(', ');};const primaryIndustryDisplay=function(industries){if(Array.isArray(industries))return industries[0];return industries.lvl0[0];};const {dynamicWidgets,refinementList,panel,hierarchicalMenu,currentRefinements,clearRefinements}=instantsearch.widgets;const facetDisplay=function(container,title,refinementSettings,subElement){return panel({container,collapsed:true,templates:{header:title,collapseButtonText(options,{html}){return html`<span class="button-arrow lg:hidden">${options.collapsed?'':''}</span>`;}}})(subElement)(refinementSettings);};if(settings.page_count)search.addWidgets([instantsearch.widgets.configure({hitsPerPage:settings.page_count})]);if(settings.filter.length!=0||settings.facetFilter.length!=0){var conf={};if(settings.filter.length!=0)conf.filters=settings.filter.join(' AND ');if(settings.facetFilter.length!=0)conf.facetFilters=settings.facetFilter;search.addWidgets([instantsearch.widgets.configure(conf)]);}if(settings.search_box)search.addWidgets([instantsearch.widgets.searchBox({container:'#'+id_prefix+'searchbox',showLoadingIndicator:true})]);if(settings.display_refinements)search.addWidgets([currentRefinements({container:'#'+id_prefix+'current-refinements',transformItems(items){return items.map((item,index)=>{if(item.label.startsWith('industry'))item.label='Industry';return item;});}}),clearRefinements({container:'#'+id_prefix+'clear-refinements',templates:{resetLabel({hasRefinements},{html}){return html`<span>${hasRefinements?'Reset':''}</span>`;}}})]);search.addWidgets([instantsearch.widgets.hits({container:'#'+id_prefix+'hits',cssClasses:{list:'carousel-items',item:'teaser'},transformItems(items){items=items.map((item)=>({...item,itemType:item.objectID.startsWith('Provider')?'course':item.objectID.replace('App\\Models\\','').split(':')[0].toLowerCase()}));if(settings.shuffle_results){items=items.map((item)=>({...item,sort:Math.random()}));items=items.sort((a,b)=>a.sort-b.sort);}return items;},templates:{empty(results,{html}){let message;switch(results.index){case "events":message=`No CPD events found. Please try adjusting your search criteria.`;break;case "courses":message=`<span class="block">No CPD courses found. Please try adjusting your search criteria.</span><a href="/courses" class="search-btn btn-mint">Explore other CPD courses</a>`;break;case "providers":message=`<span class="block">No CPD providers found. Please refine your search criteria and try again.</span><a href="/providers" class="search-btn btn-blue">Browse all CPD providers</a>`;break;default:message=`No results found`;}return `<div class="${id_prefix}-algoliasearch-no-results">${message}</div>`;},item:function(item){if(item.itemType=='event'){const options={year:'numeric',month:'long'};const dayOptions={day:'numeric'};const formattedDate=new Intl.DateTimeFormat('en-UK',options).format(new Date(item.datetime_start*1000));const formattedDay=new Intl.DateTimeFormat('en-UK',dayOptions).format(new Date(item.datetime_start*1000));const suffixes=["th","st","nd","rd"];function isDateInThisWeek(date){const todayObj=new Date();const todayDate=todayObj.getDate();const todayDay=todayObj.getDay();const firstDayOfWeek=new Date(todayObj.setDate(todayDate-todayDay));const lastDayOfWeek=new Date(firstDayOfWeek);lastDayOfWeek.setDate(lastDayOfWeek.getDate()+6);return date>=firstDayOfWeek&&date<=lastDayOfWeek;}const isThisWeek=isDateInThisWeek(new Date(item.datetime_start*1000));function getOrdinalSuffix(number){const onesDigit=number%10;if(number%100>=11&&number%100<=13)return "th";return onesDigit<4?suffixes[onesDigit]:suffixes[0];}const suffix=getOrdinalSuffix(formattedDay);return `<div class="${item.itemType}-teaser relative bg-white p-4 rounded-2xl !flex flex-col h-full">
3 <div class="w-full border-b border-violet-light pb-6 mb-4"> 4 <div class="w-full flex justify-between"> 5 <div class="flex items-center"> 6 <img src="/themes/custom/cpd/assets/images/icons/industry/${industryLogo(item.industry_key)}-icon-blue.svg" alt="${industryDisplay(item.industry)}" class="w-7"> 7 <span class="uppercase pl-2 xl:pl-4 mt-1 text-sm font-medium text-blue">${industryDisplay(item.industry)}</span> 8 </div> 9 10 <div class="${isThisWeek?'flex':'hidden'} items-center h-8 px-2 rounded-lg bg-gradient-to-r from-[#548ba1] to-[#45649c] flex-shrink-0"> 11 <img src="/themes/custom/cpd/assets/images/icons/featured_icon_white.svg" alt="Looking ahead - Adjusting your Asset Allocation:" class="w-4 h-4"> 12 <span class="pl-2 uppercase text-[10px] font-medium text-white">This Week</span> 13 </div> 14 15 </div> 16 </div> 17 <h3 class="text-xl leading-tight font-medium mb-2 line-clamp-3">${item.title}</h3> 18 <h4 class="text-violet leading-snug font-medium mb-2">${item.provider?item.provider.title:''}</h4> 19 <div class="leading-snug mb-8 text-small line-clamp-3 font-light"> ${item.content}</div> 20 <div class="w-full mt-auto"> 21 <div class="flex mb-4"> 22 <img src="/themes/custom/cpd/assets/images/icons/calendar_icon.svg" alt="Event date" class="w-4 h-4"> 23 <span class="pl-2 text-sm font-medium text-grey-600">${formattedDay}${suffix} ${formattedDate} </span> 24 </div> 25 26 <div class="w-full flex items-center justify-between"> 27 <a href="/${item.itemType}s/${item.slug}" class="bg-rose-bg-dark rounded-2xl px-4 py-2 w-fit hover:bg-grey hover:text-white">View event</a> 28 ${!("can_enquiry" in item.provider)||item.provider.can_enquiry?`<a href="#" @click.prevent="clicked_id='${item.id}', clicked_type='${item.itemType}', modal_open=true, provider_id='${item.provider.id}', provider_name='${rfc3986EncodeURIComponent(item.provider.title)}', clicked_name='${rfc3986EncodeURIComponent(item.title)}'" class="bg-rose-bg-light rounded-2xl px-4 py-2 w-fit hover:bg-grey hover:text-white">Enquire now</a>`:``} 29 </div> 30 </div> 31 </div>`;}if(item.itemType=='provider')return `<div class="${item.itemType}-teaser relative bg-white xl:p-4 rounded-2xl !flex flex-col h-full"> 32 <div class="w-full border-b-2 border-blue pb-3 mb-4"> 33 <div class="w-full flex justify-between"> 34 <div class="flex items-center h-10"> 35 <img src="/themes/custom/cpd/assets/images/icons/industry/${industryLogo(item.industry_key)}-icon-blue.svg" alt="${industryDisplay(item.industry)}" class="w-7"> 36 <span class="uppercase pl-2 xl:pl-4 mt-1 text-sm font-medium text-blue">${primaryIndustryDisplay(item.industry)}</span> 37 </div> 38 </div> 39 </div> 40 <h3 class="text-xl leading-tight font-medium line-clamp-2">${item.title}</h3> 41 ${item.member_number?`<span class="font-bold text-sm my-2">CPD Provider No: ${item.member_number}</span>`:''} 42 <h4 class="text-small leading-snug mb-4 line-clamp-2">${item.tagline}</h4> 43 <div class="mb-4"> 44 <div class="flex items-center justify-center h-full"> 45 <img src="${item.image_path}" alt="${item.title} logo" class="max-w-52 h-auto max-h-12"> 46 </div> 47 </div> 48 <div class="text-small leading-snug mb-4 line-clamp-3 font-light">${item.summary}</div> 49 <div class="w-full mt-auto"> 50 <div class="w-full flex items-center justify-between"> 51 <a href="/${item.itemType}s/${item.slug}" class="bg-blue-pale rounded-2xl px-4 py-2 w-fit hover:bg-grey hover:text-white text-nowrap text-sm">View Provider</a> 52 ${!("can_enquiry" in item)||item.can_enquiry?`<a href="#" @click.prevent="clicked_id='${item.id}', clicked_type='${item.itemType}', modal_open=true, provider_id='${item.id}', provider_name='${rfc3986EncodeURIComponent(item.title)}'" class="bg-blue-pale rounded-2xl px-4 py-2 w-fit hover:bg-grey hover:text-white text-nowrap text-sm">Enquire now</a>`:``} 53 </div> 54 </div> 55 </div>`;if(item.itemType=='course')if(window.location.href.match(/news/))return `<div class="${item.itemType}-teaser relative bg-white !flex flex-col h-full"> 56 <h3 class="block text-lg mb-4">${item.title}</h3> 57 <div class="leading-snug mb-4 text-small line-clamp-2"> ${item.content}</div> 58 <div class="w-full mt-auto"> 59 <div class="w-full flex items-center justify-between"> 60 <a href="/${item.itemType}s/${item.slug}" class="bg-mint bg-opacity-30 rounded-2xl px-4 py-2 w-fit hover:bg-grey hover:text-white">View course</a> 61 </div> 62 </div> 63 </div>`;else return `<div class="${item.itemType}-teaser relative bg-white p-4 rounded-2xl !flex flex-col h-full">
64 <div class="w-full border-b border-mint pb-6 mb-4"> 65 <div class="w-full flex justify-between"> 66 <div class="flex items-center"> 67 <img src="/themes/custom/cpd/assets/images/icons/industry/${industryLogo(item.industry_key)}-icon-blue.svg" alt="${industryDisplay(item.industry)}" class="w-7"> 68 <span class="uppercase pl-2 xl:pl-4 mt-1 text-sm font-medium text-blue">${industryDisplay(item.industry)}</span> 69 </div> 70 </div> 71 </div> 72 <h3 class="title text-xl leading-tight font-medium mb-2 line-clamp-2">${item.title}</h3> 73 <h4 class="text-mint leading-snug font-medium mb-2">${item.provider?item.provider.title:''}</h4> 74 <div class="leading-snug mb-8 text-small line-clamp-3 font-light"> ${item.content}</div> 75 <div class="w-full mt-auto"> 76 <div class="flex mb-4"> 77 <img src="/themes/custom/cpd/assets/images/icons/type_icon.svg" alt="Course type" class="w-4 h-4"> 78 <h5 class="pl-2 text-sm font-medium text-grey-600">${item.type}</h5> 79 </div> 80 81 <div class="w-full flex items-center justify-between"> 82 <a href="/${item.itemType}s/${item.slug}" class="bg-mint bg-opacity-30 rounded-2xl px-4 py-2 w-fit hover:bg-grey hover:text-white">View course</a> 83 ${!("can_enquiry" in item.provider)||item.provider.can_enquiry?`<a href="#" @click.prevent="clicked_id='${item.id}', clicked_type='${item.itemType}', modal_open=true, provider_id='${item.provider.id}', provider_name='${rfc3986EncodeURIComponent(item.provider.title)}', clicked_name='${rfc3986EncodeURIComponent(item.title)}'" class="bg-mint-light rounded-2xl px-4 py-2 w-fit hover:bg-grey hover:text-white">Enquire now</a>`:``} 84 </div> 85 </div> 86 </div>`;return '<div>Unknown</div>';}}})]);if(settings.search_pager)search.addWidgets([instantsearch.widgets.pagination({container:'#'+id_prefix+'pagination',scrollTo:'.demo-instant-search'})]);if(settings.search_filters){if(index_name=='courses')search.addWidgets([facetDisplay('#'+id_prefix+'type-filter','CPD by Type',{container:'#'+id_prefix+'type-filter',attribute:'type',sortBy:['name:asc']},refinementList)]);search.addWidgets([facetDisplay('#'+id_prefix+'industry-filter','CPD by Industry',{container:'#'+id_prefix+'industry-filter',attributes:['industry.lvl0','industry.lvl1'],limit:100,sortBy:['name:asc']},hierarchicalMenu)]);}if(settings.display_stats){const renderStats=(renderOptions,isFirstRender)=>{const {hitsPerPage,nbHits,areHitsSorted,nbSortedHits,processingTimeMS,query,widgetParams}=renderOptions;if(isFirstRender)return;let index=renderOptions.instantSearchInstance.indexName;let searchTabCountSpan=document.getElementById(`${index}-tab-count`);if(searchTabCountSpan)searchTabCountSpan.innerText=`(${nbHits})`;current=hitsPerPage>nbHits?nbHits:hitsPerPage;widgetParams.container.innerHTML=`Showing ${current} of ${nbHits} results`;};const customStats=instantsearch.connectors.connectStats(renderStats);search.addWidgets([customStats({container:document.querySelector('#'+id_prefix+'stats')})]);}if(params.industry&&!settings.search_filters)search.addWidgets([instantsearch.widgets.configure({filters:'industry.lvl0:"'+params.industry+'"'})]);if(params.search&&settings.search_box)setTimeout(()=>{search.addWidgets([instantsearch.widgets.configure({query:params.search})]);},"1000");search.start();if(settings.custom_filters){var filterElms=document.getElementById(id_prefix+'custom_filters').getElementsByClassName("filter");for(const element of filterElms)element.addEventListener('click',function(){var filters=settings.filter.map((x)=>x);var active=this.classList.contains('active');for(const filterElm of filterElms)filterElm.classList.remove('active');if(!active){this.classList.add('active');var filter=element.getAttribute('search-filter');if(filter!='all')filters.push(filter);}search.addWidgets([instantsearch.widgets.configure({filters:filters.join(' AND ')})]);let $searchSection=element.closest('.block-algolia-search');if($searchSection){let $sliders=$(".mobileSlider .ais-Hits-list",$searchSection);if($sliders.length>0){$sliders.slick("unslick");let slickOptions=$sliders.get(0).slick.options;setTimeout(function(){$sliders.slick(slickOptions);},500);}}});search.refresh();}if(params.industry&&settings.search_filters)search.on('render',()=>{if(search.status!='idle')return;if(jQuery('body').hasClass('algoliasearch-default-industry-appiled'))return;var element=jQuery('span.ais-HierarchicalMenu-label:contains("'+params.industry+'")');if(element.length==0)return;jQuery('body').addClass('algoliasearch-default-industry-appiled');element.parent().parent().parent().click();search.refresh();});setTimeout(()=>{if(!settings.hide_when_empty||jQuery('div.'+id_prefix+'-algoliasearch-no-results').length==0)jQuery('div#'+id_prefix+'hits').parents('.agloia-container').show();if(jQuery('div#'+id_prefix+'hits .ais-Hits-item').length<settings.page_count)jQuery('.'+id_prefix+'-view-l
86ink').hide();},"1000");};var elements=document.getElementsByClassName('block-algolia-search');for(const element of elements){blockSettingsJson=element.getAttribute('settings');blockSettings=JSON.parse(blockSettingsJson);searchSetup(blockSettings);}function rfc3986EncodeURIComponent(str){return encodeURIComponent(str).replace(/'/g,"%27");}function rfc3986DecodeURIComponent(str){return decodeURIComponent(str).replace(/%27/g,"'");};
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.