1jQuery(document).ready(function($){let map;let animationStopped=!1;let lastAnimatedMarker=null;let currentTimeout=null;$(document).ready(function(){map=$('.cabb-block.offices .map svg');const officeFilter=$('.cabb-block.offices .office_filter select');officeFilter.niceSelect();officeFilter.on('change',function(){const region=$(this).val();updateMarkers(region)});updateMarkers('all');$(document).on('click','.cabb-block.offices .map rect.active, .cabb-block.offices .map circle',function(){const markerID=$(this).attr('id');renderOfficePopup(markerID)});$(document).on('click','.offices_list .office_item, .cabb-block.offices .map_list_item a',function(){const markerID=$(this).data('id');renderOfficePopup(markerID);return!1});$(document).on('click','.cabb-block.offices .close_popup',function(){const obj=$(this);const popup=obj.parents('.office_popup_area');popup.fadeOut(300,function(){popup.remove()})})});function renderOfficePopup(markerID){let office=null;$.each(window.offices,function(_,region){$.each(region.offices,function(_,officeItem){if(officeItem.map_marker_id===markerID){office=officeItem;return!1}});if(office){return!1}});if(!office){return!1} 2let contact=null;if(office.contact){contact=` 3<div class="popup_block contact"> 4 <div class="popup_tab"> 5 <div class="tab_inner"> 6 <div class="tab_title">Contact Information</div> 7 </div> 8 </div> 9 <div class="block_content"> 10 ${office.contact} 11 </div> 12</div>`} 13let map=null;if(office.map_query){const mapQuery=encodeURIComponent(office.map_query).replace(/%20/g,'+');map=` 14<div class="popup_block map"> 15 <div class="popup_tab"> 16 <div class="tab_inner"> 17 <div class="tab_title">Interactive Map</div> 18 </div> 19 </div> 20 <div class="block_content"> 21 <iframe src="https://maps.google.com/maps?q=${mapQuery}&t=&z=15&ie=UTF8&iwloc=&output=embed"></iframe> 22 </div> 23</div>`} 24const teamPersons=office?.team?.persons||'';let teamContent='';if(teamPersons){const teamTitle=office?.team?.title||'';let htmlTeamTitle='';if(teamTitle){htmlTeamTitle=` 25 <div class="popup_tab"> 26 <div class="tab_inner"> 27 <div class="tab_title">${teamTitle}</div> 28 </div> 29 </div> 30 `} 31let htmlTeamPersons='';teamPersons.forEach(function(person){const htmlPersonImage=person?.image||'';htmlTeamPersons+=` 32 <div class="person_item"> 33 <a href="${person?.url}"> 34 ${htmlPersonImage} 35 <div class="person_wrap"> 36 <div class="person_info"> 37 <div class="person_name">${person?.name}</div> 38 <div class="person_position">${person?.position}</div> 39 </div> 40 </div> 41 </a> 42 </div> 43 `});teamContent=` 44 <div class="popup_block team"> 45 ${htmlTeamTitle} 46 <div class="block_content"> 47 <div class="team_list"> 48 ${htmlTeamPersons} 49 </div> 50 </div> 51 </div> 52 `} 53const popup=` 54<div class="office_popup_area"> 55 <div class="office_popup_area_inner"> 56 <div class="popup_loading"> 57 <svg width="24" height="24" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>.spinner_V8m1{transform-origin:center;animation:spinner_zKoa 2s linear infinite}.spinner_V8m1 circle{stroke-linecap:round;animation:spinner_YpZS 1.5s ease-in-out infinite}@keyframes spinner_zKoa{100%{transform:rotate(360deg)}}@keyframes spinner_YpZS{0%{stroke-dasharray:0 150;stroke-dashoffset:0}47.5%{stroke-dasharray:42 150;stroke-dashoffset:-16}
5795%,100%{stroke-dasharray:42 150;stroke-dashoffset:-59}}</style><g class="spinner_V8m1"><circle cx="12" cy="12" r="9.5" fill="none" stroke-width="3"></circle></g></svg> 58 </div> 59 <div class="office_popup" style="display: block;"> 60 <div class="close_popup"> 61 <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1.4 14L0 12.6L5.6 7L0 1.4L1.4 0L7 5.6L12.6 0L14 1.4L8.4 7L14 12.6L12.6 14L7 8.4L1.4 14Z" fill="white"></path></svg> 62 </div> 63 <div class="office_popup_inner"> 64 <div class="popup_content"> 65 <div class="popup_left"> 66 ${map} 67 </div> 68 <div class="popup_right"> 69 ${contact} 70 </div> 71 ${teamContent} 72 </div> 73 </div> 74 </div> 75 </div> 76</div> 77 `;$('.cabb-block.offices').append(popup);$('.cabb-block.offices .office_popup_area').fadeIn(300)} 78let updateMarkersRetryTimer=null;let updateMarkersRetryCount=0;function updateMarkers(regionFilter='all'){if(updateMarkersRetryTimer){clearTimeout(updateMarkersRetryTimer);updateMarkersRetryTimer=null} 79animationStopped=!0;map.find('.raindrop').remove();if(currentTimeout){clearTimeout(currentTimeout);currentTimeout=null} 80map.find('rect.active').removeClass('active');if(!Array.isArray(window.offices)){if(updateMarkersRetryCount<10){updateMarkersRetryCount++;updateMarkersRetryTimer=setTimeout(()=>{updateMarkers(regionFilter)},300)}else{console.warn('[updateMarkers] offices not loaded after retries')} 81return} 82updateMarkersRetryCount=0;window.offices.forEach(region=>{if(regionFilter!=='all'&®ion.region!==regionFilter)return;region.offices.forEach(office=>{if(office.map_marker_id){const rect=map.find(`#${office.map_marker_id}`);if(rect.length){rect.addClass('active')}}})});animationStopped=!1;animateActiveMarkers();const activeIds=[];map.find('rect.active').each(function(){const id=$(this).attr('id');if(id){activeIds.push(id)}});$('.offices_list .office_item').each(function(){const officeId=$(this).data('id');if(activeIds.includes(officeId)){$(this).fadeIn(300)}else{$(this).hide()}})} 83function animateActiveMarkers(){if(animationStopped)return;const activeMarkers=map.find('rect.active');if(activeMarkers.length===0){setTimeout(animateActiveMarkers,1000);return} 84let marker;if(activeMarkers.length>1&&lastAnimatedMarker){do{marker=$(activeMarkers[Math.floor(Math.random()*activeMarkers.length)])}while(marker.attr('id')===lastAnimatedMarker.attr('id'));}else{marker=$(activeMarkers[Math.floor(Math.random()*activeMarkers.length)])} 85lastAnimatedMarker=marker;const x=parseFloat(marker.attr('x'))||0;const y=parseFloat(marker.attr('y'))||0;const width=parseFloat(marker.attr('width'))||0;const height=parseFloat(marker.attr('height'))||0;const cx=x+width/2;const cy=y+height/2;const svgNS="http://www.w3.org/2000/svg";const circle=document.createElementNS(svgNS,'circle');circle.setAttribute('cx',cx);circle.setAttribute('cy',cy);circle.setAttribute('r',10);circle.setAttribute('fill','red');circle.setAttribute('id',marker.attr('id'));circle.classList.add('raindrop');map[0].appendChild(circle);circle.addEventListener('animationend',function handler(){circle.removeEventListener('animationend',handler);circle.remove();if(!animationStopped){currentTimeout=setTimeout(animateActiveMarkers,500)}})}})
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.