There was a problem with a Velocity script
Pagesports/mten/2024-25/players/bio-career-template
ErrorInvocation of method 'getOverall' in class com.prestosports.content.sport.stats.StatsSplitter threw exception java.lang.NullPointerException at ajiumwu7pgr4zqnssports/mten/2024-25/players/bio-career-template[line 42, column 24]
Page source:
1: ## PICK UP OPTIONS
2: $website.include("options")
3: #set ($options = $request.getAttribute("options"))
4: 
5: #set ($locale = "en_us")
6: #set ($locale = $options.get("locale"))
7: #set ($showCareer = $wiki.valid() && $seasons)
8: #if ("yes" == $options.get("stats_show_career") && $seasons)
9:     #set ($showCareer = "yes")
10: #end
11: 
12: #if ($locale == "en_us")
13:     #set ($defLabel = "Defense")
14: #elseif ($locale == "en_gb")
15:     #set ($defLabel = "Defence")
16: #end
17: 
18: #set ($pos = "")
19: #if($attributes.get("position_stat"))
20:     #set ($pos = $attributes.get("position_stat"))
21: #else
22:     #set ($pos = $attributes.get("position"))
23:     #set ($pos = $statPosition)
24:     #set ($posVec = $pos.split("/"))
25:     #set ($pos = $posVec[0])
26: #end
27: #set ($pos = $pos.toLowerCase())
28: #set ($pos = $positions.get($pos))
29: 
30: #set ($highlights = $highlights.get($pos))
31: #if ($request.getParameter("pos"))
32:     #set ($pos = $request.getParameter("pos"))
33:     #set ($pos = $pos.toLowerCase())
34:     #set ($pos = $positions.get($pos))
35: #end
36: #set ($labels = $labels.get($pos))
37: #set ($briefs = $briefs.get($pos))
38: #set ($gamelogs = $gamelogs.get($pos))
39: #set ($view = $!request.getParameter("view"))
40: #set ($url = ${page.url})
41: #set ($playerId = $attributes.get("playerId"))
42: #set ($stats = $splits.overall)
43: 
44: ## CAREER STATS WILL PRINT LIKE THIS
45: #macro(splitBioCareer $label $stats $class)
46:     #set ($url = "${page.url}?view=career")
47:     #if ($request.getParameter("pos"))
48:       #set ($escPos = $request.getParameter("pos"))
49:       #set ($escPos = $tool.esc.url($escPos))
50:       #set ($url = "${url}&pos=$escPos")
51:     #end
52:     <tr class="$!{class}">
53:         <td class="pinned-col"><a href="${url}">${label}</a></td>
54:         #foreach ($brief in $briefs.keySet())
55:             #set ($value = "-")
56:             #set ($value = $!formatter.formatNumber($stats.get($brief), $formats.get($brief)))
57:             <td align="center">
58:                 #if ($value.length() > 0)$value#else - #end
59:             </td>
60:         #end
61:     </tr>
62: #end
63: 
64: #set ($name = $request.getParameter("name"))
65: $request.getAttribute("careerTotals").addGames($events)
66: $!request.getAttribute("careerMap").put($name, $stats)
67: 
68: #if ($request.getParameter("print") == 'yes')
69:     #splitBioCareer($name, $splits.overall, '')
70: #end

There was a problem with a Velocity script
Pagesports/mten/2024-25/bios/bio-template
ErrorInvocation of method 'getOverall' in class com.prestosports.content.sport.stats.StatsSplitter threw exception java.lang.NullPointerException at ajiumwu7pgr4zqnssports/mten/2024-25/bios/bio-template[line 48, column 24]
Page source:
1: <script src="${website.cdn("/info/klass.min.js")}"></script>
2: 
3: ## PICK UP OPTIONS
4: $website.include("options")
5: #set ($options = $request.getAttribute("options"))
6: #set ($locale = "en_us")
7: #set ($locale = $options.get("locale"))
8: 
9: ## HACK TO GET STATS URL FROM RENDERER... NEEDS SERVER CHANGE
10: #set ($bioObject = $page.getDataAsObject())
11: #set ($statsURL = $bioObject.statsURL)
12: #if ($statsURL.length() > 0)
13:   $website.includeAgain("${statsURL}?tmpl=bio-stats-template")
14:   ## various settings to get the variables set
15:   #set ($events = $request.getAttribute("bio_events"))
16:   #set ($seasons = $request.getAttribute("bio_seasons"))
17:   #set ($career = $request.getAttribute("bio_career"))
18:   #set ($labels = $request.getAttribute("bio_labels"))
19:   #set ($briefs = $request.getAttribute("bio_briefs"))
20:   #set ($gamelogs = $request.getAttribute("bio_gamelogs"))
21:   #set ($splits = $request.getAttribute("bio_splits"))
22:   #set ($statPosition = $request.getAttribute("bio_position"))
23:   #set ($positions = $request.getAttribute("bio_positions"))
24:   #set ($playerId = $request.getAttribute("bio_player_id"))
25:   #set ($highlights = $request.getAttribute("bio_highlights"))
26:   #set ($formats = $request.getAttribute("bio_formats"))
27:   #set ($gamelogsCategoriesLabels = $request.getAttribute("bio_gamelogs_labels"))
28:   #set ($briefsCategoriesLabels = $request.getAttribute("bio_briefs_labels"))
29:   #set ($gamesResults = $request.getAttribute("bio_games_results"))
30:   #set ($monthsPlayed = $request.getAttribute("bio_months_played"))
31:   #set ($rosterTransactions = $request.getAttribute("roster_transactions"))
32: #end
33: 
34: #set ($pos = "")
35: #if($attributes.get("position_stat"))
36:     #set ($pos = $attributes.get("position_stat"))
37: #else
38:     #set ($pos = $attributes.get("position"))
39:     #set ($pos = $statPosition)
40:     #set ($posVec = $pos.split("/"))
41:     #set ($pos = $posVec[0])
42: #end
43: #set ($pos = $pos.toLowerCase())
44: #set ($statPos = $positions.get($pos))
45: #set ($paramPos = $request.getParameter("pos"))
46: 
47: #set ($playerId = $attributes.get("playerId"))
48: #set ($stats = $splits.overall)
49: #set ($highlights = $highlights.get($statPos))
50: 
51: #set ($showHighlights = true)
52: #if ($options.get("bio_show_highlights") && $options.get("bio_show_highlights") == false)
53: 	#set ($showHighlights = false)
54: #end
55: 
56: #set ($enhancedLayout = false)
57: #if (($options.get("bio_enhanced_layout") == "yes") || ($request.getParameter("bio_enhanced_layout") == true))
58: 	#set ($enhancedLayout = true)
59: #end
60: 
61: #set ($showActionShots = true)
62: #if ($options.get("bio_show_action_shots") && $options.get("bio_show_action_shots") == false)
63: 	#set ($showActionShots = false)
64: #end
65: 
66: #set ($showDate = true)
67: #if ($options.get("news_layout_show_date") == "no")
68:     #set ($showDate = false)
69: #end
70: 
71: #set ($showLeadin = true)
72: #if ($options.get("news_layout_show_leadin") == "no")
73:     #set ($showLeadin = false)
74: #end
75: 
76: #set ($dateFormat = "MMMM dd, yyyy")
77: #if ($options.get("site_date_format").length() > 0) #set ($dateFormat = $options.get("site_date_format")) #end
78: 
79: #set ($thumbnail-orientation = "ratio ratio-16x9 ratio-adaptive")
80: #if ($options.get("news_thumbnail_orientation") == "portrait") ## default view from options
81:     #set ($thumbnail-orientation = "ratio ratio-3x4")
82: #elseif ($options.get("news_thumbnail_orientation") == "landscape")
83:     #set ($thumbnail-orientation = "ratio ratio-16x9")
84: #elseif ($options.get("news_thumbnail_orientation") == "adaptive")
85:     #set ($thumbnail-orientation = "embed-responsive-adaptive")
86: #elseif ($request.getParameter("thumbnail_orientation") == "portrait") ## default view from include parameter
87:     #set ($thumbnail-orientation = "ratio ratio-3x4")
88: #end
89: 
90: #set ($showThumb = true)
91: #if ($options.get("news_layout_show_thumb") == "no")
92:     #set ($showThumb = false)
93: #end
94: #set ($thumbWidth = 767)
95: 
96: #set ($actionShotsLimit = 5)
97: #set ($actionShotsLimit = $tool.math.toInteger($options.get("bio_action_shots_limit")))
98: 
99: #set ($showCareer = $wiki.valid() && $seasons)
100: #if ("yes" == $options.get("stats_show_career") && $seasons)
101:   #set ($showCareer = true)
102: #end
103: 
104: #set ($hasEvents = $events.size() > 0)
105: #set ($hasSynopsis = $synopsis.trim().length() > 0)
106: #set ($htmlStatsURL = "${page.url}-stats")
107: #set ($hasHTMLStats = $website.exists($htmlStatsURL))
108: #set ($bioBriefURL = "${page.url}-brief")
109: #set ($hasBioBrief = $website.exists("$bioBriefURL"))
110: #set ($showRoster = ($page.contentType == "loki/bio" && $page.headlinesFeatured.size() > 0) || ($page.contentType == "loki/bio-network" && $page.sectionPage.children.size() > 1))
111: #if ($options.get("bio_hide_roster") == true)
112:   #set ($showRoster = false)
113: #end
114: 
115: #if ($hasEvents)
116:     $request.setAttribute("icl-dataTables-script", true)
117: #end
118: 
119: #set ($view = "")
120: #if ($hasSynopsis || $hasBioBrief)
121:   #set ($view = "bio")
122: #elseif ($statsURL.length() > 0)
123:   #set ($view = "profile")
124: #elseif ($hasHTMLStats)
125:   #set ($view = "htmlstats")
126: #elseif ($releases.size() > 0)
127:   #set ($view = "news")
128: #elseif ($playerPhotos.size() > 0)
129:   #set ($view = "photos")
130: #elseif ($playerVideos.size() > 0)
131:   #set ($view = "videos")
132: #end
133: 
134: #if ($options.get("bio_default_view").length() > 0)
135:     #set ($checkView = $options.get("bio_default_view"))
136: #else
137:     ## THIS ESTABLISHES A DEFAULT TAB FOR NEW BOOTSTRAP THEMES
138:     #if ($hasSynopsis || $hasBioBrief)
139:         #set ($checkView = "bio")
140:     #elseif ($statsURL.length() > 0)
141:         #set ($checkView = "profile")
142:     #elseif ($releases.size() > 0)
143:         #set ($checkView = "news")
144:     #end
145: #end
146: 
147: #if ($request.getParameter("view"))
148:   #set ($checkView = $request.getParameter("view"))
149: #end
150: 
151: #if ($checkView == "profile" && $statsURL.length() > 0)
152:   #set ($view = "profile")
153: #elseif ($checkView == "bio" && ($hasSynopsis || $hasBioBrief))
154:   #set ($view = "bio")
155: #elseif ($checkView == "gamelog" && $statsURL.length() > 0)
156:   #set ($view = "gamelog")
157: #elseif ($checkView == "career" && $showCareer)
158:   #set ($view = "career")
159: #elseif ($checkView == "splits" && $statsURL.length() > 0)
160:   #set ($view = "splits")
161: #elseif ($checkView == "htmlstats" && $hasHTMLStats)
162:   #set ($view = "htmlstats")
163: #elseif ($checkView == "news" && $releases.size() > 0)
164:   #set ($view = "news")
165: #elseif ($checkView == "photos" && $playerPhotos.size() > 0)
166:   #set ($view = "photos")
167: #elseif ($checkView == "videos" && $playerVideos.size() > 0)
168:     #set ($view = "videos")
169: #elseif ($checkView == "weplayed")
170:     #set ($view = "weplayed")
171: #end
172: 
173: #macro (printResultAriaLabel $event)
174:     #set ($ariaLabel = "${event.sport} event: ${formatter.formatDate($event.date, 'MMMM d hh:mm a:')}")
175:     #if ($event.neutralSite.length() > 0 || $event.home)
176:     	#set ($ariaLabel = "${ariaLabel} vs.")
177:     #else
178:     	#set ($ariaLabel = "${ariaLabel} at")
179:     #end
180:     #set ($ariaLabel = "${ariaLabel} ${event.opponent.name}:")
181:     #if ($event.neutralSite.length() > 0)
182:     	#set ($ariaLabel = "${ariaLabel} @ ${event.neutralSite}:")
183:     #end
184:     #set ($ariaLabel = "${ariaLabel} Box Score")
185:     aria-label="$ariaLabel"
186: #end
187: 
188: #macro(playIcon $url)
189:     <a href="$url" class="play-btn video-btn-overlay" onclick="return(false);" onmouseup="return(false);">
190:         <span class="center-icon-pre">
191:             <span class="center-icon">
192:                 <span class="sr-only">Play Video</span>
193:                 <span class="fab fa-youtube"></span>
194:             </span>
195:         </span>
196:     </a>
197: #end
198: 
199: #macro (printVideo $article)
200:     #if ($article.contentType == "loki/youtube")
201:         #set ($videoID = $article.dataAsString)
202:         <img src="https://i3.ytimg.com/vi/${videoID}/maxresdefault.jpg" alt="video thumbnail for $article.thumbnailAlt" class="card-img-top img-fluid" />
203:         #playIcon($article.url)
204:     #end
205: 
206:     #if ($article.contentType == "loki/video")
207:     <video class="player" muted="true">
208:         <source src="${article.url}?dec=" type="video/mp4" />
209:     </video>
210:         #playIcon($article.url)
211:     #end
212: #end
213: 
214: ## ARTICLE MENTIONS MACRO
215: #macro (printReleases $items $type)
216:     <div class="cards news-layout grid bio-news-mentions">
217:         <div class="card-columns row">
218:             #foreach ($article in $items)
219: 
220:                 ## CATEGORY / TITLE
221:                 #set ($title = $article.title)
222:                 #set ($category = "Article")
223: 
224:                 #if($article.contentType == "loki/bio")
225:                     #set ($category = "Bio")
226:                 #elseif ($article.contentType == "video/x-flv" || $article.contentType == "loki/video" || $article.contentType == "loki/youtube")
227:                     #set ($category = "Video")
228:                 #end
229: 
230:                 #if ($article.url.startsWith("/sports/"))
231:                     #set ($sportKey = $article.url.split("/").get(2))
232:                     #if ($sportLabels.containsKey($sportKey))
233:                         #set ($category = $sportLabels.get($sportKey))
234:                     #end
235:                 #else
236:                     #set ($articleSection = $article.sectionPage)
237:                     #foreach ($i in [1..5])
238:                         #if ($articleSection.url.length() == 0)
239:                             #break
240:                         #elseif ($articleSection.sectionPage.url.length() == 0) ## if parent is a root section
241:                             #if ($articleSection.title.length() > 0)
242:                                 #set ($category = $articleSection.title)
243:                             #else
244:                                 #set ($firstChar = $articleSection.name.substring(0, 1).toUpperCase())
245:                                 #set ($afterFirstChars = $articleSection.name.substring(1))
246:                                 #set ($category = "${firstChar}${afterFirstChars}")
247:                             #end
248:                             #break
249:                         #end
250:                         #set ($articleSection = $articleSection.sectionPage)
251:                     #end
252:                 #end
253:                 ## END CATEGORY / TITLE
254: 
255:                 #set ($altText = $article.title)
256:                 #if ($article.thumbnailURL)
257:                     #if ($article.thumbnailPage.altText.length() > 0)
258:                         #set ($altText = "$article.thumbnailPage.altText")
259:                     #end
260:                 #end
261: 
262:                 #if ($article.thumbnailURL.length() > 0)
263:                     #set ($src = $article.thumbnailURL)
264:                 #elseif ($website.exists("/images/setup/default-thumbnail.png"))
265:                     #set ($src = "/images/setup/default-thumbnail.png")
266:                 #elseif ($website.exists("/images/setup/thumbnail_default.jpg"))
267:                     #set ($src = "/images/setup/thumbnail_default.jpg")
268:                 #else
269:                     #set ($src = "/info/images/default-thumbnail.png")
270:                 #end
271:                 #set ($thumbnailURL = "${src}?max_width=${thumbWidth}")
272: 
273:                 #set ($cardClass = "card")
274:                 #if ($velocityCount > $showSize)
275:                     #set ($cardClass = "card hidden")
276:                 #end
277: 
278:                 <div class="col-12 col-sm-6 col-md-4 col-lg-4 d-flex align-items-stretch">
279:                     <div class="${cardClass} border position-relative">
280:                         <div class="card-inner position-relative">
281:                             #if ($showThumb == true)
282:                                 <div class="thumb overflow-hidden card-img-top ${thumbnail-orientation}" style="background-image:url('${thumbnailURL}'); background-size:cover; background-position:center;">
283:                                     <img src="${thumbnailURL}" alt="${altText}" class="img-fluid" />
284:                                     #printVideo($article)
285:                                 </div>
286:                             #end
287:                             <div class="card-body border-top rounded-bottom bg-white">
288:                                 <div class="entry-body-header">
289:                                     <ul class="entry-meta list-unstyled d-flex align-items-center justify-content-between mb-2 text-muted">
290:                                         <li class="entry-category">$category</li>
291:                                         <li class="entry-header-date d-none d-lg-block hide-on-grid-view">
292:                                             <span class="small d-flex align-items-center">
293:                                                 <span class="fa fa-calendar-o"></span>
294:                                                 <span class="ms-2">$formatter.formatDate($article.date, $dateFormat)</span>
295:                                             </span>
296:                                         </li>
297:                                     </ul>
298:                                     <div class="card-title entry-title h4 mb-0">
299:                                         <a class="text-decoration-none stretched-link clamp-2" href="$article.url">$title</a>
300:                                     </div>
301:                                     #if ($showLeadin == true && $article.leadIn.length() > 0)
302:                                         <p class="card-text entry-summary clamp-3">$article.leadIn</p>
303:                                     #end
304:                                 </div>
305:                             </div>
306:                             #if ($showDate == true && $article.date)
307:                                 <div class="card-footer border-top rounded-bottom bg-white text-muted p-3">
308:                                     <ul class="list-unstyled d-flex align-items-center m-0">
309:                                         <li class="card-entry-date">
310:                                             <span class="small d-flex align-items-center">
311:                                                 <span class="fa fa-calendar-o"></span>
312:                                                 <span class="ms-2">$formatter.formatDate($article.date, $dateFormat)</span>
313:                                             </span>
314:                                         </li>
315:                                     </ul>
316:                                 </div>
317:                             #end
318:                         </div>
319:                     </div> ## card
320:                 </div>
321:             #end ## loop
322:         </div>
323:     </div>
324: #end ## printReleases
325: 
326: #macro (gamelogData $p)
327: 
328: #set ($p = $positions.get($p))
329: #set ($gamelogs = $gamelogs.get($p))
330: 
331: #if ($hasEvents)
332: <div class="stats-box full clearfix">
333:     <div class="table-responsive-via-datatables">
334:         <table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
335:             <thead class="thead-dark">
336:                 <tr>
337:                     <th scope="col">Date</th>
338:                     <th scope="col" class="text-start">Opponent</th>
339:                     <th scope="col" class="">Score</th>
340:                     #foreach ($gamelog in $gamelogs)
341:                       <th scope="col" class="text-uppercase text-center">$gamelog</th>
342:                     #end
343:                 </tr>
344:             </thead>
345:             <tbody>
346:                 #foreach ($event in $events)
347:                   <tr>
348:                     <td scope="row">$formatter.formatDate($event.event.date, "MMM d")</td>
349:                     <td class="text-start">
350:                       #if ($event.event.neutralSite.length() > 0) vs. #elseif (!$event.event.home) at #end
351:                       $event.event.opponent.name
352:                     </td>
353:                     <td class="">
354:                     #if ($event.event.statusCode >= 0)
355:                       #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
356:                           <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
357:                       #else
358:                       ${event.event.APResult}
359:                       #end
360:                     #else &nbsp; #end
361:                     </td>
362:                     #foreach ($gamelog in $gamelogs.keySet())
363:                       #set ($value = "-")
364:                       #set ($value = $formatter.formatNumber($event.stats.get($gamelog), $formats.get($gamelog)))
365:                       <td class="text-center">$value</td>
366:                     #end
367:                   </tr>
368:                 #end
369:             </tbody>
370:         </table>
371:     </div> ## table-responsive
372: </div> ## stats-box
373: #end
374: 
375: #end ## macro gamelogData
376: 
377: #macro (splitWithLabels $statPosBriefs $label $stats $rowSpan $colspan $rowSpanLabel)
378:     #if ($tool.math.toInteger($rowSpan) > 0)
379:         <tr class="group" data-rowspan="$rowSpan" data-colspan="$colspan">
380:             <td class="text-start">$rowSpanLabel</td>
381:             #foreach ( $i in [0..$tool.math.sub($colspan, 0)])
382:                 <td class="text-center">&nbsp;</td>
383:             #end
384:         </tr>
385:     #end
386:     <tr data-rowspan="$rowSpan" data-colspan="$colspan">
387:         <th scope="row" class="text-end">${label}</th>
388: 
389:         #if($rosterTransactions && $v == "career")
390:             #set($keys =  $stats.names())
391:             #set($array = $keys.toString().replace('"','').split(","))
392:             #foreach ($brief in $statPosBriefs.keySet())
393:                 #set ($value = "-")
394:                 #if($array.contains($brief))
395:                     #set ($value = $!formatter.formatNumber($tool.math.toDouble($stats.get($brief)), $formats.get($brief)))
396:                  #end
397:                 <td class="text-center">#if ($value.length() > 0) $value #else - #end</td>
398:             #end
399:         #else
400:             #foreach ($brief in $statPosBriefs.keySet())
401:                 #set ($value = "-")
402:                 #set ($value = $!formatter.formatNumber($stats.get($brief), $formats.get($brief)))
403:                 <td class="text-center">#if ($value.length() > 0) $value #else - #end</td>
404:             #end
405:         #end
406: 
407:     </tr>
408: #end
409: 
410: #macro (careerData $p)
411: #set ($p = $positions.get($p))
412: #set ($statPosBriefs = $briefs.get($p))
413: 
414: <div class="stats-box full clearfix">
415:     <div class="table-responsive-via-datatables table-responsive-webkit-overflow-scroll-fix">
416:         <table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
417:             <thead class="thead-dark">
418:                 <tr>
419:                     <th scope="col" class="pinned-col">&nbsp;</th>
420:                     #foreach ($brief in $statPosBriefs)
421:                         <th scope="col" class="text-center text-uppercase">$brief</th>
422:                     #end
423:                 </tr>
424:             </thead>
425:             <tbody>
426:                 #if($rosterTransactions)
427:                     #set ($seasonLength = $career.seasons.length())
428:                     #foreach ($index in [0..$tool.math.sub($seasonLength, 1)])
429:                         #set($season = $career.seasons[$index])
430:                         #if($season.seasonStatsURL != "null")
431:                             #set ($label = "<a href='${season.seasonStatsURL}?view=profile'>$season.seasonName.replaceAll('^[^0-9-]*','') - $season.team.teamName</a>")
432:                         #else
433:                             #set ($label = "$season.seasonName.replaceAll('^[^0-9-]*','') - $season.team.teamName ")
434:                         #end
435:                         #splitWithLabels($statPosBriefs, $label, $season.player.stats, "", "", "")
436:                     #end
437:                     #splitWithLabels($statPosBriefs, "Total", $career.totals, "", "", "")
438:                 #else
439:                     #set ($careerTotals = $request.getAttribute("careerTotals"))
440:                     #set ($careerMap = $request.getAttribute("careerMap"))
441:                     #foreach ($season in $seasons)
442:                         ## Check if we did not get stats for this season
443:                         #if ($careerMap.get($season.seasonName))
444:                             #set ($label = "<a href='${season.path}?view=profile'>$season.seasonName</a>")
445:                             #splitWithLabels($statPosBriefs, $label, $careerMap[$season.seasonName], "", "", "")
446:                         #elseif ($wiki.valid())
447:                             <tr>
448:                                 <td scope="row" class="text-end">
449:                                     ${season.seasonName}
450:                                     <span class="d-inline-block" tabindex="0" data-bs-toggle="tooltip" data-bs-placement="right" title="We could not find the 'players' page in the ${season.seasonName} section.">
451:                                         <span class="fa fa-light fa-circle-info"></span>
452:                                     </span>
453:                                 </td>
454:                                 #foreach ( $i in [0..$tool.math.sub($statPosBriefs.size(), 1)])
455:                                     <td class="text-center">&nbsp;</td>
456:                                 #end
457:                             </tr>
458:                         #end
459:                     #end
460:                     #splitWithLabels($statPosBriefs, "Total", $request.getAttribute("careerTotals").overall, "", "", "")
461:                 #end
462:             </tbody>
463:         </table>
464:     </div> ## table-responsive
465: </div> ## stats-box
466: 
467: #end ## macro careerData
468: 
469: #macro (splitsData $p)
470: 
471: #set ($p = $positions.get($p))
472: #set ($statPosBriefs = $briefs.get($p))
473: #set ($colspan = $tool.math.sub($statPosBriefs.size(), 1))
474: 
475: #if ($statPosBriefs.size() > 0)
476: <div class="stats-box full clearfix">
477:     <div class="table-responsive-via-datatables">
478:         <table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
479:             <thead class="thead-dark">
480:                 <tr data-colspan="$colspan">
481:                     <th scope="col">&nbsp;</th>
482:                     #foreach ($brief in $statPosBriefs)
483:                         <th scope="col" class="text-center text-uppercase">$brief</th>
484:                     #end
485:                 </tr>
486:             </thead>
487: 
488:             <tbody>
489:                 <tr class="group" data-colspan="$colspan">
490:                     <td class="text-start">Event</td>
491:                     #foreach ( $i in [0..$tool.math.sub($colspan, 0)])
492:                         <td class="text-center">&nbsp;</td>
493:                     #end
494:                 </tr>
495:                 #splitWithLabels($statPosBriefs, "Total", $splits.overall, "", "", "")
496:                 #splitWithLabels($statPosBriefs, "Conference", $splits.conference, "", "", "")
497:                 #splitWithLabels($statPosBriefs, "Exhibition", $splits.exhibition, "", "", "")
498: 
499:                 <tr class="group" data-colspan="$colspan">
500:                     <td class="text-start">Location</td>
501:                     #foreach ( $i in [0..$colspan])
502:                         <td class="text-center">&nbsp;</td>
503:                     #end
504:                 </tr>
505:                 #splitWithLabels($statPosBriefs, "Home", $splits.home, "", "", "")
506:                 #splitWithLabels($statPosBriefs, "Away", $splits.away, "", "", "")
507:                 #splitWithLabels($statPosBriefs, "Neutral", $splits.neutral, "", "", "")
508: 
509:                 #set ($rowSpan = $gamesResults.entrySet().size())
510:                 #set ($rowSpanLabel = "Result")
511: 
512:                 #foreach($gameResult in $gamesResults.entrySet())
513:                     #if ($gameResult.key == "wins")
514:                       #set ($splitGameResult = $splits.inWins)
515:                     #elseif ($gameResult.key == "losses")
516:                       #set ($splitGameResult = $splits.inLosses)
517:                     #elseif ($gameResult.key == "ties")
518:                       #set ($splitGameResult = $splits.inTies)
519:                     #end
520: 
521:                     #splitWithLabels($statPosBriefs, $gameResult.value, $splitGameResult, $rowSpan, $colspan, $rowSpanLabel)
522: 
523:                     #set ($rowSpan = "")
524:                 #end
525: 
526: 
527:             #if ($monthsPlayed and $monthsPlayed.size() > 0)
528: 
529:                     #set ($rowSpan = $monthsPlayed.size())
530:                     #set ($rowSpanLabel = "Month")
531: 
532:                     #foreach($month in $monthsPlayed)
533:                         #if ($month == 'January')
534:                           #set ($splitMonth = $splits.january)
535:                         #elseif ($month == 'February')
536:                           #set ($splitMonth = $splits.february)
537:                         #elseif ($month == 'March')
538:                           #set($splitMonth = $splits.march)
539:                         #elseif ($month == 'April')
540:                           #set($splitMonth = $splits.april)
541:                         #elseif ($month == 'May')
542:                           #set ($splitMonth = $splits.may)
543:                         #elseif ($month == 'June')
544:                           #set ($splitMonth = $splits.june)
545:                         #elseif ($month == 'July')
546:                           #set($splitMonth = $splits.july)
547:                         #elseif ($month == 'August')
548:                           #set ($splitMonth = $splits.august)
549:                         #elseif ($month == 'September')
550:                           #set($splitMonth = $splits.september)
551:                         #elseif ($month == 'October')
552:                           #set($splitMonth = $splits.october)
553:                         #elseif ($month == 'November')
554:                           #set ($splitMonth = $splits.november)
555:                         #elseif ($month == 'December')
556:                           #set($splitMonth = $splits.december)
557:                         #end
558: 
559:                         #splitWithLabels($statPosBriefs, $month, $splitMonth, $rowSpan, $colspan, $rowSpanLabel)
560: 
561:                         #set ($rowSpan = "")
562: 
563:                     #end ## foreach
564: 
565:             #end
566:             </tbody>
567:         </table>
568:     </div> ## table-responsive
569: </div> ## stats-box
570: #end
571: 
572: #end ## macro splitsData
573: 
574: #macro (printRecentGames)
575: #if ($hasEvents)
576:     <div class="table-responsive-via-datatables">
577:         <table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
578:             <thead class="thead-dark">
579:                 <tr>
580:                     <th scope="col text-start">Date</th>
581:                     <th scope="col text-start">Opponent</th>
582:                     <th scope="col">Result</th>
583:                 </tr>
584:             </thead>
585:             <tbody>
586:                 #set ($eventEnd = -1)
587:                 #foreach ($event in $events)
588:                   #if ($event.event.result.resolved)
589:                     #set ($eventEnd = $velocityCount)
590:                   #end
591:                 #end
592: 
593:                 #set ($eventStart = $eventEnd - 5)
594:                 #if ($eventStart < 0) #set ($eventStart = 0) #end
595: 
596:                 #foreach ($event in $events)
597:                     #if ($velocityCount >= $eventStart and $velocityCount <= $eventEnd)
598:                         <tr>
599:                             <td scope="row" class="text-start">$formatter.formatDate($event.event.date, "MMM d")</td>
600:                             <td class="text-start">
601:                                 #if ($event.event.neutralSite.length() > 0) vs.
602:                                 #elseif (!$event.event.home) at
603:                                 #else ## nothing for a home game
604:                                 #end
605:                                 $event.event.opponent.name
606:                             </td>
607:                             <td>
608:                                 #if ($event.event.statusCode >= 0)
609:                                     #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
610:                                         <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
611:                                     #else
612:                                         ${event.event.APResult}
613:                                     #end
614:                                 #end
615:                             </td>
616:                         </tr>
617:                     #end ## if
618:                 #end
619:             </tbody>
620:         </table>
621:     </div>
622: #end
623: #end ## macro printRecentGames
624: 
625: #macro (printCategories $briefCategoryLabels $v $ariaLabel)
626:     <div class="$classTabPaneContent has-child-tabs">
627:         <div class="d-flex flex-row text-nowrap align-items-center justify-content-center">
628:             <div class="secondary-tab-select-container flex-fill">
629:                 <select class="tab-nav-select-helper form-select" id="bio-tabs-${v}-select" aria-label="Choose a stat group">
630:                     #foreach($briefCat in $briefCategoryLabels.entrySet())
631:                         #set ($briefCatLabel = $briefCat.value)
632:                         #set ($briefCatKey = $briefCat.key)
633:                         #if ($locale == "en_gb" && $briefCatLabel == "Defense")
634:                             #set ($briefCatLabel = "Defence")
635:                         #end
636:                         <option value="#${v}-tab-pos-${briefCatKey}-content" #if ($pos == $briefCat.key || $foreach.first) selected #end>${briefCatLabel}</option>
637:                     #end
638:                 </select>
639:                 <script>
640:                     $('.tab-nav-select-helper').on('change', function(e) {
641:                         var id = $(this).val();
642:                         $('a[data-bs-target="' + id + '"]').tab('show');
643:                     });
644:                 </script>
645:             </div>
646:         </div>
647:         <div class="$classBioTabChildrenWrapper" data-momentum="false">
648:             <ul class="$classBioTabChildren" id="bio-tabs-${v}" role="tablist">
649:                 #foreach($briefCat in $briefCategoryLabels.entrySet())
650:                     #set ($briefCatLabel = $briefCat.value)
651:                     #set ($briefCatKey = $briefCat.key)
652:                     #if ($locale == "en_gb" && $briefCatLabel == "Defense")
653:                         #set ($briefCatLabel = "Defence")
654:                     #end
655:                     <li class="nav-item flex-fill flex-md-grow-0 flex-md-shrink-0">
656:                         <a data-bs-toggle="tab" id="${v}-tab-pos-${briefCatKey}" class="nav-link#if ($activePos == $briefCatKey) active#end" data-bs-target="#${v}-tab-pos-${briefCatKey}-content" href="${page.url}?view=${v}&pos=${briefCatKey}" aria-label="${ariaLabel}: ${briefCatLabel}">${briefCatLabel}</a>
657:                     </li>
658:                 #end
659:             </ul>
660:         </div>
661:         <div class="tab-content" id="${v}-tab-content">
662:             #foreach ($briefCat in $briefCategoryLabels.entrySet())
663:                 #set ($briefCatLabel = $briefCat.value)
664:                 #set ($briefCatKey = $briefCat.key)
665:                 #set ($class = "tab-panel")
666:                 #if ($briefCat.key == $activePos)
667:                    #set ($class = "tab-panel active show")
668:                 #end
669:                 <div class="tab-pane fade ${class}" id="${v}-tab-pos-${briefCatKey}-content" role="tabpanel" aria-labelledby="${v}-tab-pos-${briefCatKey}">
670:                     <div class="stats-wrap $classTabPaneContentChild">
671:                         #if ($v == "splits")
672:                             #splitsData($briefCat.key)
673:                         #elseif ($v == "career")
674:                             #careerData($briefCat.key)
675:                         #end
676:                         <caption><p class="text-muted small">$ariaLabel: $briefCatLabel</p></caption>
677:                     </div>
678:                 </div>
679:             #end
680:         </div>
681:     </div>
682: #end ## macro printCategories
683: 
684: #macro (printHeadshot)
685:         #if ($enhancedLayout)
686:             #set ($classPlayerPhoto = "img-fluid img-thumbnail")
687:         #else
688:             #set ($classPlayerPhoto = "img-fluid h-auto")
689:         #end
690: 
691:         #if ($headshot.url)
692:             #set ($src = $headshot.url)
693:         #elseif ($website.exists("/images/setup/default-headshot.png"))
694:             #set ($src = "/images/setup/default-headshot.png")
695:         #elseif ($website.exists("/images/setup/headshot_default.jpg"))
696:             #set ($src = "/images/setup/headshot_default.jpg")
697:         #else
698:             #set ($src = "/info/images/default-headshot.png")
699:         #end
700: 
701:         #if ($src.trim().length() > 0)
702:             <img src="$src?max_width=510&max_height=600" class="$classPlayerPhoto" alt="$fullName" />
703:         #end
704: #end ## macro printHeadshot
705: 
706: #set ($socialBrands = ["facebook", "twitter", "instagram", "youtube", "twitch", "tiktok", "nil"])
707: 
708: #macro (buildSocialLink $brand $handle $icons $class)
709:     #if($brand == "facebook")
710:         #set($socialHost = "https://www.facebook.com")
711:     #elseif($brand == "twitter")
712:         #set($socialHost = "https://twitter.com")
713:     #elseif($brand == "instagram")
714:         #set($socialHost = "https://www.instagram.com")
715:     #elseif($brand == "tikTok")
716:         #set($socialHost = "https://www.tiktok.com")
717:     #elseif($brand == "tiktok")
718:         #set($socialHost = "https://www.tiktok.com")
719:     #elseif($brand == "twitch")
720:         #set($socialHost = "https://www.twitch.tv")
721:     #elseif($brand == "youtube")
722:         #set($socialHost = "https://www.youtube.com")
723:     #elseif($brand == "nil")
724:         #set($socialHost = "") ## We cannot define a host because the data entry can accept all NIL host services. Opendorse, Influencer, Fanatics, etc.
725:     #end
726: 
727:     #if($socialHost.length() > 0 )
728:         #set($url = "${socialHost}/${handle}")
729:     #elseif($brand == "nil")
730:         #set($url = "${handle}")
731:     #else
732:         #set($url = "")
733:     #end
734: 
735:     #set($icons = $Boolean.parseBoolean($icons))
736:     #if($icons == true)
737:         <a href="$url" class="$class" target="_blank"><span aria-label="$brand" class="#if($brand == 'nil')fa-kit #else fa fa-brands #end #if($brand == 'twitter') fa-x-twitter #else fa-$brand.toLowerCase() #end"></span></a>
738:     #else
739:         <a href="$url" class="$class" target="_blank">$handle</a>
740:     #end
741: #end
742: 
743: #macro(playerHeading)
744:     <div class="player-heading h3 bg-primary d-flex align-content-stretch text-white position-relative z-index-1">
745:         #if ($!attributes.get("number").length() > 0)<span class="number bg-secondary inline-block text-white p-3">$!attributes.get("number")</span>#end
746:         <span class="name inline-block w-100 flex-grow-1 p-3">$fullName</span>
747:         <span class="social-handle-link inline-block p-3">
748:             <ul class="d-flex align-content-center h-100 gap-3 list-unstyled m-0">
749:                 #foreach ($field in $fields)
750:                     #if ($socialBrands.contains($field.key.toLowerCase()) && $attributes.get($field.key).length() > 0)
751:                         <li class="d-flex flex-column align-content-center justify-content-center">
752:                             #buildSocialLink($field.value.toLowerCase(), $!attributes.get($field.key), true, "btn btn-lg btn-link text-white p-0")
753:                         </li>
754:                     #end
755:                 #end
756:             </ul>
757:         </span>
758:     </div>
759: #end
760: 
761: #macro (printBioInfo)
762:     #if ($enhancedLayout)
763:         #set ($classListItems = "col-12 col-lg-6 px-3")
764:         #set ($classListItems = "col-12 col-lg-6 px-3")
765:         #set ($definitionListItems = "border-bottom m-0 p-2 h-100")
766:     #else
767:         #set ($classListItems = "col-12 px-2")
768:         #set ($definitionListItems = "d-flex flex-row border-bottom m-0 p-2")
769:     #end
770: 
771: #if ($enhancedLayout)
772:     #playerHeading
773: #end
774: 
775:     <div class="roster-player-fields">
776:         <ul class="d-flex flex-row flex-wrap justify-content-between list-unstyled">
777:             #foreach ($i in [1..10])
778:                 #set ($stickyKey = "bio_custom${i}_sticky")
779:                 #if ($options.get($stickyKey).length() > 0 && $attributes.get("custom${i}").length() > 0)
780:                     <li class="$classListItems bio-field-custom-sticky">
781:                         <dl class="${definitionListItems}">
782:                             <dt class="label p-0 me-2">$options.get($stickyKey): </dt>
783:                             <dd class="value p-0 m-0 text-muted">$!attributes.get("custom${i}")</dd>
784:                         </dl>
785:                     </li>
786:                 #end
787:             #end
788: 
789:             #foreach ($field in $fields)
790:                 #if (!$field.key.startsWith("custom"))
791:                     #if ($attributes.get($field.key).length() > 0 && ($field.key != "first_name" && $field.key != "last_name" && $field.key != "number" && $field.key != "full_name"))
792:                         #if ($field.key == "phone1" || $field.key == "phone2")
793:                             <li class="$classListItems bio-field-standard">
794:                                 <dl class="${definitionListItems}">
795:                                     <dt class="label p-0 me-2 d-inline">Phone: </dt>
796:                                     <dd class="value p-0 m-0 d-inline text-muted">$!attributes.get($field.key)</dd>
797:                                 </dl>
798:                             </li>
799:                         #elseif ($field.key == "email_address")
800:                             <li class="$classListItems bio-field-standard">
801:                                 <dl class="${definitionListItems}">
802:                                     #set ($emailAdd = $attributes.get($field.key))
803:                                     <dt class="label p-0 me-2 d-inline">Email: </dt>
804:                                     <dd class="value p-0 m-0 text-truncate d-inline text-muted"><a href="mailto:${emailAdd}">$emailAdd</a></dd>
805:                                 </dl>
806:                             </li>
807:                         #elseif ($field.key == "weight_class")
808:                             <li class="$classListItems bio-field-standard">
809:                                 <dl class="${definitionListItems}">
810:                                     <dt class="label p-0 me-2 d-inline">Class: </dt>
811:                                     <dd class="value p-0 m-0 d-inline text-muted">$!attributes.get($field.key)</dd>
812:                                 </dl>
813:                             </li>
814:                         #elseif ($socialBrands.contains($field.value.toLowerCase()))
815:                             <li class="$classListItems bio-field-standard">
816:                                 <dl class="${definitionListItems}">
817:                                     <dt class="label p-0 me-2 d-inline">$field.value: </dt>
818:                                     <dd class="value p-0 m-0  d-inline text-muted">#buildSocialLink($field.value.toLowerCase(), $!attributes.get($field.key), false, "")</dd>
819:                                 </dl>
820:                             </li>
821:                         #elseif ($field.key != "position_abbr")
822:                             <li class="$classListItems bio-field-standard">
823:                                 <dl class="${definitionListItems}">
824:                                     <dt class="label p-0 me-2 d-inline">$field.value: </dt>
825:                                     <dd class="value p-0 m-0  d-inline text-muted">$!attributes.get($field.key)</dd>
826:                                 </dl>
827:                             </li>
828:                         #end
829:                     #end
830:                 #end
831:             #end
832: 
833:             #foreach ($i in [1..10])
834:               #set ($customKey = "bio_custom${i}")
835:               #if ($options.get($customKey).length() > 0 && $attributes.get("custom${i}"))
836:                 <li class="$classListItems bio-field-custom">
837:                     <dl class="${definitionListItems}">
838:                         <dt class="label p-0 me-2 d-inline">$options.get($customKey): </dt>
839:                         <dd class="value p-0 m-0 d-inline text-muted">$!attributes.get("custom${i}")</dd>
840:                     </dl>
841:                 </li>
842:               #end
843:             #end
844:         </ul>
845:     </div>
846: #end ## macro printBioInfo
847: 
848: #macro (printActionShots)
849: #if ($showActionShots)
850:     ## FILTERS OUT THE NUMBER OF ACTION PHOTOS
851:     #set ($totalPhotoAvaiable = $playerPhotos.size())
852:     #set ($playerPhotosFiltered = $playerPhotos)
853:     #if ($actionShotsLimit < $totalPhotoAvaiable)
854:         #set ($playerPhotosFiltered = $playerPhotos.subList(0, $actionShotsLimit))
855:     #end
856:     #set ($playerPhotosFiltered = $tool.sorter.sort($playerPhotosFiltered, "lastUpdated:desc"))
857:     <div class="action-shots clearfix mb-md-n5 d-none d-sm-none d-md-block">
858:         <div id="action-shots-carousel" class="carousel slide carousel-fade" data-bs-interval="12000" data-bs-ride="carousel">
859:             <ol class="carousel-indicators pb-sm-3 mb-sm-5">
860:                 #foreach($photo in $playerPhotosFiltered)
861:                     <li data-bs-target="#action-shots-carousel" data-bs-slide-to="$foreach.index" class="#if ($foreach.index == 0)active#end"></li>
862:                 #end
863:             </ol>
864:             <div class="carousel-inner">
865:                 #foreach($photo in $playerPhotosFiltered)
866:                     #set ($imgAlt = "Large featured action photo of $fullName - Image $foreach.count")
867:                     #if ($photo.altText.length() > 0)
868:                         #set ($imgAlt = $photo.altText)
869:                     #elseif( $photo.title.length() > 0 )
870:                         #set ($imgAlt = $photo.title)
871:                     #end
872:                     <div class="carousel-item#if ($foreach.index == 0) active#end">
873:                         <img src="${photo.url}?max_width=1200" alt="$imgAlt" class="d-block w-100" data-lastupdated="$photo.lastUpdated" />
874:                     </div>
875:                 #end
876:             </div>
877:         </div>
878:     </div>
879: #end
880: #end ## macro printActionShots
881: 
882: #macro (printHighlights)
883: #if ($highlights && $showHighlights)
884:     <div class="roster-bio-highlights bg-white text-dark w-100">
885:         <ul class="d-flex flex-row flex-wrap justify-content-between list-unstyled m-0">
886:             #foreach ($highlight in $highlights.keySet())
887:                 #set ($value = "-")
888:                 #set ($value = $formatter.formatNumber($stats.get($highlight), $formats.get($highlight)))
889:                 <li class="flex-fill text-center border border">
890:                     <dl class="stat d-block m-0 p-3">
891:                         <dt class="d-block label p-0 m-0 text-uppercase fw-normal small text-muted">$!highlights.get($highlight)</dt>
892:                         <dd class="d-block value p-0 m-0 fs-5 fw-bold lh-1">$value</dd>
893:                     </dl>
894:                 </li>
895:             #end
896:         </ul>
897:     </div>
898: #end
899: #end ## macro printHighlights
900: 
901: #macro (printRoster)
902: #if ($enhancedLayout)
903:     $website.includeAgain("${page.url}?tmpl=roster-switcher-template&id=roster-list")
904: #else
905:     #set ($id = "roster-switcher")
906:     #if ($request.getParameter("id").length() > 0)
907:         #set ($id = $request.getParameter("id"))
908:     #end
909: 
910:     #if ($page.contentType == "loki/bio")
911:         #set ($headlinesFeaturedSize = 0)
912:         #foreach ($featuredPage in $page.headlinesFeatured)
913:             #if ($featuredPage.contentType == "loki/headlines")
914:                 #set ($headlinesFeaturedSize = $headlinesFeaturedSize + 1)
915:             #end
916:         #end
917:         #if ($headlinesFeaturedSize > 0)
918:             <div id="$id" class="float-sm-end roster-switcher-template">
919:                 <span class="input-group">
920:                     <span class="input-group-text" id="${id-options}-group-text">Related Bios</span>
921:                     <select class="form-select" id="$id-options" aria-describedby="${id-options}-group-text" onchange="location=this.value;">
922:                         #foreach ($featuredPage in $page.headlinesFeatured)
923:                             #if ($featuredPage.contentType == "loki/headlines")
924:                                 $website.includeAgain("${featuredPage.url}?tmpl=roster-list-template&current_url=${page.url}")
925:                             #end
926:                         #end
927:                     </select>
928:                 </div>
929:             </div>
930:         #end
931:     #elseif ($page.contentType == "loki/bio-network")
932:         #set ($relatedPlayers = $page.sectionPage.children)
933:         #set ($teamNames = {})
934:         #foreach ($relatedPlayer in $relatedPlayers)
935:             #if ($relatedPlayer.contentType == "loki/bio-network")
936:                 #set ($relatedPlayerObj = $relatedPlayer.getDataAsObject().getAttributes())
937:                 #set ($teamName = $relatedPlayerObj.get("team"))
938:                 #if ($teamName.length() > 0)
939:                     #if (!$teamNames.containsValue($teamName))
940:                         $!teamNames.put($tool.math.add($teamNames.size(), 1), $teamName)
941:                     #end
942:                 #end
943:             #end
944:         #end
945:         <div id="$id" class="float-sm-end roster-switcher-template">
946:             <div class="input-group">
947:                 <span class="input-group-text" id="${id-options}-group-text">Related Bios</span>
948:                 <select class="form-select" id="$id-options" aria-describedby="${id-options}-group-text" onchange="location=this.value;">
949:                     #foreach ($i in [1..$teamNames.size()])
950:                         #if ($teamNames.size() > 1)
951:                             <optgroup label="$teamNames.get($i)">
952:                         #end
953: 
954:                         #foreach ($relatedPlayer in $relatedPlayers)
955:                             #if ($relatedPlayer.contentType == "loki/bio-network")
956:                                 #set ($relatedPlayerObj = $relatedPlayer.getDataAsObject().getAttributes())
957:                                 #set ($teamName = $relatedPlayerObj.get("team"))
958:                                 #if ($teamName.length() > 0 && $teamName == $teamNames.get($i))
959:                                     #set ($playerFirstName = $relatedPlayerObj.get("first_name"))
960:                                     #set ($playerLastName = $relatedPlayerObj.get("last_name"))
961:                                     <option value="$relatedPlayer.url" #if ($page.url == $relatedPlayer.url)selected#end>${playerFirstName} ${playerLastName}</option>
962:                                 #end
963:                             #end
964:                         #end
965: 
966:                         #if ($teamNames.size() > 1)
967:                             </optgroup>
968:                         #end
969:                     #end
970:                 </select>
971:             </div>
972:         </div>
973:     #end
974: #end ## enhancedLayout check
975: #end ## macro printRoster
976: 
977: ################################################## END MACROS  #############################################################
978: 
979: #if ($attributes.get("full_name").length() > 0)
980:   #set ($fullName = $attributes.get("full_name"))
981: #else
982:   #set ($firstName = $!attributes.get("first_name"))
983:   #set ($lastName = $!attributes.get("last_name"))
984:   #set ($fullName = "${firstName} ${lastName}")
985: #end
986: 
987: #set ($pageTitle = "")
988: #if($request.getAttribute("pageTitle").length() > 0)
989:         #set ($pageTitle = $request.getAttribute("pageTitle"))
990: #end
991: #if ($page.title.length() > 0)
992:         #set ($pageTitle = $!page.title)
993: #end
994: $!request.setAttribute("pageTitle", "${pageTitle}")
995: 
996: #set ($actionShots = false)
997: #if ($enhancedLayout && $playerPhotos.size() > 0)
998:   #set ($actionShots = true)
999: #end
1000: 
1001: #if ($enhancedLayout)
1002:     #set ($classRoot = "bio-enhanced")
1003:     #if ($actionShots && $showActionShots)
1004:           #set ($classRoot = "${classRoot} action")
1005:     #else
1006:           #set ($classRoot = "${classRoot} plain")
1007:     #end
1008:     #set ($classCard = "bg-light p-3 col-sm-12 pt-md-0")
1009:     #set ($classBody = "col-sm-12")
1010:     #set ($classBioTabParentsWrapper = "nav-tabs-wrapper position-relative pt-3")
1011:     #set ($classBioTabParents = "nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3")
1012:     #set ($classBioTabChildrenWrapper = "nav-tabs-wrapper position-relative py-3 border-bottom d-none")
1013:     #set ($classBioTabChildren = "nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3")
1014:     #set ($classTabPaneContent = "tab-pane-contents p-3 border border-top-0")
1015:     #set ($classTabPaneContentChild = "tab-pane-contents p-0")
1016: #else
1017:     #set ($classRoot = "bio-wrap")
1018:     #set ($classCard = "mb-5 p-3 col-lg-4 col-xl-3 bg-white")
1019:     #set ($classBody = "col-lg-8 col-xl-9 py-3")
1020:     #set ($classBioTabParentsWrapper = "nav-tabs-wrapper position-relative tab-nav")
1021:     #set ($classBioTabParents = "nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3")
1022:     #set ($classBioTabChildrenWrapper = "nav-tabs-wrapper position-relative tab-nav d-none")
1023:     #set ($classBioTabChildren = "nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3")
1024:     #set ($classTabPaneContent = "tab-pane-contents p-3 border border-top-0")
1025:     #set ($classTabPaneContentChild = "tab-pane-contents p-0")
1026: 
1027: #end
1028: 
1029: ## FULL ROSTER
1030: <div class="${classRoot} #if ($highlights) bio-wrap-has-highlights #end clearfix">
1031: 
1032: ## RELATED BIOS
1033: #if ($showRoster)
1034:   <div class="related-bios clearfix mb-3">#printRoster</div>
1035: #end
1036: 
1037: #if ($actionShots)
1038:   #printActionShots
1039: #end
1040: #if ($enhancedLayout)
1041: #else
1042:     #playerHeading
1043: #end
1044: 
1045: <div class="roster-bio-container">
1046:     <div class="row">
1047:         <div class="bio-card ${classCard}">
1048:             <div class="player-about clearfix">
1049:                 #if ($enhancedLayout)
1050:                     <div class="row no-gutters g-0">
1051:                         <div class="col-md-4 col-lg-3">
1052:                             <div class="player-headshot text-center position-relative z-index-1 mt-md-n5">#printHeadshot</div>
1053:                         </div>
1054:                         <div class="col-md-8 col-lg-9">
1055:                             <div class="player-info">#printBioInfo</div>
1056:                             <div class="mt-3 mx-3 w-100">
1057:                                 #printHighlights
1058:                             </div>
1059:                         </div>
1060:                     </div>
1061:                 #else
1062:                     <div class="row">
1063:                         <div class="col-md-4 col-lg-12">
1064:                             <div class="player-headshot text-center position-relative z-index-1 mb-3">
1065:                                 <div class="overflow-hidden img-thumbnail">
1066:                                     #printHeadshot
1067:                                 </div>
1068:                             </div>
1069:                         </div>
1070:                         <div class="col-md-8 col-lg-12">
1071:                             <div class="player-info mb-3">#printBioInfo</div>
1072:                         </div>
1073:                     </div>
1074:                 #end
1075:             </div>
1076:         </div> ## bio-card
1077: 
1078:         #if ($view.length() > 0)
1079:             $request.setAttribute("icl-responsive-tabs-script", true)
1080: 
1081:             <div class="bio-body ${classBody}">
1082: 
1083:                 <div class="d-flex flex-column align-items-center justify-content-start gap-3">
1084:                     #if (!$enhancedLayout) #printHighlights #end
1085:                     <div class="tab-container w-100">
1086:                         #if ($statsURL.length() > 0 || $hasHTMLStats || $releases.size() > 0|| $playerPhotos.size() > 0 || $playerVideos.size() > 0)
1087:                             <div class="$classBioTabParentsWrapper">
1088:                                 <ul class="$classBioTabParents" id="bio-tabs-parents" role="tablist">
1089:                                     #if ($hasSynopsis || $hasBioBrief)
1090:                                         <li class="nav-item">
1091:                                             <a data-bs-toggle="tab" id="bio-tab" class="nav-link #if ($view == "bio") active#end" data-bs-target="#bio" href="${page.url}?view=bio">Bio</a>
1092:                                         </li>
1093:                                     #end
1094: 
1095:                                     #if ($statsURL.length() > 0)
1096:                                         <li class="nav-item">
1097:                                             <a data-bs-toggle="tab" id="profile-tab" class="nav-link#if ($view == "profile") active#end" data-bs-target="#profile" href="${page.url}?view=profile">Player Profile</a>
1098:                                         </li>
1099:                                         <li class="nav-item">
1100:                                             <a data-bs-toggle="tab" id="gamelog-tab" class="nav-link#if ($view == "gamelog") active#end" data-bs-target="#gamelog" href="${page.url}?view=gamelog">Game Log</a>
1101:                                         </li>
1102:                                         #if ($showCareer)
1103:                                             <li class="nav-item">
1104:                                                 <a data-bs-toggle="tab" id="career-tab" class="nav-link#if ($view == "career") active#end" data-bs-target="#career" href="${page.url}?view=career">Career Stats</a>
1105:                                             </li>
1106:                                         #end
1107:                                         <li class="nav-item">
1108:                                             <a data-bs-toggle="tab" id="splits-tab" class="nav-link#if ($view == "splits") active#end" data-bs-target="#splits" href="${page.url}?view=splits">Split Stats</a>
1109:                                         </li>
1110:                                     #end
1111: 
1112:                                     #if ($hasHTMLStats)
1113:                                         <li class="nav-item">
1114:                                             <a data-bs-toggle="tab" id="htmlstats-tab" class="nav-link#if ($view == "htmlstats") active#end" data-bs-target="#htmlstats" href="${page.url}?view=htmlstats">HTML Stats</a>
1115:                                         </li>
1116:                                     #end
1117: 
1118:                                     #if ($releases.size() > 0)
1119:                                         <li class="nav-item">
1120:                                             <a data-bs-toggle="tab" id="news-tab" class="nav-link#if ($view == "news") active#end" data-bs-target="#news" href="${page.url}?view=news">News</a>
1121:                                         </li>
1122:                                     #end
1123: 
1124:                                     #if ($playerPhotos.size() > 0)
1125:                                         <li class="nav-item">
1126:                                             <a data-bs-toggle="tab" id="photos-tab" class="nav-link#if ($view == "photos") active#end" data-bs-target="#photos" href="${page.url}?view=photos">Photos</a>
1127:                                         </li>
1128:                                     #end
1129: 
1130:                                     #if ($playerVideos.size() > 0)
1131:                                         <li class="nav-item">
1132:                                             <a data-bs-toggle="tab" id="videos-tab" class="nav-link#if ($view == "videos") active#end" data-bs-target="#videos" href="${page.url}?view=videos">Videos</a>
1133:                                         </li>
1134:                                     #end
1135: 
1136:                                     ## WEPLAYED MOMENTS - THIRD-PARTY SUPPORT PLUGIN
1137:                                     #if (!$page.url.contains("/coaches") && $options.get("weplayed_addon_code"))
1138:                                         <li class="nav-item weplayed-hide-no-data #if ($view == "weplayed") active#end">
1139:                                             <a data-toggle="tab" id="weplayed-tab" class="nav-link#if ($view == "weplayed") active#end" data-target="#weplayed" href="${page.url}?view=weplayed">#Moments</a>
1140:                                         </li>
1141:                                     #end
1142:                                 </ul>
1143:                             </div>
1144:                         #end
1145:                         <div class="tab-content" id="roster-tab-content">
1146:                             ## BIO
1147:                             #if ($hasSynopsis || $hasBioBrief)
1148:                                 #set ($class = "tab-panel")
1149:                                 #if ($view == "bio")
1150:                                    #set ($class = "tab-panel active show")
1151:                                 #end
1152: 
1153:                                 <div class="tab-pane fade ${class}" id="bio" role="tabpanel" aria-labelledby="bio-tab">
1154:                                     <div class="$classTabPaneContent synopsis">
1155:                                         <h5 class="bio-tabbed-content-heading">Bio</h5>
1156:                                         #if ($hasSynopsis)
1157:                                           $synopsis
1158:                                         #elseif ($hasBioBrief)
1159:                                           $website.include("$bioBriefURL")
1160:                                         #end
1161:                                     </div>
1162:                                 </div> ## tab-panel
1163:                             #end
1164: 
1165:                             ## STATS
1166:                             #if ($statsURL.length() > 0)
1167: 
1168:                                 ## PROFILE
1169:                                 #set ($class = "tab-panel")
1170:                                 #if ($view == "profile")
1171:                                    #set ($class = "tab-panel active show")
1172:                                 #end
1173: 
1174:                                 <div class="tab-pane fade ${class}" id="profile" role="tabpanel" aria-labelledby="profile-tab">
1175:                                     <div class="$classTabPaneContent stats-wrap">
1176: 
1177:                                         ## LAST SIX GAMES
1178:                                             <h5 class="bio-tabbed-content-heading">Recent games</h5>
1179:                                             <div class="stats-box mb-3">
1180:                                                 #printRecentGames()
1181:                                             </div>
1182: 
1183:                                             <h5 class="bio-tabbed-content-heading">Season Statistics</h5>
1184:                                             ## RANKING
1185:                                             <div class="stats-box mb-3">
1186:                                                 #if ($statPos.length() > 0)
1187:                                                     $website.include("players?tmpl=stats-bios-rank-template&rank=${playerId}&pos=${statPos}")
1188:                                                 #end
1189:                                             </div>
1190:                                         </div>
1191:                                     </div> ## stats-wrap
1192:                                 </div> ## tab-content
1193: 
1194:                                 ## GAMELOG
1195:                                 #set ($class = "tab-panel")
1196:                                 #if ($view == "gamelog")
1197:                                    #set ($class = "tab-panel active show")
1198:                                 #end
1199: 
1200:                                 #set ($activePos = $statPos)
1201:                                 #if ($view == "gamelog" && $paramPos.length() > 0)
1202:                                     #if ($positions.get($paramPos).length() > 0)
1203:                                         #set ($activePos = $positions.get($paramPos))
1204:                                     #end
1205:                                 #end
1206: 
1207:                                 <div class="tab-pane fade ${class}" id="gamelog" role="tabpanel" aria-labelledby="gamelog-tab">
1208:                                     #if ($gamelogsCategoriesLabels)
1209:                                         <div class="$classTabPaneContent has-child-tabs">
1210:                                             <div class="d-flex flex-row text-nowrap align-items-center justify-content-center">
1211:                                                 <div class="secondary-tab-select-container flex-fill">
1212:                                                     <select class="tab-nav-select-helper form-select" id="bio-tabs-gamelog-select" aria-label="Choose a stat group">
1213:                                                         #foreach($briefCat in $gamelogsCategoriesLabels.entrySet())
1214:                                                             #set ($briefCatLabel = $briefCat.value)
1215:                                                             #set ($briefCatKey = $briefCat.key)
1216:                                                             #if ($locale == "en_gb" && $briefCatLabel == "Defense")
1217:                                                                 #set ($briefCatLabel = "Defence")
1218:                                                             #end
1219:                                                             <option value="#gamelog-tab-pos-${briefCatKey}-content" #if ($pos == $briefCat.key || $foreach.first) selected #end>${briefCatLabel}</option>
1220:                                                         #end
1221:                                                     </select>
1222:                                                     <script>
1223:                                                         $('.tab-nav-select-helper').on('change', function(e) {
1224:                                                             var id = $(this).val();
1225:                                                             $('a[data-bs-target="' + id + '"]').tab('show');
1226:                                                         });
1227:                                                     </script>
1228:                                                 </div>
1229:                                             </div>
1230:                                             <div class="$classBioTabChildrenWrapper" data-momentum="false">
1231:                                                 <ul class="$classBioTabChildren" id="bio-tabs-gamelog" role="tablist">
1232:                                                     #foreach($gamelogsCatLabel in $gamelogsCategoriesLabels.entrySet())
1233:                                                         #set($gamelogsCatLabelVal = $gamelogsCatLabel.value)
1234:                                                         #set ($gamelogsCatLabelKey = $gamelogsCatLabel.key)
1235:                                                         #if ($locale == "en_gb" && $gamelogsCatLabelVal == "Defense")
1236:                                                             #set($gamelogsCatLabelVal = "Defence")
1237:                                                         #end
1238:                                                         <li class="nav-item flex-fill flex-md-grow-0 flex-md-shrink-0">
1239:                                                             <a data-bs-toggle="tab" id="gamelog-tab-pos-${gamelogsCatLabel.key}" class="nav-link#if ($activePos == $gamelogsCatLabel.key) active#end" data-bs-target="#gamelog-tab-pos-${gamelogsCatLabel.key}-content" href="${page.url}?view=gamelog&pos=${gamelogsCatLabel.key}" aria-label="Game Log: ${gamelogsCatLabelVal}">$gamelogsCatLabelVal</a>
1240:                                                         </li>
1241:                                                     #end
1242:                                                 </ul>
1243:                                             </div>
1244:                                             <div class="tab-content" id="gamelog-tab-content">
1245:                                                 #foreach($gamelogsCatLabel in $gamelogsCategoriesLabels.entrySet())
1246:                                                     #set ($class = "tab-panel")
1247:                                                     #if ($gamelogsCatLabel.key == $activePos)
1248:                                                        #set ($class = "tab-panel active show")
1249:                                                     #end
1250:                                                     <div class="tab-pane fade ${class}" id="gamelog-tab-pos-${gamelogsCatLabel.key}-content" role="tabpanel" aria-labelledby="gamelog-tab-pos-${gamelogsCatLabel.key}">
1251:                                                         <div class="stats-wrap $classTabPaneContentChild">
1252:                                                              <h5 class="bio-tabbed-content-heading sr-only">Game Log - <small class="text-muted"> $gamelogsCatLabel.value</small></h5></h4>
1253:                                                             #gamelogData($gamelogsCatLabel.key)
1254:                                                         </div>
1255:                                                     </div>
1256:                                                 #end
1257:                                             </div>
1258:                                         </div>
1259:                                     #else
1260:                                         <div class="stats-wrap $classTabPaneContent">#gamelogData($pos)</div>
1261:                                     #end
1262: 
1263:                                 </div> ## tab-panel
1264: 
1265:                                 ## CAREER
1266:                                 #if ($showCareer)
1267: 
1268:                                     #set ($activePos = $statPos)
1269:                                     #if ($view == "career" && $paramPos.length() > 0)
1270:                                         #if ($positions.get($paramPos).length() > 0)
1271:                                             #set ($activePos = $positions.get($paramPos))
1272:                                         #end
1273:                                     #end
1274: 
1275:                                     #set ($class = "tab-panel")
1276:                                     #if ($view == "career")
1277:                                        #set ($class = "tab-panel active show")
1278:                                     #end
1279: 
1280:                                     <div class="tab-pane fade ${class}" id="career" role="tabpanel" aria-labelledby="career-tab">
1281:                                         #if ($briefsCategoriesLabels)
1282:                                             #printCategories($briefsCategoriesLabels "career" "Career Stats")
1283:                                         #else
1284:                                             <div class="stats-wrap $classTabPaneContent">#careerData($activePos)</div>
1285:                                         #end
1286:                                     </div>
1287:                                 #end
1288: 
1289:                                 ## SPLITS
1290:                                 #set ($class = "tab-panel clearfix")
1291:                                 #if ($view == "splits")
1292:                                    #set ($class = "tab-panel active show")
1293:                                 #end
1294: 
1295:                                 #set ($activePos = $statPos)
1296:                                 #if ($view == "splits" && $paramPos.length() > 0)
1297:                                     #if ($positions.get($paramPos).length() > 0)
1298:                                         #set ($activePos = $positions.get($paramPos))
1299:                                     #end
1300:                                 #end
1301: 
1302:                                 <div class="tab-pane fade ${class}" id="splits" role="tabpanel" aria-labelledby="splits-tab">
1303:                                     #if ($briefsCategoriesLabels)
1304:                                         #printCategories($briefsCategoriesLabels "splits" "Splits Stats")
1305:                                     #else
1306:                                         <div class="stats-wrap $classTabPaneContent">#splitsData($pos)</div>
1307:                                     #end
1308:                                 </div>
1309:                             #end
1310: 
1311:                             ## HTML STATS
1312:                             #if ($hasHTMLStats)
1313:                                 #set ($class = "tab-panel clearfix")
1314:                                 #if ($view == "htmlstats")
1315:                                    #set ($class = "tab-panel active show")
1316:                                 #end
1317:                                 <div class="tab-pane fade ${class}" id="htmlstats" role="tabpanel" aria-labelledby="htmlstats-tab">
1318:                                     <div class="$classTabPaneContent">
1319:                                         <h5 class="bio-tabbed-content-heading">Other Stats</h5>
1320:                                         <a href="${htmlStatsURL}" class="bio-htmlstats-identifier">Click to view HTML Stats</a>
1321:                                     </div>
1322:                                 </div>
1323:                             #end
1324: 
1325:                             ## NEWS
1326:                             #if ($releases.size() > 0)
1327:                                 #set ($class = "tab-panel clearfix")
1328:                                 #if ($view == "news")
1329:                                    #set ($class = "tab-panel active show")
1330:                                 #end
1331:                                 <div class="tab-pane fade ${class}" id="news" role="tabpanel" aria-labelledby="news-tab">
1332:                                     <div class="$classTabPaneContent">
1333:                                         <h5 class="bio-tabbed-content-heading">News mentions</h5>
1334:                                         #printReleases($releases, "article")
1335:                                     </div>
1336:                                 </div>
1337:                             #end
1338: 
1339:                             ## PHOTOS
1340:                             #if ($playerPhotos.size() > 0)
1341:                                 #set ($class = "tab-panel clearfix")
1342:                                 #if ($view == "photos")
1343:                                     #set ($class = "tab-panel active show clearfix")
1344:                                 #end
1345:                                 <div class="tab-pane fade ${class}" id="photos" role="tabpanel" aria-labelledby="photos-tab">
1346:                                     <div class="$classTabPaneContent">
1347:                                         <h5 class="bio-tabbed-content-heading">Photos</h5>
1348:                                         $website.includeAgain("${page.url}?tmpl=bio-photos-template")
1349:                                     </div>
1350:                                 </div>
1351:                             #end
1352: 
1353:                             ## VIDEOS
1354:                             #if ($playerVideos.size() > 0)
1355:                                 #set ($class = "tab-panel clearfix")
1356:                                 #if ($view == "videos")
1357:                                     #set ($class = "tab-panel active show clearfix")
1358:                                 #end
1359:                                 <div class="tab-pane fade ${class}" id="videos" role="tabpanel" aria-labelledby="videos-tab">
1360:                                     <div class="$classTabPaneContent">
1361:                                         <h5 class="bio-tabbed-content-heading">Videos</h5>
1362:                                         #printReleases($playerVideos, "video")
1363:                                     </div>
1364:                                 </div>
1365:                             #end
1366: 
1367:                             ## WEPLAYED MOMENTS - THIRD-PARTY SUPPORT PLUGIN
1368:                             #if (!$page.url.contains("/coaches") && $options.get("weplayed_addon_code"))
1369:                                 #set ($class = "tab-panel clearfix")
1370:                                 #if ($view == "weplayed")
1371:                                     #set ($class = "tab-panel active show clearfix")
1372:                                 #end
1373:                                 <div class="tab-pane fade ${class} weplayed-hide-no-data" id="weplayed-tab" role="tabpanel" aria-labelledby="weplayed-tab">
1374:                                     <div class="$classTabPaneContent">
1375:                                         <div data-weplayed-widget></div>
1376:                                     </div>
1377:                                 </div>
1378:                             #end
1379: 
1380:                         </div> ## tab-panels
1381:                     </div> ## tab-container
1382:                 </div>
1383:             </div> ## body
1384:         #end
1385:     </div>
1386: </div>
1387: 
1388: $wiki
1389: </div> ## ends bio-wrap
1390: 
1391: ## GLOBAL ADS SERVER
1392: #if ($website.ads.isAdvertisingEnabled('BIOS'))
1393:     $website.includeAgain("global-adserver-slots?adSlot=bios")
1394: #end
1395: