2019-2020 Bryant University Tennis Club Roster

There was a problem with a Velocity script
Page/httpd/prestosports/site-public/WEB-INF/themes/generic-bootstrap/roster-headline-template
ErrorInvocation of method 'sortedBy' in class com.prestosports.content.HeadlinesSorter threw exception Only one : should be in a sort rule (hometown:/:highschool) at /httpd/prestosports/site-public/WEB-INF/themes/generic-bootstrap/roster-headline-template[line 550, column 55]
Page source:
1: $website.include("options")
2: #set ($options = $request.getAttribute("options"))
3: 
4: #set ($rosterLayout = "list")
5: #set ($showHeadshotView = false)
6: 
7: #if ($options.get("roster_show_headshot_view") == true)
8: 	#set ($showHeadshotView = true)
9: 
10: 	#foreach ($cookie in $request.cookies)
11: 		#if ($cookie.name == "roster_view")
12: 			#set ($rosterLayout = $cookie.value)
13: 		#end
14: 	#end
15: #end
16: 
17: #if ($options.get("roster_default_view"))
18: 	#set ($rosterLayout = $options.get("roster_default_view"))
19: #end
20: 
21: #if ($request.getParameter("view"))
22: 	#set ($view = $request.getParameter("view"))
23: 	#if ($view == "list" || $view == "headshot")
24: 		#set ($rosterLayout = $view)
25: 	#end
26: #end
27: 
28: #set ($rosterFields = ["number","first_name: :last_name","position","year","height","weight","hometown:/:highschool"])
29: #set ($rosterLabels = ["No.","Name","Pos.","Cl.","Ht.","Wt.","Hometown/High School"])
30: #set ($rosterSortables = ["number","last_name","year","position"])
31: 
32: #if ($options.get("roster_fields") && $options.get("roster_labels"))
33: 	#set ($rosterFieldsString = $options.get("roster_fields"))
34: 	#set ($rosterLabelsString = $options.get("roster_labels"))
35: 
36: 	#set ($rosterFieldsString = $rosterFieldsString.split(","))
37: 	#set ($rosterLabelsString = $rosterLabelsString.split(","))
38: 
39: 	#set ($rosterFieldsSize = $tool.list.size($rosterFieldsString))
40: 	#set ($rosterLabelsSize = $tool.list.size($rosterLabelsString))
41: 
42: 	#if ($rosterFieldsSize > 0 && $rosterLabelsSize > 0 && $rosterFieldsSize == $rosterLabelsSize)
43: 		#set ($rosterFields = $rosterFieldsString)
44: 		#set ($rosterLabels = $rosterLabelsString)
45: 	#end
46: #end
47: 
48: #if ($request.getParameter("sort").length() > 0) ## when sort param is available, force the list layout
49: 	#set ($rosterLayout = "list")
50: #end
51: 
52: #macro (printFieldValue $field $defaultValue)
53: 	#set ($fieldValue = "")
54: 	#if ($field.contains(">"))
55: 		#set ($orderedFields = $field.split(">"))
56: 		#foreach ($orderedField in $orderedFields)
57: 			#set ($orderedField = $orderedField.trim())
58: 			#if ($bio.get($orderedField) && $fieldValue.length() == 0)
59: 				#set ($fieldValue = $bio.get($orderedField))
60: 			#end
61: 		#end
62: 	#else
63: 		#if ($bio.get($field))
64: 			#set ($fieldValue = $bio.get($field))
65: 		#end
66: 	#end
67: 	#if ($fieldValue.length() > 0)
68: 		$fieldValue
69: 	#else
70: 		$defaultValue
71: 	#end
72: #end
73: 
74: #macro (printField $field)
75: 	#set ($splitter = "")
76: 	#if ($field.contains(": :")) ## multipart fields separated by a space
77: 		#set ($splitter = ": :")
78: 	#elseif ($field.contains(":/:")) ## multipart fields separated by a /
79: 		#set ($splitter = ":/:")
80: 	#end
81: 
82: 	#if ($splitter.length() > 0)
83: 		#set ($multipartField = $field.split($splitter))
84: 		#foreach ($fieldPart in $multipartField)
85: 			#set ($fieldPart = $fieldPart.trim())
86: 			#if ($velocityCount > 1)
87: 				$splitter.charAt(1)
88: 			#end
89: 			#printFieldValue($fieldPart "")
90: 		#end
91: 	#else
92: 		#printFieldValue($field "")
93: 	#end
94: #end
95: 
96: #macro (printPlayerAriaLabel $bioinfo)
97: 	#set ($jerseyNumber = "")
98: 	#set ($bio = $bioinfo.getDataAsObject().getAttributes())
99: 	#if ($bio.get("full_name").length() > 0)
100: 		#set ($fullName = $bio.get("full_name"))
101: 	#else
102: 		#set ($firstName = $bio.get("first_name"))
103: 		#set ($lastName = $bio.get("last_name"))
104: 		#set ($fullName = "${firstName} ${lastName}")
105: 	#end
106: 	#if ($bio.get("number").length() > 0)
107: 		#set ($jerseyNumber = "jersey number ${bio.get('number')}")
108: 	#end
109: aria-label="${fullName}: ${jerseyNumber}: full bio"
110: #end
111: 
112: #macro (printHeadshot $bioinfo)
113: 	#set ($bio = $bioinfo.getDataAsObject().getAttributes())
114: 	#set ($alt = "${bio.get('first_name')} ${bio.get('last_name')} bio photo")
115: 
116: 	#if ($bioinfo.publishedHeadshots.size() > 0)
117: 		#set ($src = $bioinfo.publishedHeadshots.get(0).url)
118: 	#elseif ($website.exists("/images/setup/default-headshot.png"))
119: 		#set ($src = "/images/setup/default-headshot.png")
120: 	#elseif ($website.exists("/images/setup/headshot_default.jpg"))
121: 		#set ($src = "/images/setup/headshot_default.jpg")
122: 	#else
123: 		#set ($src = "/info/images/default-headshot.png")
124: 	#end
125: 
126: 	#set ($src = "${src}?max_height=576&max_width=576&crop=1")
127: <img class="img-fluid w-100" src="${src}" alt="${alt}" tabindex="0" />
128: #end ## macro printHeadshot
129: 
130: #macro (printHeadshotBg $bioinfo)
131: 	#set ($bio = $bioinfo.getDataAsObject().getAttributes())
132: 	#if ($bioinfo.publishedHeadshots.size() > 0)
133: 		#set ($src = $bioinfo.publishedHeadshots.get(0).url)
134: 	#elseif ($website.exists("/images/setup/default-headshot.png"))
135: 		#set ($src = "/images/setup/default-headshot.png")
136: 	#elseif ($website.exists("/images/setup/headshot_default.jpg"))
137: 		#set ($src = "/images/setup/headshot_default.jpg")
138: 	#else
139: 		#set ($src = "/info/images/default-headshot.png")
140: 	#end
141: 	#set ($src = "${src}?max_height=576&max_width=576&crop=1")
142: <div class="ratio ratio-1x1 d-block">
143:     <div style="background-image:url('${src}'); background-position:top center; background-size:cover;"></div>
144: </div>
145: #end ## macro printHeadshotBg
146: 
147: 
148: #macro (printBannerImage)
149: 	#if ($page.thumbnailURL)
150: 		#set ($rosterThumbSize = 1920)
151: 		#if ($tool.math.toInteger($options.get("roster_thumb_size")))
152: 			#set ($rosterThumbSize = $tool.math.toInteger($options.get("roster_thumb_size")))
153: 		#end
154:     <div class="roster-banner-img text-center">
155:         <picture alt="${page.thumbnailPage.altText}">
156:             <source media="(min-width:1200px)" srcset="${page.thumbnailURL}?max_width=1920">
157:             <source media="(min-width:992px)" srcset="${page.thumbnailURL}?max_width=1199">
158:             <source media="(min-width:578px)" srcset="${page.thumbnailURL}?max_width=991">
159:             <source media="(min-width:0px)" srcset="${page.thumbnailURL}?max_width=576">
160:             <img class="img-fluid mx-auto" src="${page.thumbnailURL}?max_width=${rosterThumbSize}" alt="${page.thumbnailPage.altText}"/>
161:         </picture>
162:     </div>
163: 	#end
164: #end
165: 
166: #macro (printArchiveList)
167: 	#if ($options.get("archive_roster"))
168: 		#set ($id = "roster-archive-switcher")
169: 		#if ($request.getParameter("id").length() > 0)
170: 			#set ($id = $request.getParameter("id"))
171: 		#end
172: 
173: 		#set ($archiveRosterString = $options.get("archive_roster"))
174: 		#set ($archiveRosterString = $archiveRosterString.split(","))
175: 		#set ($isArchivePage = false)
176: 		#if ($tool.list.size($archiveRosterString) > 0)
177: 
178:         <div id="${id}" class="archive-roster-switcher-template float-right ml-3">
179:             <div class="input-group mb-3">
180:                 <div class="input-group-prepend">
181:                     <label class="input-group-text" for="$id-options">Archive Rosters</label>
182:                 </div>
183:                 <select class="custom-select" id="${id}-options" onchange="location=this.value;" aria-label="Change the season by selecting an option from the list below">
184: 					#foreach ($string in $archiveRosterString)
185: 						#set ($archiveRoster = $string.split(":"))
186: 						#if ($tool.list.size($archiveRoster) == 2)
187: 							#set ($archiveUrl = $tool.list.get($archiveRoster, 0).trim())
188: 							#set ($archiveLabel = $tool.list.get($archiveRoster, 1).trim())
189: 							#if ($archiveUrl != $page.url)
190:                                 <option value="$archiveUrl" data-url="$archiveUrl" data-title="$archiveLabel">$archiveLabel</option>
191: 							#else
192:                                 <option value="$archiveUrl" data-url="$archiveUrl" data-title="$archiveLabel" selected>$archiveLabel</option>
193: 								#set ($isArchivePage = true)
194: 							#end
195: 						#end
196: 					#end
197:                 </select>
198:             </div>
199:         </div>
200: 		#end
201: 	#end
202: #end ## macro printArchiveList
203: 
204: #macro (printViewButtons)
205: <div class="btn-toolbar flex-fill justify-content-between d-print-none" role="toolbar" aria-label="Roster tool bar">
206:     <div class="me-2" role="group" aria-label="Print freindly version">
207:         <a href="${page.url}?dec=printer-decorator" class="btn btn-outline-secondary"><span class="fa fa-print"></span> Print</a>
208:     </div>
209: 	#if ($showHeadshotView)
210:         <div class="btn-group btn-group-toggle mb-3 ms-auto me-3" role="group" data-bs-toggle="buttons">
211:             <a class="roster-view btn btn-outline-secondary #if($rosterLayout == 'list') active #end" data-view="list" href="$page.url?view=list">
212:                 <span class="fas fa-list" aria-hidden="true"></span>
213:                 <span class="sr-only">List View</span>
214:             </a>
215:             <a class="roster-view btn btn-outline-secondary #if($rosterLayout == 'headshot') active #end" data-view="headshot" href="$page.url?view=headshot">
216:                 <span class="fas fa-user" aria-hidden="true"></span>
217:                 <span class="sr-only">Headshot View</span>
218:             </a>
219:         </div>
220: 	#end
221: </div>
222: 
223: #end ## macro printViewButtons
224: 
225: #set ($socialBrands = ["facebook", "twitter", "instagram", "youtube", "twitch", "tiktok"])
226: 
227: #macro (buildSocialLink $brand $handle $icons $class)
228: 	#if($brand == "facebook")
229: 		#set($socialHost = "https://www.facebook.com")
230: 	#elseif($brand == "twitter")
231: 		#set($socialHost = "https://twitter.com")
232: 	#elseif($brand == "instagram")
233: 		#set($socialHost = "https://www.instagram.com")
234: 	#elseif($brand == "tikTok")
235: 		#set($socialHost = "https://www.tiktok.com")
236: 	#elseif($brand == "twitch")
237: 		#set($socialHost = "https://www.twitch.tv")
238: 	#elseif($brand == "youtube")
239: 		#set($socialHost = "https://www.youtube.com")
240: 	#end
241: 
242: 	#if($socialHost.length() > 0 )
243: 		#set($url = "${socialHost}/${handle}")
244: 	#else
245: 		#set($url = "")
246: 	#end
247: 
248: 	#set($icons = $Boolean.parseBoolean($icons))
249: 	#if($icons == true)
250: 		#set ($iconClass = $brand.toLowerCase())
251: 		#if ($iconClass == "twitter")
252: 			#set ($iconClass = "x-twitter")
253: 		#end
254:     	<a href="$url" class="$class" target="_blank"><span aria-label="$brand" class="fa fa-brands fa-${iconClass}"></span></a>
255: 	#else
256:     	<a href="$url" class="$class" target="_blank">$handle</a>
257: 	#end
258: #end
259: 
260: 
261: 
262: #macro (printListLayout)
263: 	#set ($rosterFields = ["number","first_name: :last_name","position","year","height","weight","hometown:/:highschool"])
264: 	#set ($rosterLabels = ["No.","Name","Pos.","Cl.","Ht.","Wt.","Hometown/High School"])
265: 	#set ($rosterSortables = ["number","last_name","year","position"])
266: 
267: 	#if ($options.get("roster_fields") && $options.get("roster_labels"))
268: 		#set ($rosterFieldsString = $options.get("roster_fields"))
269: 		#set ($rosterLabelsString = $options.get("roster_labels"))
270: 
271: 		#set ($rosterFieldsString = $rosterFieldsString.split(","))
272: 		#set ($rosterLabelsString = $rosterLabelsString.split(","))
273: 
274: 		#set ($rosterFieldsSize = $tool.list.size($rosterFieldsString))
275: 		#set ($rosterLabelsSize = $tool.list.size($rosterLabelsString))
276: 
277: 		#if ($rosterFieldsSize > 0 && $rosterLabelsSize > 0 && $rosterFieldsSize == $rosterLabelsSize)
278: 			#set ($rosterFields = $rosterFieldsString)
279: 			#set ($rosterLabels = $rosterLabelsString)
280: 		#end
281: 	#end
282: 
283: 	#if ($options.get("roster_sortable"))
284: 		#set ($rosterSortablesString = $options.get("roster_sortable"))
285: 		#set ($rosterSortables = $rosterSortablesString.split(","))
286: 	#end
287: 
288: 	#set ($sortBy = "")
289: 	#set($sortBy = $formatter.escapeXml($request.getParameter("sort")))
290: 	#if ($sortBy.length() > 0)
291: 		#set ($headlines = $headlines.sortedBy($sortBy))
292: 	#end
293: 
294: <div class="table-responsive">
295:     <table class="table table-hover">
296:         <thead class="thead-dark">
297:         <tr>
298: 			#foreach($field in $rosterFields)
299: 				#set ($fieldLabel = $tool.list.get($rosterLabels, $tool.math.sub($velocityCount, 1)))
300: 				#set ($isSortable = false)
301: 				#set ($sortableField = "")
302: 
303: 				#if ($tool.list.size($rosterSortables) > 0)
304: 					#foreach ($sortable in $rosterSortables)
305: 						#if ($field.contains($sortable))
306: 							#set ($isSortable = true)
307: 							#set ($sortableField = $sortable)
308: 						#end
309: 					#end
310: 				#end
311: 
312: 				#set ($ariaLabelColumn = $sortableField)
313: 				#if ($sortableField.contains('custom'))
314: 					#set ($ariaLabelColumn = $fieldLabel)
315: 				#end
316: 
317: 				#set ($width = "")
318: 				#if ($fieldLabel.contains('No'))
319: 					#set ($width = "w-1")
320: 				#end
321: 
322:                 <th scope="col" class="text-nowrap ${width} col${velocityCount} #if($isSortable)sortable #end #if($sortBy == $sortableField) sorted #end">
323: 
324: 					#if ($isSortable)
325:                         <a href="$page.url?sort=${sortableField}" title="Sort using this column" class="sortable text-reset" role="button" >$fieldLabel
326: 							#if($sortBy == $sortableField)
327:                                 <span class="fa fa-sort-asc" aria-hidden="true"></span>
328: 							#else
329:                                 <span class="fa fa-sort text-muted" aria-hidden="true"></span>
330: 							#end
331:                         </a>
332: 					#else
333: 						$fieldLabel
334: 					#end
335:                 </th>
336: 			#end
337:         </tr>
338:         </thead>
339:         <tbody>
340: 			#foreach ($bioinfo in $headlines)
341: 				#set ($bio = $bioinfo.getDataAsObject().getAttributes())
342:             <tr>
343: 				#foreach($field in $rosterFields)
344: 					#set ($dataLabel = $tool.list.get($rosterLabels, $tool.math.sub($velocityCount, 1)))
345: 					#if ($field.contains("first_name") || $field.contains("last_name") || $field.contains("full_name"))
346:                         <th scope="row" class="text-inherit">
347:                             <a #printPlayerAriaLabel($bioinfo) href="$bioinfo.url">#printField($field)</a>
348:                             <div class="social-links-inline d-inline-block ml-2 ms-2">
349:                                 <ul class="d-flex d-flex justify-content-between align-items-center p-0 m-0 gap-0" tabindex="0">
350: 									#foreach ($brand in $socialBrands)
351: 										#if ($bio.get("$brand").length())
352: 											#set($link = $bio.get("$brand"))
353:                                             <li class="d-flex justify-content-between align-items-center flex-column">
354: 												#buildSocialLink($brand.toLowerCase(), $link, true, "fs-sm small p-1")
355:                                             </li>
356: 										#end
357: 									#end
358:                                 </ul>
359:                             </div>
360:                         </th>
361: 					#else
362: 						#if ($dataLabel.contains('No'))
363:                             <td class="text-nowrap jersey-number d-md-none">
364:                                 <span class="badge badge-secondary">#printField($field)</span>
365:                             </td>
366: 						#end
367: 						#if ($dataLabel.contains("Pos.") || $dataLabel.contains("Num.") || $dataLabel.contains("Wt.") || $dataLabel.contains("Ht.") || $dataLabel.contains("Cl.") || $dataLabel.contains("B/T"))
368: 							#set ($textWrapClass = "text-nowrap")
369: 						#else
370: 							#set ($textWrapClass = "text-inherit")
371: 						#end
372:                         <td class="$textWrapClass #if ($dataLabel.contains('No')) jersey-number d-none d-md-table-cell #end">
373:                             <span class="label font-weight-bold fw-bold d-md-none">$dataLabel:</span>
374: 							#if ($field.contains("email_address"))
375:                                 <a href="mailto:${bio.get("email_address")}">#printField($field)</a>
376: 							#else
377: 								#printField($field)
378: 							#end
379:                         </td>
380: 					#end
381: 				#end
382:             </tr>
383: 			#end
384:         </tbody>
385:     </table>
386: </div>
387: #end ## macro printListLayout
388: 
389: #macro (printHeadshotLayout)
390: 	#set ($headshotSize = "medium")
391: 	#if ($options.get("roster_headshot_size"))
392: 		#set ($headshotSize = $options.get("roster_headshot_size"))
393: 	#end
394: 
395: <div class="roster-headshot-container">
396:     <div class="row player-cards g-3 headshot-size-${headshotSize}">
397: 		#foreach ($bioinfo in $headlines)
398: 			#if($headshotSize == "large")
399: 				#set ($cardClass = "col-12 col-sm-6 col-md-4 col-lg-4")
400: 			#elseif($headshotSize == "medium")
401: 				#set ($cardClass = "col-12 col-sm-6 col-md-4 col-lg-3")
402: 			#elseif($headshotSize == "small")
403: 				#set ($cardClass = "col-12 col-sm-6 col-md-4 col-lg-2")
404: 			#end
405: 
406: 			#set ($bio = $bioinfo.getDataAsObject().getAttributes())
407:             <div class="player-card-wrapper ${cardClass} my-3 d-flex align-items-stretch position-relative">
408:                 <div class="player-card card shadow w-100">
409:                     <div #printPlayerAriaLabel($bioinfo)  class="card-front card-data w-100 h-100 bg-white rounded d-flex flex-column align-items-center justify-content-between">
410:                         <div class="player-image position-relative w-100 overflow-hidden">
411: 							#printHeadshotBg($bioinfo)
412:                         </div>
413:                         <div class="player-card-footer p-3 d-flex justify-content-between align-items-center flex-grow w-100 position-relative">
414: 							#if ($bio.get("first_name") && $bio.get("last_name"))
415:                                 <a href="$bioinfo.url" class="text-decoration-none flex-fill">
416: 									<span class="name">
417: 										<span class="firstname text-truncate d-block fs-6">$bio.get("first_name")</span>
418: 										<span class="lastname text-truncate d-block fs-5">$bio.get("last_name")#if($bio.get("year").length() > 0) - $bio.get("year")#end</span>
419: 									</span>
420:                                 </a>
421: 							#end
422:                             <ul class="d-flex d-flex justify-content-between align-items-center p-0 m-0 gap-2" tabindex="0">
423: 								#foreach ($brand in $socialBrands)
424: 									#if ($bio.get("$brand").length())
425: 										#set($link = $bio.get("$brand"))
426:                                         <li class="d-flex justify-content-between align-items-center flex-column">
427: 											#buildSocialLink($brand.toLowerCase(), $link, true, "")
428:                                         </li>
429: 									#end
430: 								#end
431:                             </ul>
432: 
433: 							#if ($bio.get("number") && $!bio.get("number").length() > 0)
434:                                 <span class="number font-weight-bold fw-bold position-relative float-right text-center text-white" tabindex="0" aria-label="Jersey Number $bio.get('number')">$bio.get("number")</span>
435: 							#end
436:                             <div class="vm-btn btn btn-sm btn-secondary overflow-hidden position-absolute font-weight-bold fw-bold z-index-1 lh-base" style="line-height:initial;"><span class="fa fa-ellipsis-v"></span><span class="sr-only visually-hidden">View More</span></div>
437:                         </div>
438:                     </div>
439:                     <div class="player-short-bio card-back card-data w-100 h-100 overflow-hidden p-3 position-absolute" >
440:                         <div class="bio-content d-flex flex-column gap-2 h-100">
441:                             <div class="card-back-head pb-2 mb-2">
442: 								#if ($bio.get("first_name") && $bio.get("last_name"))
443:                                     <div class="name d-flex align-items-center justify-content-start gap-2 p-0">
444:                                         <div class="pl-profile w-25 h-100 mr-3">
445: 											#printHeadshot($bioinfo)
446:                                         </div>
447:                                         <div class="pl-name-wrap d-flex flex-column gap-2">
448: 											#if ($bio.get("number") && $!bio.get("number").length() > 0)
449:                                                 <span class="number font-weight-bold fw-bold fs-5 nowrap">#$bio.get("number")</span>
450: 											#end
451:                                             <div class="pl-name text-decoration-none mt-0">
452:                                                 <span class="firstname text-truncate d-block fs-6">$bio.get("first_name")</span>
453:                                                 <span class="lastname text-truncate d-block fs-5">$bio.get("last_name")</span>
454:                                             </div>
455:                                         </div>
456:                                     </div>
457: 								#end
458:                                 <span class="close position-absolute btn btn-sm btn-link">
459: 									<span class="fa fa-close fa-sm fa-times" aria-hidden="true"></span>
460: 									<span class="sr-only visually-hidden">Close</span>
461: 								</span>
462:                             </div>
463:                             <div class="bio-data">
464:                                 <ul class="list-unstyled small">
465: 									#if ($bio.get("year").length() > 0)
466:                                         <li tabindex="0" class="p-0 m-0"><span class="font-weight-bold fw-bold">Class:</span> $bio.get("year")</li>
467: 									#end
468: 									#if ($bio.get("height").length() > 0)
469:                                         <li tabindex="0" class="p-0 m-0"><span class="font-weight-bold fw-bold">Height:</span> $bio.get("height")</li>
470: 									#end
471: 									#if ($bio.get("bats_throws").length() > 0)
472:                                         <li tabindex="0" class="p-0 m-0"><span class="font-weight-bold fw-bold">B/T:</span> $bio.get("bats_throws")</li>
473: 									#end
474: 									#if ($bio.get("position").length() > 0)
475:                                         <li tabindex="0" class="p-0 m-0"><span class="font-weight-bold fw-bold">Position:</span> $bio.get("position")</li>
476: 									#end
477: 									#if ($bio.get("hometown").length() > 0)
478:                                         <li tabindex="0" class="p-0 m-0"><span class="font-weight-bold fw-bold">Hometown:</span> $bio.get("hometown")</li>
479: 									#end
480: 									#if ($bio.get("highschool").length() > 0)
481:                                         <li tabindex="0" class="p-0 m-0"><span class="font-weight-bold fw-bold">Highschool:</span> $bio.get("highschool")</li>
482: 									#end
483:                                     <li tabindex="0" class="p-0 m-0">
484: 										<ul class="list-group list-group-horizontal p-0 mt-2" tabindex="0">
485: 											#foreach ($brand in $socialBrands)
486: 												#if ($bio.get("$brand").length())
487: 													#set($link = $bio.get("$brand"))
488: 													<li class="list-group-item p-2">
489: 														#buildSocialLink($brand.toLowerCase(), $link, true, "")
490: 													</li>
491: 												#end
492: 											#end
493: 										</ul>
494: 									</li>
495: 
496: 								</ul>
497:                             </div>
498:                             <a href="$bioinfo.url" class="btn btn-primary full-bio font-weight-bold fw-bold btn-block text-center overflow-hidden">Full Bio</a>
499:                         </div>
500:                     </div>
501:                 </div>
502:             </div>
503: 		#end
504:     </div>
505: </div>
506: #end ## macro printHeadshotLayout
507: 
508: #if ($request.getParameter("ajax").length() > 0)
509: 
510: 	#if ($rosterLayout == "list")
511:     #printListLayout
512: 	#elseif ($rosterLayout == "headshot")
513:     #printHeadshotLayout
514: 	#end
515: 
516: 	$website.decorate("")
517: 
518: #else
519: <div class="page-content roster-content" data-module="bs-scripts/roster-layout" data-page-url="$page.url" data-page-title="$!page.title - ${website.profile.siteName}">
520: 
521: 
522: 	#set ($pageTitle = "Roster")
523: 	#if ($page.title.length() > 0)
524: 		#set ($pageTitle = $page.title)
525: 	#end
526: 	#if ($page.title.length() > 0)
527:         <h1 class="page-heading">$pageTitle</h1>
528: 	#end
529: 	$!request.setAttribute("pageTitle", "${pageTitle}")
530: 
531: 	$!request.setAttribute("pageDescription", "The official $pageDescription")
532: 
533:     #printBannerImage
534: 
535:     <div class="d-flex justify-content-between flex-column-reverse flex-md-row pt-3 border-top border-bottom my-3">
536:         #printViewButtons
537:         #printArchiveList
538:     </div>
539: 
540: 	#if ($rosterLayout == "list")
541: 
542: 		#if ($options.get("roster_sortable"))
543: 			#set ($rosterSortablesString = $options.get("roster_sortable"))
544: 			#set ($rosterSortables = $rosterSortablesString.split(","))
545: 		#end
546: 
547: 		#set ($sortBy = "")
548: 		#set($sortBy = $request.getParameter("sort"))
549: 		#if ($sortBy.length() > 0)
550: 			#set ($headlines = $headlines.sortedBy($sortBy))
551: 		#end
552: 
553:         <div class="roster-data style-list">#printListLayout</div>
554: 
555: 	#elseif ($rosterLayout == "headshot")
556:         <div class="roster-data style-headshot">#printHeadshotLayout</div>
557: 
558: 	#end ## roster-layout
559: 
560: 	#set ($rosterFooter = "${page.url}-footer")
561: 	#if ($website.exists($rosterFooter))
562:         <div class="roster-footer" data-fetch="$rosterFooter">$website.include($rosterFooter)</div>
563: 	#end
564: </div> ## page-content
565: 
566: 	## GLOBAL ADS SERVER
567: 	#if ($website.ads.isAdvertisingEnabled('ROSTER'))
568: 		$website.includeAgain("global-adserver-slots?adSlot=roster")
569: 	#end
570: 
571: #end ## if ajax
572: 
573: <script type="text/javascript">
574:     $(".vm-btn").click(function(e){
575:         $('.player-card.flipped').removeClass('flipped');
576:         $(this).closest('.player-card').addClass('flipped');
577:         e.stopPropagation();
578:     });
579: 
580:     $(document).on("click", function(e) {
581:         if ($(e.target).is(".player-card") === false) {
582:             $(".player-card").removeClass("flipped");
583:         }
584:     });
585: 
586:     $(".card-back .close").click(function(){
587:         $(".player-card").removeClass("flipped");
588:     });
589: </script>