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