PageSourceSearch

https://www.gpbullhound.com/app/cache/min/1/app/themes/gpbullhound/blocks/offices/script.js?ver=1790008884

js gpbullhound.com collected 2026-09-24 17:56:42 UTC 7,427 bytes, 85 lines download raw bytes

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'&&region.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.