There was a problem with a Velocity script
Pageplayers/bio-network-template
ErrorInvocation of method 'replace' in class java.lang.String threw exception java.lang.NullPointerException at cccivc4kwydjw2maplayers/bio-network-template[line 70, column 37]
Page source:
1: ## PICK UP OPTIONS
2: $website.include("options")
3: #set ($options = $request.getAttribute("options"))
4: #set ($locale = "en_us")
5: #set ($locale = $options.get("locale"))
6: 
7: #set ($showconf = true)
8: #if ($options.get("stats_hide_conference") and $options.get("stats_hide_conference").equalsIgnoreCase("hide"))
9:     #set ($showconf = false)
10: #end
11: 
12: #set ($showCareer = $wiki.valid() && $seasons)
13: #if ("yes" == $options.get("stats_show_career") && $seasons)
14:     #set ($showCareer = "yes")
15: #end
16: 
17: #if ($locale == "en_us")
18:     #set ($defLabel = "Defense")
19: #elseif ($locale == "en_gb")
20:     #set ($defLabel = "Defence")
21: #end
22: 
23: #set ($pos = "")
24: #if($attributes.get("position_stat"))
25: 	#set ($pos = $attributes.get("position_stat"))
26: #else
27: 	#set ($pos = $attributes.get("position"))
28: 	#set ($pos = $statPosition)
29: 	#set ($posVec = $pos.split("/"))
30: 	#set ($pos = $posVec[0])
31: #end
32: #set ($pos = $pos.toLowerCase())
33: #set ($statPos = $positions.get($pos))
34: #set ($paramPos = $request.getParameter("pos"))
35: 
36: #if ($highlightsByPosition || $highlights.containsKey($statPos))
37: 	#set ($highlights = $highlights.get($statPos))
38: #end
39: 
40: #set ($url = ${page.url})
41: #set ($playerId = $attributes.get("playerId"))
42: #set ($stats = $splits.overall)
43: 
44: #set ($hasEvents = $events.size() > 0)
45: #set ($hasSynopsis = $synopsis.length() > 1 && $synopsis.indexOf("<center>") == -1)
46: #set ($htmlStatsURL = "${page.url}-stats")
47: #set ($hasHTMLStats = $website.exists($htmlStatsURL))
48: #set ($bioBriefURL = "${page.url}-brief")
49: #set ($hasBioBrief = $website.exists("$bioBriefURL"))
50: 
51: $request.setAttribute("careerTotals", $career)
52: 
53: 
54: ## We track a map of the careers to see if we are missing any seasons
55: #if(!$rosterTransactions)
56:     #set ($careerMap = {})
57:     $request.setAttribute("careerMap", $careerMap)
58:     #foreach ($season in $seasons)
59:         ## We need to include this season stats.
60: 		## we anticipate the player file being within a normal season structure.
61:         #set ($path = "${season.path}?tmpl=bio-career-template&name=${season.seasonName}&pos=${statPos}&print=no")
62: 
63: 		## naiastats.com uses a unique foler structure that needs to be accounted for.
64: 		## seasons have conference folders within NAIA to reduce query response times for massive season data.
65: 		#if($page.url.contains("/conf"))
66: 			#set ($tempPath = $page.sectionPage.sectionPage.sectionPage.sectionPage.sectionPage.url)
67: 		#else
68: 			#set ($tempPath = $page.sectionPage.sectionPage.sectionPage.url)
69: 		#end
70: 		#set ($path = $path.replace("../..", $tempPath))
71: 
72:         $website.includeAgain($path)
73:     #end
74: #end
75: 
76: 	 #set($basketballReplace = "40")
77:     #if($sport == "Basketball")
78:         #if($rosterTransactions)
79:             #set($basketballReplace = $career.totals.get("minpm").toString())
80:         #else
81:             #set($basketballReplace = $career.overall.get("minpm").toString())
82:         #end
83:     #end
84: 
85: #set ($view = "profile")
86: #if ($request.getParameter("view"))
87:     #set ($view = $request.getParameter("view"))
88: #end
89: 
90: $website.include("${page.sectionPage.url}/roster?tmpl=roster-headshots-template")
91: #set ($rosterHeadshots = $!request.getAttribute("roster_headshots"))
92: 
93: #################################### MACROS ####################################################
94: #macro (printTableHeader $label $class)
95: 	## Hack for now
96: 	#set ($labels = $labels.get($p))
97: 	<th class="text-uppercase $class" data-p="$!{p}" data-bs-toggle="tooltip" data-bs-placement="top" title="$!{labels.get($label)}"><abbr title="$!{labels.get($label)}">$label</abbr></th>
98: #end
99: 
100: #macro (printCellClass)
101: 	class="text-nowrap text-center"
102: #end
103: 
104: #macro (printImage $src $alt $class)
105: 	#set ($src = "${src}?max_height=576&max_width=576&crop=1")
106: 	<div class="ratio ratio-1x1 rounded-circle overflow-hidden img-thumbnail">
107: 		<span class="align-content-center">
108: 			<img src="${src}" alt="$!{alt}" class="${class}" />
109: 		</span>
110: 	</div>
111: #end
112: 
113: #macro (printTab $viewParam $label)
114: 	#set ($classAttr = "nav-link text-nowrap")
115: 	#if ($viewParam == $view)
116: 		#set ($classAttr = "${classAttr} active")
117: 	#end
118: 	<li class="nav-item" role="presentation">
119: 		<a href="${page.url}?view=${viewParam}" class="$classAttr" role="tab" data-bs-toggle="tab" data-bs-target="#${viewParam}" aria-selected="true" aria-controls="$viewParam">$label</a>
120: 	</li>
121: #end
122: 
123: #macro (printPaneAttrs $viewParam)
124: 	#set ($classAttr = "tab-pane")
125: 	#if ($viewParam == $view)
126: 		#set ($classAttr = "tab-pane active")
127: 	#else
128: 		#set ($classAttr = "${classAttr} fade")
129: 	#end
130: 
131: 	class="$classAttr" role="tabpanel" id="$viewParam"
132: #end
133: 
134: #macro (printResultAriaLabel $event)
135:     #set ($ariaLabel = "${event.sport} event: ${formatter.formatDate($event.date, 'MMMM d hh:mm a:')}")
136:     #if ($event.neutralSite.length() > 0 || $event.home)
137:     	#set ($ariaLabel = "${ariaLabel} vs.")
138:     #else
139:     	#set ($ariaLabel = "${ariaLabel} at")
140:     #end
141:     #set ($ariaLabel = "${ariaLabel} ${event.opponent.name}:")
142:     #if ($event.neutralSite.length() > 0)
143:     	#set ($ariaLabel = "${ariaLabel} @ ${event.neutralSite}:")
144:     #end
145:     #set ($ariaLabel = "${ariaLabel} Box Score")
146:     aria-label="$ariaLabel"
147: #end
148: 
149: #macro (printHighlights)
150:     #if ($highlights)
151:         <div class="d-flex flex-wrap bg-light">
152:         #foreach ($highlight in $highlights.keySet())
153:             #set ($value = "-")
154:             #set ($value = $formatter.formatNumber($stats.get($highlight), $formats.get($highlight)))
155:             #set ($classAttr = "flex-fill border p-3 text-center")
156:             #if ($velocityCount > 1)
157:                 ## #set ($classAttr = "nav-item border-left")
158:             #end
159:             <div class="$classAttr" style="min-width:100px">
160:                 <div class="text-uppercase fw-normal small text-muted">$!highlights.get($highlight)</div>
161:                 <div class="p-0 m-0 fs-5 fw-bold lh-1">$!value</div>
162:             </div>
163:         #end
164: 		</div>
165: 	#end
166: #end ## macro printHighlights
167: 
168: #macro (splitBioNetwork $statPosBriefs $label $stats)
169: 	<tr>
170: 		<th class="text-nowrap text-end fw-bold">${label}</th>
171: 		#if($rosterTransactions && $stats.class.simpleName == "JSONObject")
172:             #set($keys =  $stats.names())
173:             #set($array = $keys.toString().replace('"','').split(","))
174:             #foreach ($brief in $statPosBriefs.keySet())
175:                 #set ($value = "-")
176:                 #if($array.contains($brief))
177:                     #set ($value = $!formatter.formatNumber($tool.math.toDouble($stats.get($brief)), $formats.get($brief)))
178:                  #end
179:                 <td>#if ($value.length() > 0) $value #else - #end</td>
180:             #end
181: 		#else
182:             #foreach ($brief in $statPosBriefs.keySet())
183:                 #set ($value = "-")
184:                 #set ($value = $!formatter.formatNumber($stats.get($brief), $formats.get($brief)))
185:                 <td #printCellClass>#if ($value.length() > 0) $value #else - #end</td>
186:             #end
187:         #end
188: 	</tr>
189: #end ## marco split
190: 
191: #macro (printCategories $briefCategoryLabels $viewParam)
192: 	#printSubTabs($briefCategoryLabels.entrySet(), $viewParam)
193: 
194: 	<div class="tab-content py-3">
195: 		#foreach ($briefCat in $briefCategoryLabels.entrySet())
196: 			#set ($briefCatLabel = $briefCat.value)
197: 			#set ($class = "tab-pane")
198: 			#if ($briefCat.key == $activePos)
199: 				#set ($class = "tab-pane active")
200: 			#end
201: 			<div id="${viewParam}-${briefCat.key}" class="$class" role="tabpanel">
202: 				<div class="stats-wrap clearfix">
203: 					#if ($viewParam == "splits")
204: 						#splitsBioNetworkData($briefCat.key)
205: 					#elseif ($viewParam == "career")
206: 						#careerData($briefCat.key)
207: 					#end
208: 				</div>
209: 			</div>
210: 		#end
211: 	</div>
212: #end ## macro printCategories
213: 
214: #macro (splitsBioNetworkData $cat)
215: 	#if ($briefs.containsKey($cat))
216: 		#set ($statPosBriefs = $briefs.get($cat))
217: 	#elseif ($positions.contains($cat))
218: 		#set ($p = $positions.get($cat))
219: 		#set ($statPosBriefs = $briefs.get($p))
220: 	#end
221: 	#set ($colspan = 0)
222: 	#if ($statPosBriefs)
223: 		#set ($colspan = $statPosBriefs.size())
224: 	#end
225: 
226: 	<div class="stats-container table-responsive-via-datatables">
227: 		<table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-buttons="true" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
228: 			<thead class="thead-dark">
229: 				<tr>
230: 					<th>&nbsp;</th>
231: 					#foreach ($brief in $statPosBriefs)
232: 						#printTableHeader($brief.replace("40",$basketballReplace), "text-center")
233: 					#end
234: 				</tr>
235: 			</thead>
236: 			#splitBioNetwork($statPosBriefs, "Total", $splits.overall)
237: 			#if ($showconf)
238: 				#splitBioNetwork($statPosBriefs, "Conference", $splits.conference)
239: 			#end
240: 			#splitBioNetwork($statPosBriefs, "Exhibition", $splits.exhibition)
241: 
242: 
243: 			<tr class="group">
244: 				#foreach ( $i in [0..$colspan])
245:                     <td class="text-center">&nbsp;</td>
246: 				#end
247: 			</tr>
248: 
249: 			#splitBioNetwork($statPosBriefs, "Home", $splits.home)
250: 			#splitBioNetwork($statPosBriefs, "Away", $splits.away)
251: 			#splitBioNetwork($statPosBriefs, "Neutral", $splits.neutral)
252: 
253:             <tr class="group">
254: 				#foreach ( $i in [0..$colspan])
255:                     <td class="text-center">&nbsp;</td>
256: 				#end
257: 			</tr>
258: 
259: 			#foreach($gameResult in $gamesResults.entrySet())
260: 				#if ($gameResult.key == "wins")
261: 					#set ($splitGameResult = $splits.inWins)
262: 				#elseif ($gameResult.key == "losses")
263: 					#set ($splitGameResult = $splits.inLosses)
264: 				#elseif ($gameResult.key == "ties")
265: 					#set ($splitGameResult = $splits.inTies)
266: 				#end
267: 
268: 				#splitBioNetwork($statPosBriefs, $gameResult.value, $splitGameResult)
269: 			#end
270: 
271:             <tr class="group">
272: 				#foreach ( $i in [0..$colspan])
273:                     <td class="text-center">&nbsp;</td>
274: 				#end
275: 			</tr>
276: 
277: 			#if ($monthsPlayed and $monthsPlayed.size() > 0)
278: 				#foreach($month in $monthsPlayed)
279: 					#if ($month == 'January')
280: 						#set ($splitMonth = $splits.january)
281: 					#elseif ($month == 'February')
282: 						#set ($splitMonth = $splits.february)
283: 					#elseif ($month == 'March')
284: 						#set($splitMonth = $splits.march)
285: 					#elseif ($month == 'April')
286: 						#set($splitMonth = $splits.april)
287: 					#elseif ($month == 'May')
288: 						#set ($splitMonth = $splits.may)
289: 					#elseif ($month == 'June')
290: 						#set ($splitMonth = $splits.june)
291: 					#elseif ($month == 'July')
292: 						#set($splitMonth = $splits.july)
293: 					#elseif ($month == 'August')
294: 						#set ($splitMonth = $splits.august)
295: 					#elseif ($month == 'September')
296: 						#set($splitMonth = $splits.september)
297: 					#elseif ($month == 'October')
298: 						#set($splitMonth = $splits.october)
299: 					#elseif ($month == 'November')
300: 						#set ($splitMonth = $splits.november)
301: 					#elseif ($month == 'December')
302: 						#set($splitMonth = $splits.december)
303: 					#end
304: 					#splitBioNetwork($statPosBriefs, $month, $splitMonth)
305: 				#end
306: 			#end
307: 		</table>
308: 	</div>
309: #end ## macro splitsBioNetworkData
310: 
311: #macro (printRecentGames)
312: 	<div class="stats-container table-responsive-via-datatables">
313:         <table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-buttons="true" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
314:             <thead class="thead-dark">
315:                 <tr>
316:                     <th class="text-uppercase w-1">Date</th>
317:                     <th class="text-uppercase text-start">Opponent</th>
318:                     <th scope="col" class="text-center text-uppercase">Result</th>
319:                 </tr>
320:             </thead>
321:     		#set ($eventEnd = -1)
322:     		#foreach ($event in $events)
323:     			#if ($event.event.result.resolved)
324:     				#set ($eventEnd = $velocityCount)
325:     			#end
326:     		#end
327: 
328:     		#set ($eventStart = $eventEnd - 5)
329:     		#if ($eventStart < 0) #set ($eventStart = 0) #end
330: 
331:     		#foreach ($event in $events)
332:     			#if ($velocityCount >= $eventStart and $velocityCount <= $eventEnd)
333:     				<tr>
334:     					<td class="text-nowrap text-start">$formatter.formatDate($event.event.date, "MMM d")</td>
335:     					<td class="text-nowrap text-start">
336:     						#if ($event.event.neutralSite.length() > 0) vs.
337:     						#elseif (!$event.event.home) at
338:     						#end
339:     						$event.event.opponent.name
340:     					</td>
341:     					<td class="text-nowrap text-center">
342:     						#if ($event.event.statusCode >= 0)
343:     							#if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
344:     								<a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
345:     							#else
346:     								${event.event.APResult}
347:     							#end
348:     						#end
349:     					</td>
350:     				</tr>
351:     			#end
352:     		#end
353:     	</table>
354: 	</div>
355: #end ## macro printRecentGames
356: 
357: #macro (gamelogData $cat)
358: 	#if ($gamelogs.containsKey($cat))
359: 		#set ($cols = $gamelogs.get($cat))
360: 	#elseif ($positions.contains($cat))
361: 		#set ($p = $positions.get($cat))
362: 		#set ($cols = $gamelogs.get($p))
363: 	#end
364: 	#set ($atLeastOneNotOverall = false)
365: 
366: 	<div class="stats-container table-responsive-via-datatables">
367:         <table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-filtering="false" data-buttons="true" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
368: 			<thead class="thead-dark">
369: 				<tr>
370: 					#printTableHeader("Date", "w-1")
371: 					#printTableHeader("Opponent", "")
372: 					#printTableHeader("Score", "text-center")
373: 
374: 					#set ($colspan = 3)
375: 					#if ($p == 'goalie' && ($sport.enumCode == 9 || $sport.enumCode == 3)) ## field hockey: 9   soccer:3
376: 						#printTableHeader("Dec", "text-center")
377: 					#end
378: 					#foreach ($col in $cols)
379: 						#printTableHeader($col, "text-center")
380: 					#end
381: 				</tr>
382: 			</thead>
383: 			#foreach ($event in $events)
384: 				<tr>
385: 					<td class="text-nowrap">$formatter.formatDate($event.event.date, "MMM d") #if (!$event.event.overall) #set ($atLeastOneNotOverall = true) # #end</</td>
386: 					<td class="text-nowrap">
387: 						#if ($event.event.neutralSite.length() > 0) vs. #elseif (!$event.event.home) at #end
388: 						$event.event.opponent.name
389: 					</td>
390: 					<td #printCellClass>
391: 						#if ($event.event.statusCode >= 0)
392: 							#if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
393: 								<a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
394: 							#else
395: 								${event.event.APResult}
396: 							#end
397: 						#else &nbsp; #end
398: 					</td>
399: 					#if ($p == 'goalie' && ($sport.enumCode == 9 || $sport.enumCode == 3)) ## field hockey: 9   soccer:3
400: 						<td #printCellClass>
401: 							#if ($event.stats.get('gow') == 1)
402: 								W
403: 							#elseif ($event.stats.get('gol') == 1)
404: 								L
405: 							#elseif ($event.stats.get('got') == 1)
406: 								T
407: 							#else
408: 								-
409: 							#end
410: 						</td>
411: 					#end
412: 					#foreach ($col in $cols.keySet())
413: 						#set ($value = "-")
414: 						#set ($value = $formatter.formatNumber($event.stats.get($col), $formats.get($col)))
415: 						<td #printCellClass>$value</td>
416: 					#end
417: 				</tr>
418: 			#end
419: 		</table>
420: 
421: 		#if ($atLeastOneNotOverall)
422: 			<p class="my-3"># Stats don't count towards season totals</p>
423: 		#end
424: 	</div>
425: #end ## macro gamelogData
426: 
427: #macro (careerData $cat)
428: 	#if ($briefs.containsKey($cat))
429: 		#set ($statPosBriefs = $briefs.get($cat))
430: 	#elseif ($positions.contains($cat))
431: 		#set ($p = $positions.get($cat))
432: 		#set ($statPosBriefs = $briefs.get($p))
433: 	#end
434: 
435: 	<div class="stats-container table-responsive-via-datatables">
436: 		<table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-buttons="true" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
437:             <thead class="thead-dark">
438:                 <tr>
439:                     <th class="">&nbsp;</th>
440:                     #foreach ($brief in $statPosBriefs)
441:                         #printTableHeader($brief.replace("40",$basketballReplace), "text-center")
442:                     #end
443:                 </tr>
444:             </thead>
445:               #if($rosterTransactions)
446:                   #set ($seasonLength = $career.seasons.length())
447:                   #foreach ($index in [0..$tool.math.sub($seasonLength, 1)])
448:                       #set($season = $career.seasons[$index])
449:                       #if($season.seasonStatsURL != "null")
450:                           #set ($label = "<a href='${season.seasonStatsURL}?view=profile'>$season.seasonName.replaceAll('^[^0-9-]*','') - $season.team.teamName</a>")
451:                       #else
452:                           #set ($label = "$season.seasonName.replaceAll('^[^0-9-]*','') - $season.team.teamName")
453:                       #end
454:                       #splitBioNetwork($statPosBriefs, $label, $season.player.stats)
455:                   #end
456:                   #splitBioNetwork($statPosBriefs, "Total", $career.totals)
457: 
458:               #else
459:                 #foreach ($season in $seasons)
460:                     #if ($careerMap.get($season.seasonName))
461: 						## naiastats.com uses a unique foler structure that needs to be accounted for.
462: 						## seasons have conference folders within NAIA to reduce query response times for massive season data.
463: 						#if($page.url.contains("/conf"))
464: 							#set ($tempPath = $page.sectionPage.sectionPage.sectionPage.sectionPage.sectionPage.url)
465: 						#else
466: 							#set ($tempPath = $page.sectionPage.sectionPage.sectionPage.url)
467: 						#end
468: 						#set ($path = $season.path.replace("../..", $tempPath))
469: 
470:                         #set ($label = "<a href='${path}?view=profile'>$season.seasonName</a>")
471:                         #splitBioNetwork($statPosBriefs, $label, $careerMap[$season.seasonName])
472:                     #elseif ($wiki.valid())
473:                         <tr>
474: 							<td class="text-nowrap text-end text-muted fst-italic">${season.seasonName}</td>
475: 							#foreach ($i in [1..$statPosBriefs.size()])
476: 								#if ($statPosBriefs.size() > 1)
477: 									#if ($foreach.first)
478:                                         <td class="text-nowrap text-center text-muted">
479:                                             <a href="#" data-bs-toggle="tooltip" title="We could not find the 'players' page in the ${season.seasonName} section."><span class="fa fa-light fa-circle-info"></span></a>
480: 										</td>
481: 									#else
482: 										<td class="text-nowrap text-center text-muted"></td>
483: 									#end
484: 								#end
485: 							#end
486:                         </tr>
487:                     #end
488:                 #end
489:                 #splitBioNetwork($statPosBriefs, "Total", $request.getAttribute("careerTotals").overall)
490: 			#end
491: 
492: 
493: 		</table>
494: 	</div>
495: #end ## macro careerData
496: 
497: #macro (printTabs)
498: 	$request.setAttribute("icl-responsive-tabs-script", true)
499: 	<div class="tab-nav">
500: 		<ul class="nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3" id="bio-network-tabs" role="tablist">
501: 			#printTab("profile", "Player Profile")
502: 			#printTab("gamelog", "Game Log")
503: 			#if ($showCareer)
504: 				#printTab("career", "Career Stats")
505: 			#end
506: 			#printTab("splits", "Split Stats")
507: 		</ul>
508:     </div>
509: #end ## printTabs
510: 
511: #macro (printLabel $label)
512: 	#if ($locale == "en_gb" && $label == "Defense")
513: 		Defence
514: 	#else
515: 		$label
516: 	#end
517: #end
518: 
519: #macro (printSubTabs $entries $viewParam)
520: 	#set ($activeLabel = "")
521: 	#foreach ($entry in $entries)
522: 		#if ($entry.key == $activePos)
523: 			#set ($activeLabel = $entry.value)
524: 		#end
525: 	#end
526: 
527: 	<div class="d-flex flex-row text-nowrap align-items-center justify-content-center">
528: 		<div class="secondary-tab-select-container flex-fill">
529: 			<select class="tab-nav-select-helper form-select" id="${viewParam}-subtabs-select" aria-label="Choose a stat group">
530: 				#foreach($entry in $entries)
531: 					<option value="#${viewParam}-${entry.key}" #if ($entry.value == $activeLabel || $foreach.first) selected #end>#printLabel($entry.value.replace("40",$basketballReplace))</option>
532: 				#end
533: 			</select>
534: 			<script>
535: 				$('.tab-nav-select-helper').on('change', function(e) {
536: 					var id = $(this).val();
537: 					$('a[data-bs-target="' + id + '"]').tab('show');
538: 				});
539: 			</script>
540: 		</div>
541: 	</div>
542: 
543: 	<ul class="d-none nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-start gap-3" role="tablist" id="${viewParam}-subtabs">
544: 		#foreach($entry in $entries)
545: 			#set ($class = "nav-link")
546: 			#if ($entry.value == $activeLabel)
547: 				#set ($class = "${class} active")
548: 			#end
549: 			<li class="nav-item" role="presentation">
550: 				<a href="#${viewParam}-${entry.key}" class="${class}" id="${viewParam}-${entry.key}-tab" data-bs-target="#${viewParam}-${entry.key}" role="tab" data-bs-toggle="tab">#printLabel($entry.value)</a>
551: 			</li>
552: 		#end
553: 	</ul>
554: #end
555: ################################################## END MACROS  #############################################################
556: 
557: <head>
558: <title>
559:     $!attributes.get("first_name") $!attributes.get("last_name") | #if ($attributes.get("number"))#$!attributes.get("number") | #end #if($attributes.get("position_abbr") && !$attributes.get("position_abbr").empty)$!attributes.get("position_abbr") | #elseif ($attributes.get("position"))$!attributes.get("position") | #end  $attributes.get("team")
560: </title>
561: </head>
562: 
563: $request.setAttribute("icl-responsive-tabs-script", true)
564: $request.setAttribute("icl-dataTables-script", true)
565: 
566: <div class="page-content player-stats">
567: 	<div class="d-flex flex-column justify-content-between gap-3">
568: 		<div class="bnt-heading">
569: 			<div class="bnt-main d-flex flex-column flex-grow-1 gap-3">
570: 				<div class="bnt-name-info">
571: 					<div class="d-flex align-items-center justify-content-between gap-3">
572: 						<div class="bnt-left">
573: 							<div class="bnt-headshot position-relative" style="width:5rem;">
574: 								#set ($playerName = $!attributes.get("first_name") + ' '+  $!attributes.get("last_name"))
575: 								#set ($src = "/info/images/default-headshot.png")
576: 								#if ($rosterHeadshots.size() > 0)
577: 									#foreach ($rosterPlayer in $rosterHeadshots)
578: 										#if ($playerName == $rosterPlayer.name)
579: 											#if ($rosterPlayer.headshot.length() > 0)
580: 												#set ($src = $rosterPlayer.headshot)
581: 											#elseif ($website.exists("/images/setup/default-headshot.png"))
582: 												#set ($src = "/images/setup/default-headshot.png")
583: 											#elseif ($website.exists("/images/setup/headshot_default.jpg"))
584: 												#set ($src = "/images/setup/headshot_default.jpg")
585: 											#end
586: 										#end
587: 									#end
588: 									#printImage($src, $playerName, "img-fluid h-auto")
589: 								#else
590: 									#printImage($website.teamLogo($!{attributes.get("teamId")}), ${attributes.get("team")}, "img-fluid h-auto")
591: 								#end
592: 								#if (!$attributes.get("number").empty)
593: 									<div class="jersey-number-overlay d-inline-block position-absolute bottom-0 end-0 lh-1">
594: 										<span class="number d-inline-block small text-center bg-primary text-white rounded-circle lh-1 overflow-hidden p-2" style="width:2rem; height:2rem;">
595: 											$!attributes.get("number")
596: 										</span>
597: 									</div>
598: 								#end
599: 							</div>
600: 						</div>
601: 						<div class="bnt-name-info-main flex-grow-1">
602: 							<div class="d-flex flex-column aling-items-center justify-content-between gap-3">
603: 								<div class="player-attributes">
604: 									<h1 class="m-0 p-0">
605: 										$!attributes.get("first_name") $!attributes.get("last_name")
606: 									</h1>
607: 									<ul class="list-unstyled list-inline-pipes d-flex align-items-center justify-content-start gap-2 m-0 w-100">
608: 										#if($attributes.get("position_abbr") && !$attributes.get("position_abbr").empty)
609: 											<li><span>$!attributes.get("position_abbr")</span></li>
610: 										#elseif ($attributes.get("position"))
611: 											<li><span>$!attributes.get("position")</span></li>
612: 										#end
613: 										<li><a href="../teams?id=$!{attributes.get("teamId")}" aria-label="Team Stats - ${attributes.get("team")}">$attributes.get("team")</a></li>
614: 									</ul>
615: 								</div>
616: 							</div>
617: 						</div>
618: 						#if ($rosterHeadshots.size() > 0)
619: 							## do nothing
620: 						#else
621: 							#set ($teamId = $attributes.get("teamId"))
622: 							#if ($teamId.length() > 0)
623: 								<div class="bnt-team-logo">
624: 									<span class="bnt-team-logo ps-2">
625: 										<img class="img-mh-3" src="${website.teamLogo($teamId)}" alt="" />
626: 									</span>
627: 								</div>
628: 							#end
629: 						#end
630: 					</div>
631: 				</div>
632: 				<div class="bnt-highlights mx-3">
633: 					#printHighlights
634: 				</div>
635: 			</div>
636: 		</div>
637: 	</div>
638: 
639: 
640: 	<div class="tabs-container my-3">
641: 
642: 		#printTabs
643: 
644:     	<div class="tab-content p-3 border">
645: 
646:     		## PROFILE
647:     		<div #printPaneAttrs("profile")>
648:     			<div class="d-flex flex-column flex-md-row align-items-top justify-content-center gap-3">
649:     				<div class="flex-grow-1 flex-shrink-1 col-12 col-md-6">
650:     					<h5>Player Stats</h5>
651:     					$website.include("${page.sectionPage.url}/players?tmpl=stats-bios-rank-template&rank=${playerId}&pos=${statPos}")
652:     				</div>
653: 					<div class="flex-grow-1 flex-shrink-1 col-12 col-md-6">
654: 						<h5>Recent Results</h5>
655: 						#printRecentGames
656: 					</div>
657:     			</div>
658: 
659:                 #if ($hasSynopsis)
660:     				<div class="my-3">$!synopsis</div>
661:                 #end
662: 
663:                 #if ($hasBioBrief)
664:     				<div class="my-3">$website.include($bioBriefURL)</div>
665:                 #end
666: 
667:                 #if ($htmlStatsURL)
668:     				<div class="my-3">$website.include($htmlStatsURL)</div>
669:                 #end
670: 
671: 				#if($website.ads.isMediaInternalSectionsAdsEnabled())
672: 					<!-- Individual Player Page, ad unit is placed below recent results on Desktop and Mobile -->
673: 					<div id="waldo-tag-25894" class="p-3 text-center" role="presentation"></div>
674: 				#end
675:     		</div> ## PROFILE
676: 
677:     		## GAMELOG
678:             #set ($activePos = $gamelogsCategoriesLabels.keySet().iterator().next())
679:             #if ($view == "gamelog" && $paramPos.length() > 0 && $gamelogs.containsKey($paramPos))
680: 				#set ($activePos = $paramPos)
681:             #end
682: 
683:     		<div #printPaneAttrs("gamelog")>
684:     			#if ($gamelogsCategoriesLabels.size() > 0)
685:     				#printSubTabs($gamelogsCategoriesLabels.entrySet(), "gamelog")
686:     				<div class="tab-content py-3">
687:     					#foreach($entry in $gamelogsCategoriesLabels.entrySet())
688:     						#set ($class = "tab-pane")
689:     						#if ($entry.key == $activePos)
690:     							#set ($class = "tab-pane active")
691:     						#end
692:     						<div class="${class}" role="tabpanel" id="gamelog-${entry.key}">
693:     							#gamelogData($entry.key)
694:     						</div>
695:     					#end
696:     				</div>
697:     			#else
698:     				#gamelogData($activePos)
699:     			#end
700:     		</div> ## tab-pane
701:     		## GAMELOG
702: 
703:             ## CAREER
704:     		#if ($showCareer)
705: 				#set ($activePos = $briefsCategoriesLabels.keySet().iterator().next())
706:     			#if ($view == "career" && $paramPos.length() > 0 && $briefsCategoriesLabels.containsKey($paramPos))
707: 					#set ($activePos = $paramPos)
708:     			#end
709:     			<div #printPaneAttrs("career")>
710:     				#if ($briefsCategoriesLabels)
711:     					#printCategories($briefsCategoriesLabels, "career")
712:     				#else
713:     					#careerData($activePos)
714:     				#end
715:     			</div>
716:     		#end
717:     		## CAREER
718: 
719:             ## SPLITS
720: 			#set ($activePos = $briefsCategoriesLabels.keySet().iterator().next())
721:     		#if ($view == "splits" && $paramPos.length() > 0 && $briefsCategoriesLabels.containsKey($paramPos))
722: 				#set ($activePos = $paramPos)
723:     		#end
724: 
725:     		<div #printPaneAttrs("splits")>
726:     			#if ($briefsCategoriesLabels)
727:     				#printCategories($briefsCategoriesLabels, "splits")
728:     			#else
729:     				#splitsBioNetworkData($activePos)
730:     			#end
731:     		</div>
732:     		## SPLITS
733: 
734:     	</div> ## tab-content
735: 	</div> ## tabs-container
736: </div> ## bio-wrapper
737: $wiki.su