There was a problem with a Velocity script
Pagesports/wten/2023-24/teams/teaminfo-network-template
ErrorInvocation of method 'getOverall' in class com.prestosports.content.sport.stats.StatsSplitter threw exception java.lang.NullPointerException at ruuagqb1da96qmm2sports/wten/2023-24/teams/teaminfo-network-template[line 17, column 24]
Page source:
1: ## PICK UP OPTIONS
2: $website.include("options")
3: #set ($options = $request.getAttribute("options"))
4: 
5: $request.setAttribute("icl-dataTables-script", true)
6: ## The above script is needed because several nested tables may appear in nested tabs
7: 
8: #set ($locale = "en_us")
9: #set ($locale = $options.get("locale"))
10: 
11: #set ($showConf = true)
12: #if ($options.get("stats_hide_conference") and $options.get("stats_hide_conference").equalsIgnoreCase("hide"))
13: 	#set ($showConf = false)
14: #end
15: 
16: #set ($teamId = $attributes.get("teamId"))
17: #set ($stats = $splits.overall)
18: 
19: #set ($pos = "")
20: #if ($sport.enumCode == 0) ## Football
21: 	#set ($pos = "off")
22: #elseif ($sport.enumCode == 2) ## Basketball
23: 	#set ($pos = "sh")
24: #elseif ($sport.enumCode == 3) ## Soccer
25: 	#set ($pos = "sc")
26: #elseif ($sport.enumCode == 9) ## Field Hockey
27: 	#set ($pos = "fielder")
28: #end
29: 
30: #set ($posEsc = $formatter.escapeXml($request.getParameter("pos").toLowerCase()))
31: #if ($posEsc.length() > 0)
32: 	#set ($pos = $posEsc)
33: #end
34: 
35: #if ($sport.enumCode == 9) ## Field Hockey
36: 	#if ($pos == "goalie")
37: 		#set ($pos = "fielder")
38: 	#end
39: 	#if ($pos == "gg")
40: 		#set ($pos = "kg")
41: 	#end
42: #end
43: 
44: #set ($restriction = 0)
45: #set ($overallActive = true)
46: #set ($conferenceActive = false)
47: #set ($restrictionEsc = $formatter.escapeXml($request.getParameter("r")))
48: #if ($restrictionEsc.length() > 0 && $restrictionEsc.equals("1"))
49: 	#set ($restriction = 1)
50: 	#set ($overallActive = false)
51: 	#set ($conferenceActive = true)
52: #end
53: 
54: #set ($summaryActive = false)
55: #set ($resultsActive = false)
56: #set ($statisticsActive = false)
57: #set ($profileEsc = $formatter.escapeXml($!request.getParameter("p")))
58: #if  ($profileEsc == "summary")
59: 	#set ($summaryActive = true)
60: #elseif  ($profileEsc == "results")
61: 	#set ($resultsActive = true)
62: #elseif  ($profileEsc == "statistics")
63: 	#set ($statisticsActive = true)
64: #else
65: 	#set ($summaryActive = true)
66: #end
67: 
68: #set ($resultFormat     = "AP1")
69: #if ($options.get("schedule_result_format").equals("L, 1-2"))
70: 	#set ($resultFormat = "AP2")
71: #end
72: 
73: #set ($view = "profile")
74: #if ($request.getParameter("view"))
75: 	#set ($view = $formatter.escapeXml($!request.getParameter("view")))
76: #end
77: 
78: #if ($briefsCategoriesLabels)
79: 	#set($briefsCategoriesSeason = $briefsCategoriesLabels.get("Season"))
80: 	#set($firstCategoryPos = $briefsCategoriesSeason.keySet().iterator().next())
81: #end
82: 
83: #set ($showRoster = false)
84: #if ($options.get("stats_show_roster") and $options.get("stats_show_roster").equalsIgnoreCase("yes"))
85: 	#set ($showRoster = true)
86: #end
87: 
88: #set ($showAttendance = true)
89: #if ($options.get("stats_show_attendance") and $options.get("stats_show_attendance").equalsIgnoreCase("hide"))
90: 	#set ($showAttendance = false)
91: #end
92: 
93: ## MACROS
94: #macro (printTableHeader $label $class)
95: <th class="text-uppercase $class">$label</th>
96: #end
97: 
98: #macro (printResultAriaLabel $event)
99: 	#set ($ariaLabel = "${event.sport} event: ${formatter.formatDate($event.date, 'MMMM d hh:mm a:')}")
100: 	#if ($event.neutralSite.length() > 0 || $event.home)
101: 		#set ($ariaLabel = "${ariaLabel} vs.")
102: 	#else
103: 		#set ($ariaLabel = "${ariaLabel} at")
104: 	#end
105: 	#set ($ariaLabel = "${ariaLabel} ${event.opponent.name}:")
106: 	#if ($event.neutralSite.length() > 0)
107: 		#set ($ariaLabel = "${ariaLabel} @ ${event.neutralSite}:")
108: 	#end
109: 	#set ($ariaLabel = "${ariaLabel} Box Score")
110: aria-label="$ariaLabel"
111: #end
112: 
113: #macro (printBriefCategory $briefCatLabel $briefCatPos $r)
114: 	#if ($locale == "en_gb" && $briefCatLabel == "Defense")
115: 		#set ($briefCatLabel = "Defence")
116: 	#end
117: 
118: 	#if ($lineupDefaultSorting && $lineupDefaultSorting.containsKey($briefCatPos))
119: 		#set ($sort = $lineupDefaultSorting.get($briefCatPos))
120: 	#end
121: 
122: 	#if ($allowChooseSort)
123: 		#set ($sortEsc = $formatter.escapeXml($request.getParameter("sort")))
124: 		#if ($sortEsc.length() > 0)
125: 			#set ($sort = $sortEsc)
126: 		#end
127: 	#end
128: 
129: 	#set ($url = "")
130: 	#set ($url = "${page.sectionPage.sectionPage.url}/players?teamId=${attributes.teamId}&view=lineup&sort=$!{sort}&pos=${briefCatPos}&r=${r}&ajax=true&requri=${request.requestURI}&tmpl=stats-bios-template&dec=")
131: 
132: 	#if ($lineupMin && $lineupMin.containsKey($briefCatPos))
133: 		#set ($minStat = $lineupMin.get($briefCatPos))
134: 		#set ($url = $url + "&min=" + $minStat)
135: 	#end
136: 
137: 	#if ($lineupFilters)
138: 		#if ($lineupFilters.containsKey("cs"))
139: 			#set($url = $url + "&cs=n")
140: 		#end
141: 
142: 		#if ($lineupFilters.containsKey("skipBlank"))
143: 			#set($skipBlank = $lineupFilters.get("skipBlank"))
144: 
145: 			#if ($skipBlank.contains($briefCatPos))
146: 				#set($url = $url + "&skipBlank=n")
147: 			#end
148: 		#end
149: 	#end
150: 
151: <div class="mb-3">
152: 	<h5 class="sr-only">$briefCatLabel</h5>
153: 	<div class="tabbed-ajax-content" data-url="$url"></div>
154: 	## $website.includeAgain($url)
155: </div>
156: 
157: #end ## printBriefCategory
158: 
159: #macro(printBriefCategories $r)
160: 	## Set this for the inner page to pull something out
161: 
162: 	#if ($r == 1)
163: 		#set ($restrictionLabel = "conf")
164: 		$!request.setAttribute("teamStats", $splits.conference)
165: 	#else
166: 		#set ($restrictionLabel = "overall")
167: 		$!request.setAttribute("teamStats", $splits.overall)
168: 	#end
169: 
170: 	#if ($briefsCategoriesLabels)
171: 
172: 		#set($allowChooseSort = false)
173: 
174: 		#if ($lineupFilters && $lineupFilters.containsKey("allowChooseSort"))
175: 			#set ($allowChooseSort = true)
176: 		#end
177: 
178: 		#if ($briefsCategoriesLabels.containsKey("Game"))
179: 			#set ($briefsCategoriesGame = $briefsCategoriesLabels.get("Game"))
180: 
181: 			## Print Game categories tables
182: 			## Get the first Game category position
183: 			#set ($gamePos = $briefsCategoriesGame.keySet().iterator().next())
184: 
185: 			## GAME
186: 		<div #if ($gamePosActive) class="tab-pane active" #else class="tab-pane" #end id="lineup-${restrictionLabel}-game" role="tabpanel">
187: 			#printCategories($briefsCategoriesGame, "lineup", $restrictionLabel)
188: 		</div>
189: 
190: 			## Print the Season categories tables
191: 			#set ($briefsCategoriesSeason = $briefsCategoriesLabels.get("Season"))
192: 
193: 			## SEASON
194: 		<div #if ($seasonPosActive) class="tab-pane active" #else class="tab-pane" #end id="lineup-${restrictionLabel}-season" role="tabpanel">
195: 			#printCategories($briefsCategoriesSeason, "lineup", $restrictionLabel)
196: 		</div>
197: 
198: 			## Print the Minutes categories tables
199: 			#if ($briefsCategoriesLabels.containsKey("Minutes"))
200: 				#set($briefsCategoriesMinutes = $briefsCategoriesLabels.get("Minutes"))
201: 				#set($minutesPos = $briefsCategoriesMinutes.keySet().iterator().next())
202: 
203: 				#set($showMinutesTab = false)
204: 				#if ($lineupMinTeam && $lineupMinTeam.containsKey($minutesPos))
205: 					#set($lineupMinOverallValues = $lineupMinTeam.get($minutesPos))
206: 
207: 					#set($lineupMinOverallStat = $lineupMinOverallValues[0])
208: 					#set($lineupMinOverallMinVal = $lineupMinOverallValues[1])
209: 					#set($lineupMinOverallMinNumericValue = $tool.number.toNumber($lineupMinOverallMinVal))
210: 
211: 					#if ($tool.math.round($splits.overall[$lineupMinOverallStat]) && $tool.math.round($splits.overall[$lineupMinOverallStat]) >= $lineupMinOverallMinNumericValue)
212: 						#set($showMinutesTab = true)
213: 					#end
214: 				#end
215: 
216: 				#if ($showMinutesTab)
217: 					## MINUTES
218: 				<div #if ($minutesPosActive) class="tab-pane active" #else class="tab-pane" #end id="lineup-${restrictionLabel}-minutes" role="tabpanel">
219: 					#foreach($briefsCatMinutes in $briefsCategoriesMinutes.entrySet())
220: 						#printBriefCategory($briefsCatMinutes.value, $briefsCatMinutes.key, $r)
221: 					#end
222: 				</div>
223: 				#end
224: 			#end ## end minutes
225: 		#else
226: 
227: 			#set($briefsCategoriesSeason = $briefsCategoriesLabels.get("Season"))
228: 			#printCategories($briefsCategoriesSeason, 'season', $restrictionLabel)
229: 		#end
230: 
231: 	#elseif ($lineupFilters)
232: 
233: 		## All of the supported sports has lineupFilters, so print it without matter it does not have briefs category, yeah voleyball is you :)
234: 		#set ($sort = $formatter.escapeXml($request.getParameter("sort")))
235: 		#set ($url = "../players?teamId=${attributes.teamId}&view=lineup&sort=$!{sort}&r=${r}&ajax=true&requri=${request.requestURI}")
236: 	<div class="tabbed-ajax-content" data-url="$url"></div>
237: 	#else
238: 	We do not support this sport
239: 	#end
240: #end ## printBriefCategories
241: 
242: #macro (printCategories $briefCategoryLabels $v $restrictionLabel)
243: <div class="tab-container">
244: 	<div class="d-flex flex-row text-nowrap align-items-center justify-content-center">
245: 		<div class="secondary-tab-select-container flex-fill">
246: 			<select class="tab-nav-select-helper form-select" id="teaminfo-tabs-secondary-${v}-${restrictionLabel}-select" aria-label="Choose a stat group">
247: 				#foreach($label in $briefCategoryLabels.entrySet())
248: 					#set($catLabel = $label.value)
249: 					#if ($locale == "en_gb" && $catLabel == "Defense")
250: 						#set ($catLabel = "Defence")
251: 					#end
252: 
253: 					## This is thouroughly tested code to manage the default active tabbed content
254: 					#set ($selected = "")
255: 					#if($pos == $label.key || ($foreach.first && ($posEsc.empty || $briefCategoryLabels.containsKey($pos) == false)))
256: 						#set ($selected = "selected")
257: 					#end
258: 					<option value="#gamelog-${v}-${restrictionLabel}-${label.key}" ${selected}>${catLabel}</option>
259: 				#end
260: 			</select>
261: 			<script>
262: 				$('.tab-nav-select-helper').on('change', function(e) {
263: 					var id = $(this).val();
264: 					$('a[data-bs-target="' + id + '"]').tab('show');
265: 				});
266: 			</script>
267: 		</div>
268: 	</div>
269: 	<div class="tab-nav d-none">
270: 		<ul class="nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3" id="teaminfo-tabs-secondary-${v}-${restrictionLabel}" role="tablist">
271: 			#foreach($label in $briefCategoryLabels.entrySet())
272: 				#set($catLabel = $label.value)
273: 				#if ($locale == "en_gb" && $catLabel == "Defense")
274: 					#set ($catLabel = "Defence")
275: 				#end
276: 
277: 				#set ($active = "")
278: 				#if($pos == $label.key || ($foreach.first && ($posEsc.empty || $briefCategoryLabels.containsKey($pos) == false)))
279: 					#set ($active = "active")
280: 				#end
281: 
282: 				#set ($aClass = "nav-link text-nowrap text-center")
283: 
284: 				<li class="nav-item flex-fill flex-md-grow-0 flex-md-shrink-0">
285: 					<a class="${aClass} ${active}" href="${page.url}?view=${v}&pos=${label.key}" role="tab" data-bs-toggle="tab" data-bs-target="#gamelog-${v}-${restrictionLabel}-${label.key}">${catLabel}</a>
286: 				</li>
287: 			#end
288: 		</ul>
289: 	</div>
290: 	<div class="tab-content py-3">
291: 		#foreach ($briefCat in $briefCategoryLabels.entrySet())
292: 			#set ($classAttr = "tab-pane")
293: 
294: 			#set ($active = "")
295: 			#if($pos == $briefCat.key || ($foreach.first && ($posEsc.empty || $briefCategoryLabels.containsKey($pos) == false)))
296: 				#set ($active = "active")
297: 			#end
298: 
299: 			<div class="$classAttr $active" id="gamelog-${v}-${restrictionLabel}-${briefCat.key}" role="tabpanel">
300: 				#if ($v == "gamelog")
301: 					#gamelogData($briefCat.key)
302: 				#elseif ($v == "splits")
303: 					#splitsTeamNetworkData($briefCat.key)
304: 				#elseif ($v == "lineup" || $v == "season")
305: 					#printBriefCategory($briefCat.value, $briefCat.key, $r)
306: 				#end
307: 			</div>
308: 		#end
309: 	</div>
310: </div>
311: #end ## printCategories
312: 
313: #macro (printSeasonGameMinutesTabs $r)
314: 	#if ($briefsCategoriesLabels.containsKey("Game"))
315: 		#set ($briefsCategoriesGame = $briefsCategoriesLabels.get("Game"))
316: 		#set ($gamePos = $briefsCategoriesGame.keySet().iterator().next())
317: 
318: 		#set ($restrictionLabel = "overall")
319: 		#if ($r == 1)
320: 			#set ($restrictionLabel = "conf")
321: 		#end
322: 
323: 		#set ($showMinutesTab = false)
324: 		#if ($briefsCategoriesLabels.containsKey("Minutes"))
325: 			#set ($briefsCategoriesMinutes = $briefsCategoriesLabels.get("Minutes"))
326: 			#set ($minutesPos = $briefsCategoriesMinutes.keySet().iterator().next())
327: 
328: 			#if ($lineupMinTeam && $lineupMinTeam.containsKey($minutesPos))
329: 				#set ($lineupMinOverallValues = $lineupMinTeam.get($minutesPos))
330: 				#set ($lineupMinOverallStat = $lineupMinOverallValues[0])
331: 				#set ($lineupMinOverallMinVal = $lineupMinOverallValues[1])
332: 				#set ($lineupMinOverallMinNumericValue = $tool.number.toNumber($lineupMinOverallMinVal))
333: 
334: 				#if ($tool.math.round($splits.overall[$lineupMinOverallStat]) && $tool.math.round($splits.overall[$lineupMinOverallStat]) >= $lineupMinOverallMinNumericValue)
335: 					#set($showMinutesTab = true)
336: 				#end
337: 			#end
338: 		#end
339: 	<div class="tab-container">
340: 		<div class="tab-nav">
341: 			#set($gamePosActive = false)
342: 			#set($seasonPosActive = false)
343: 			#set($minutesPosActive = false)
344: 
345: 			#if($pos.equals($gamePos) || $pos.endsWith("g") || $pos.endsWith("gext"))
346: 				#set($gamePosActive = true)
347: 			#else
348: 				#if($showMinutesTab && $pos.equals($minutesPos))
349: 					#set($minutesPosActive = true)
350: 				#elseif($pos.equals($firstCategoryPos))
351: 					#set($seasonPosActive = true)
352: 				#end
353: 				#set($seasonPosActive = true)
354: 			#end
355: 
356: 
357: 			<ul class="nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3" data-pos="$pos" data-gamePos="$pos.equals($gamePos)" data-firstCategoryPos="$pos.equals($firstCategoryPos)" data-minutesPos="$pos.equals($minutesPos)" id="teaminfo-tabs-secondary-minutes" role="tablist">
358: 				#printSubTab($gamePosActive, "${url}?view=lineup&r=${r}&pos=${gamePos}", "Game", "#lineup-${restrictionLabel}-game")
359: 				#printSubTab($seasonPosActive, "${url}?view=lineup&r=${r}&pos=${firstCategoryPos}", "Season", "#lineup-${restrictionLabel}-season")
360: 				#if ($showMinutesTab)
361: 					#printSubTab($minutesPosActive, "${url}?view=lineup&r=${r}&pos=${minutesPos}", "Minutes", "#lineup-${restrictionLabel}-minutes")
362: 				#end
363: 			</ul>
364: 		</div>
365: 		<div class="tab-content py-3">
366: 			#printBriefCategories($r)
367: 		</div>
368: 	</div>
369: 	#end
370: #end ## printSeasonGameMinutesTabs
371: 
372: #macro (printTeamProfileTabs)
373: <div class="team-profile-contents">
374: 	<div class="d-flex flex-column flex-md-row justify-content-center gap-3">
375: 		<div class="column-a flex-grow-1">
376: 			<div class="d-flex flex-column justify-content-center gap-3">
377: 				<div class="tp-schedule-summary">
378: 					<div class="stat-table-heading h5">Schedule Summary</div>
379: 					<div class="stats-container table-responsive">
380: 						#set ($url = "${page.sectionPage.sectionPage.url}/schedule?teamId=${teamId}&tmpl=schedule-data-template&dec=")
381: 						<div class="tabbed-ajax-content" data-url="$url"></div>
382: 					</div>
383: 				</div>
384: 				<div class="tp-schedule-summary">
385: 					<div class="stat-table-heading h5">Recent Events</div>
386: 					<div class="stats-container table-responsive">#printRecentGames()</div>
387: 				</div>
388: 			</div>
389: 		</div>
390: 		<div class="column-b flex-grow-1">
391: 			<div class="tp-schedule-summary">
392: 				<div class="stat-table-heading h5">Team Statistics</div>
393: 				<div class="stats-container table-responsive">
394: 					#set ($url = "${page.sectionPage.sectionPage.url}/teams?tmpl=stats-teams-rank-template&rank=${teamId}&dec=")
395: 					<div class="tabbed-ajax-content" data-url="$url"></div>
396: 				</div>
397: 			</div>
398: 		</div>
399: 	</div>
400: </div>
401: #end ## printLineupTabs
402: 
403: #macro (printLineupTabs)
404: <div class="tab-container">
405: 	<div class="tab-nav">
406: 		<ul class="nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3" id="teaminfo-tabs-secondary-lineup" role="tablist">
407: 			#printSubTab($overallActive, "${url}?view=lineup&r=0&pos=${pos}", "Overall", "#lineup-overall-pane")
408: 			#if ($showConf)
409: 				#printSubTab($conferenceActive, "${url}?view=lineup&r=1&pos=${pos}", "Conference", "#lineup-conf-pane")
410: 			#end
411: 		</ul>
412: 	</div>
413: 	<div class="tab-content py-3">
414: 		<div class="tab-pane active" id="lineup-overall-pane" role="tabpanel">
415: 			#if ($briefsCategoriesLabels.containsKey("Game"))
416: 					#printSeasonGameMinutesTabs(0)
417: 				#else
418: 				#printBriefCategories(0)
419: 			#end
420: 		</div>
421: 		#if ($showConf)
422: 			<div class="tab-pane" id="lineup-conf-pane" role="tabpanel">
423: 				#if ($briefsCategoriesLabels.containsKey("Game"))
424: 						#printSeasonGameMinutesTabs(1)
425: 					#else
426: 					#printBriefCategories(1)
427: 				#end
428: 			</div>
429: 		#end
430: 	</div>
431: </div>
432: #end ## printLineupTabs
433: 
434: #set($statClass = "flex-fill text-center border-bottom border-end p-2 p-lg-3 col-6 col-md-3 col-lg-auto")
435: #macro (printStat $label $val $fmt)
436: <li class="$statClass" data-val="$val" data-format="$fmt">
437: 	<div class="d-flex flex-column justify-content-center align-items-center h-100">
438: 		<div class="small text-uppercase text-muted">$label</div>
439: 		<div class="fs-4 lh-1 text-nowrap fw-bold">$formatter.formatNumber($val, $fmt)</div>
440: 	</div>
441: </li>
442: #end
443: 
444: #macro (printStatGraph $label $val $fmt)
445: <li class="$statClass" data-val="$val" data-format="$fmt">
446: 	<div class="d-flex flex-column justify-content-center align-items-center h-100 proj-progress-card">
447: 		<div class="small text-uppercase text-muted">$label</div>
448: 		<div class="fs-4 lh-1 text-nowrap fw-bold">$formatter.formatNumber($val, $fmt)</div>
449: 		#set ($percent = $tool.math.mul($val, 100))
450: 		<div class="progress mt-2 w-100">
451: 			<div class="progress-bar bg-primary" role="progressbar" style="width: $formatter.formatNumber($percent, 1)%;" aria-valuenow="$formatter.formatNumber($percent, 1)" aria-valuemin="0" aria-valuemax="100"></div>
452: 		</div>
453: 	</div>
454: </li>
455: #end
456: 
457: #macro (printHighlights)
458: 	#if ($highlights)
459: 	<div class="page-highlights d-print-none">
460: 		<ul class="team-stats my-3 list-unstyled d-flex flex-wrap justify-content-center align-items-stretch border-top border-start">
461: 			#foreach ($highlight in $highlights.keySet())
462: 				#set ($value = "-")
463: 				#set ($value = $stats.get($highlight))
464: 				#set ($value = $tool.math.toInteger($value.replace('-', '0')))
465: 				#if($formats.get($highlight).equals("#.000") || $formats.get($highlight).equals(".000"))
466: 					#printStatGraph("$!highlights.get($highlight).replace('-per game', '/g').replace('per game', '')", $!value, $formats.get($highlight))
467: 				#else
468: 					#printStat("$!highlights.get($highlight).replace('-per game', '/g').replace('per game', '')", $!value, $formats.get($highlight))
469: 				#end
470: 
471: 			#end
472: 		</ul>
473: 	</div>
474: 	#end
475: 
476: #end ## macro printHighlights
477: #macro (gamelogData $p)
478: 
479: 	#set ($gamelogStats = $gamelogs.get($p))
480: 
481: <table class="table table-hover table-light">
482: 	<thead class="thead-dark">
483: 	<tr>
484: 		#printTableHeader("Date", "w-1 text-start")
485:                 #printTableHeader("Opponent", "")
486:                 #printTableHeader("Score", "text-center")
487:                 #foreach ($gamelog in $gamelogStats)
488: 		#printTableHeader($gamelog, "text-center")
489: 	#end
490: 	</tr>
491: 	</thead>
492: 	#foreach ($event in $events)
493: 		<tr>
494: 			<td class="text-nowrap text-start">
495: 				$formatter.formatDate($event.event.date, "MMM d")
496: 				#if (!$event.event.overall)
497: 					#set ($atLeastOneNotOverall = true) #
498: 				#end
499: 			</td>
500: 			<td class="text-nowrap">
501: 				#if ($event.event.neutralSite.length() > 0) vs. #elseif (!$event.event.home) at #end
502: 				$event.event.opponent.name
503: 			</td>
504: 			<td class="text-nowrap text-center">
505: 				#if ($event.event.statusCode >= 0)
506: 					#if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
507: 						<a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
508: 					#else
509: 						${event.event.APResult}
510: 					#end
511: 				#else &nbsp;
512: 				#end
513: 			</td>
514: 			#foreach ($gamelog in $gamelogStats.keySet())
515: 				#set ($value = "-")
516: 				#set ($value = $formatter.formatNumber($event.stats.get($gamelog), $formats.get($gamelog)))
517: 				<td class="text-center text-nowrap">$value</td>
518: 			#end
519: 		</tr>
520: 	#end
521: </table>
522: #end ## gamelogData
523: 
524: #macro (printRecentGames)
525: <table class="table table-hover">
526: 	<thead class="thead-dark">
527: 	<tr>
528: 		 #printTableHeader("Date", "w-1 text-end")
529: 			#printTableHeader("Opponent", "")
530: 			#printTableHeader("Result", " text-center")
531: 	</tr>
532: 	</thead>
533: 
534: 	#set ($eventEnd = -1)
535: 	#foreach ($event in $events)
536: 		#if ($event.event.result.resolved)
537: 			#set ($eventEnd = $velocityCount)
538: 		#end
539: 	#end
540: 
541: 	#set ($eventStart = $eventEnd - 9)
542: 	#if ($eventStart < 0) #set ($eventStart = 0) #end
543: 
544: 	#foreach ($event in $events)
545: 		#set ($wlClass = "fw-normal")
546: 		#if ($event.event.winner.name.length() > 0)
547: 			#if ($event.event.winner.name == $event.event.us.name)
548: 				#set ($wlClass = "winner")
549: 			#else
550: 				#set ($wlClass = "loser text-muted")
551: 			#end
552: 		#end
553: 		#if ($velocityCount >= $eventStart and $velocityCount <= $eventEnd)
554: 			<tr class="${wlClass}">
555: 				<td class="text-nowrap text-end"><span class="date">$formatter.formatDate($event.event.date, "M/d/yyyy")</span></td>
556: 				<td>
557: 					#if ($event.event.neutralSite.length() > 0) vs.
558: 					#elseif (!$event.event.home) at
559: 					#else ## nothing for a home game
560: 					#end
561: 					$event.event.opponent.name
562: 				</td>
563: 				<td class="text-center">
564: 					#if ($event.event.statusCode >= 0)
565: 						## FORMATTED RESULT
566: 						#set ($formattedResult = "")
567: 
568: 						#if ($resultFormat.equals("AP1"))
569: 							#set ($formattedResult = $event.event.APResult)
570: 						#elseif ($resultFormat.equals("AP2"))
571: 							#set ($formattedResult = $event.event.AP2Result)
572: 						#end
573: 
574: 						#if ($formattedResult.startsWith("W, "))
575: 							#set ($formattedResult = $formattedResult.replace("W, ", '<span class="winner event-winner">W</span>, '))
576: 						#elseif ($formattedResult.startsWith("L, "))
577: 							#set ($formattedResult = $formattedResult.replace("L, ", '<span class="loser event-loser">L</span>, '))
578: 						#end
579: 
580: 						#if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
581: 							<a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${formattedResult}</a>
582: 						#else
583: 							${formattedResult}
584: 						#end
585: 					#else
586: 						-
587: 					#end
588: 				</td>
589: 			</tr>
590: 		#end
591: 	#end
592: </table>
593: #end ## printRecentGames
594: 
595: #macro (splitTeamNetwork $statPosBriefs $label $stats)
596: <tr>
597: 	<th scope="row" class="fw-normal text-end">${label}</th>
598: 	#foreach ($brief in $statPosBriefs.keySet())
599: 		#set ($value = "-")
600: 		#set ($value = $!formatter.formatNumber($stats.get($brief), $formats.get($brief)))
601: 		<td class="text-center text-nowrap">#if ($value.length() > 0) $value #else - #end</td>
602: 	#end
603: </tr>
604: #end ## split
605: 
606: #macro (splitsTeamNetworkData $p)
607: 	#set ($statPosBriefs = $briefs.get($p))
608: 	#set ($colspan = $tool.math.add($statPosBriefs.size(), 1))
609: 
610: 	#if ($statPosBriefs.size() > 0)
611: 	<table class="table table-hover table-light">
612: 		<thead class="thead-dark">
613: 		<tr>
614: 			<th class="text-uppercase" aria-label="Title"> </th>
615: 			#foreach ($brief in $statPosBriefs)
616: 				#printTableHeader($brief, "text-center")
617: 			#end
618: 		</tr>
619: 		</thead>
620: 		#splitTeamNetwork($statPosBriefs, "Total", $splits.overall)
621: 		#if ($showConf)
622: 			#splitTeamNetwork($statPosBriefs, "Conference", $splits.conference)
623: 			#splitTeamNetwork($statPosBriefs, "Exhibition", $splits.exhibition)
624: 		#else
625: 			#splitTeamNetwork($statPosBriefs, "Exhibition", $splits.exhibition)
626: 		#end ## hide overall/conf
627: 
628: 		<tr class="bg-transparent">
629: 			<td colspan="$colspan">&nbsp;</td>
630: 		</tr>
631: 
632: 		#splitTeamNetwork($statPosBriefs, "Home", $splits.home)
633: 		#splitTeamNetwork($statPosBriefs, "Away", $splits.away)
634: 		#splitTeamNetwork($statPosBriefs, "Neutral", $splits.neutral)
635: 
636: 		<tr class="bg-transparent">
637: 			<td colspan="$colspan">&nbsp;</td>
638: 		</tr>
639: 
640: 		#foreach($gameResult in $gamesResults.entrySet())
641: 			#if ($gameResult.key == "wins")
642: 				#set ($splitGameResult = $splits.inWins)
643: 			#elseif ($gameResult.key == "losses")
644: 				#set ($splitGameResult = $splits.inLosses)
645: 			#elseif ($gameResult.key == "ties")
646: 				#set ($splitGameResult = $splits.inTies)
647: 			#end
648: 
649: 			#splitTeamNetwork($statPosBriefs, $gameResult.value, $splitGameResult)
650: 		#end
651: 
652: 		<tr class="bg-transparent">
653: 			<td colspan="$colspan">&nbsp;</td>
654: 		</tr>
655: 
656: 		#if ($monthsPlayed and $monthsPlayed.size() > 0)
657: 			#foreach($month in $monthsPlayed)
658: 				#if ($month == 'January')
659: 					#set ($splitMonth = $splits.january)
660: 				#elseif ($month == 'February')
661: 					#set ($splitMonth = $splits.february)
662: 				#elseif ($month == 'March')
663: 					#set($splitMonth = $splits.march)
664: 				#elseif ($month == 'April')
665: 					#set($splitMonth = $splits.april)
666: 				#elseif ($month == 'May')
667: 					#set ($splitMonth = $splits.may)
668: 				#elseif ($month == 'June')
669: 					#set ($splitMonth = $splits.june)
670: 				#elseif ($month == 'July')
671: 					#set($splitMonth = $splits.july)
672: 				#elseif ($month == 'August')
673: 					#set ($splitMonth = $splits.august)
674: 				#elseif ($month == 'September')
675: 					#set($splitMonth = $splits.september)
676: 				#elseif ($month == 'October')
677: 					#set($splitMonth = $splits.october)
678: 				#elseif ($month == 'November')
679: 					#set ($splitMonth = $splits.november)
680: 				#elseif ($month == 'December')
681: 					#set($splitMonth = $splits.december)
682: 				#end
683: 
684: 				#splitTeamNetwork($statPosBriefs, $month, $splitMonth)
685: 			#end ## foreach
686: 		#end
687: 	</table>
688: 	#end
689: #end ## splitsTeamNetworkData
690: 
691: #macro (printAttendance)
692: 	#if ($showAttendance)
693: 	<table class="table table-hover table-light">
694: 		<thead class="thead-dark">
695: 		<tr>
696: 			#printTableHeader("Date", "w-1 text-start")
697:                     #printTableHeader("Opponent", "")
698:                     #printTableHeader("Score", "text-center")
699:                     #printTableHeader("Attend", "text-center")
700: 		</tr>
701: 		</thead>
702: 		#set ($counter = 0)
703: 		#foreach ($event in $events)
704: 			<tr>
705: 				<td class="text-nowrap text-start">$formatter.formatDate($event.event.date, "MMM d")</td>
706: 				<td class="text-nowrap">
707: 					#if ($event.event.neutralSite.length() > 0) vs.
708: 					#elseif (!$event.event.home) at
709: 					#else ## nothing for a home game
710: 					#end
711: 					$event.event.opponent.name
712: 				</td>
713: 				<td class="text-nowrap text-center">
714: 					#if ($event.event.statusCode >= 0)
715: 						#if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
716: 							<a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
717: 						#else
718: 							${event.event.result}
719: 						#end
720: 					#else &nbsp; #end
721: 				</td>
722: 				<td class="text-nowrap text-center">
723: 					#set ($value = "-")
724: 					#set ($value = $!formatter.formatNumber($event.stats.get('at'), $formats.get('at')))
725: 					#if ($value.length() > 0) $value #else - #end
726: 				</td>
727: 			</tr>
728: 		#end
729: 	</table>
730: 	#end ## showAttendance
731: #end
732: 
733: #macro (printTab $viewParam $label)
734: 	#set ($classAttr = "nav-link text-nowrap text-center")
735: 	#if ($viewParam == $view)
736: 		#set ($classAttr = "${classAttr} active")
737: 	#end
738: <li class="nav-item flex-fill flex-md-grow-0 flex-md-shrink-0">
739: 	<a href="${page.url}?view=${viewParam}" class="$classAttr" role="tab" data-bs-toggle="tab" data-bs-target="#${viewParam}" aria-controls="$viewParam">$label</a>
740: </li>
741: #end
742: 
743: #macro (printSubTab $active $url $label $target)
744: <li class="nav-item flex-fill flex-md-grow-0 flex-md-shrink-0">
745: 	<a class="nav-link text-nowrap text-center #if ($active) active #end" href="$url" role="tab" data-bs-toggle="tab" data-bs-target="$target">$label</a>
746: </li>
747: #end
748: 
749: #macro (printPaneAttrs $viewParam)
750: 	#set ($classAttr = "tab-pane")
751: 	#if ($viewParam == $view)
752: 		#set ($classAttr = "tab-pane active")
753: 	#else
754: 		#set ($classAttr = "${classAttr} fade")
755: 	#end
756: 
757: class="$classAttr" role="tabpanel" id="$viewParam"
758: #end
759: 
760: #macro (printCoachViewUrl)
761: 	#set ($coachViewUrl = "${page.url}?tmpl=teaminfo-network-monospace-template")
762: 	#set ($enumCode = $sport.enumCode)
763: 
764: 	#if ($enumCode == 2)
765: 		#set ($coachViewUrl = "${coachViewUrl}&sort=ptspg")
766: 	#elseif ($enumCode == 1 || $enumCode == 11)
767: 		#set ($coachViewUrl = "${coachViewUrl}&sort=ab&pos=h")
768: 	#end
769: 
770: 	#if ($enumCode == 7 || $enumCode == 8 || $enumCode > 11) #else
771: 	<li class="nav-item" data-skip="true"><a href="$coachViewUrl" target="_blank" class="nav-link text-nowrap text-center">Coach's View</a></li>
772: 	#end
773: #end
774: 
775: #macro (printTabs)
776: 	$request.setAttribute("icl-responsive-tabs-script", true)
777: 
778: <div class="tab-nav">
779: 	<ul class="nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3" id="teaminfo-tabs" role="tablist">
780: 		#printTab("profile", "Team Profile")
781: 
782: 		#if ($showRoster)
783: 			#printTab("roster", "Roster")
784: 		#end
785: 
786: 		#printTab("lineup", "Lineup")
787: 		#printTab("gamelog", "Game Log")
788: 		#printTab("splits", "Split Stats")
789: 
790: 		#if ($showAttendance)
791: 			#printTab("attendance", "Attendance")
792: 		#end
793: 
794: 		#printCoachViewUrl
795: 	</ul>
796: </div>
797: #end ## printTabs
798: 
799: #macro (printFilters)
800: <div class="page-filters d-print-none">
801: 	<div class="btn-toolbar d-flex justify-content-between gap-3 flex-column flex-sm-row flex-sm-nowrap" role="toolbar" aria-label="Standings tool bar">
802: 		<div class="flex-fill">
803: 			<div class="d-flex flex-wrap align-items-end justify-content-between gap-3 flex-row">
804: 				$!request.setAttribute("pageObj", $page)
805:                 $website.includeAgain("conf-season-filter-template")
806: 			</div>
807: 		</div>
808: 		<div class="" role="group" aria-label="Print friendly version">
809: 			<a href="javascript:void(0);" onclick="printDynamicUrl()" class="btn btn-outline-secondary text-nowrap"><span class="fa fa-print"></span> Print</a>
810: 		</div>
811: 	</div>
812: </div>
813: #end ## printFilters
814: 
815: #macro (printImage $src $alt $class)
816: 	#set ($src = "${src}?max_height=576&max_width=576&crop=1")
817: 	<div class="ratio ratio-1x1 rounded-circle overflow-hidden img-thumbnail">
818: 		<span class="align-content-center">
819: 			<img src="${src}" alt="${alt}" class="${class} img-fluid" />
820: 		</span>
821: 	</div>
822: #end
823: ############ END MACROS #############
824: 
825: #set ($pageTitle = $page.title)
826: #if($pageTitle.trim().length() == 0)
827: 	#set($pageTitle = $page.sectionPage.getTitle())
828: #end
829: 
830: #if ($pageTitle.trim().length() == 0)
831: 	#set ($season = "")
832: 	#if ($page.url.matches(".*/\d{4}-\d{2}/.*"))
833: 		#set ($truncateStr = $page.url.split("/\d{4}-\d{2}/").get(0))
834: 		#set ($season = $page.url.replace($truncateStr, "").substring(1, 8))
835: 	#end
836: 
837: 	#set ($gender = "")
838: 	#if ($sport.enumCode == 6 or $sport.enumCode == 10)
839: 	#else
840: 		#if ($page.url.matches(".*/sports/m.*") || $page.url.matches(".*/sports/m-*"))
841: 			##set ($gender = "Men's")
842: 		#elseif ($page.url.matches(".*/sports/w.*") || $page.url.matches(".*/sports/w-*"))
843: 			##set ($gender = "Women's")
844: 		#end
845: 	#end
846: 
847: 	#set ($pageTitle = "${season} ${gender} ${sport} Statistics")
848: 
849: #end
850: 
851: #if ($attributes.get("school_name").length() > 0)
852: 	#set ($pageTitleExcludeSchoolName = "${pageTitle}")
853: 	#set ($pageTitle = "${pageTitle} - ${attributes.get('school_name')}")
854: #end
855: 
856: $!request.setAttribute("pageTitle", "${pageTitle}")
857: 
858: <head><title>$pageTitle</title></head>
859: 
860: 
861: <div class="page-content team-stats">
862: 
863: 	<div class="page-content-header d-flex flex-column align-items-center gap-3 mb-3">
864: 		<div class="tnt-heading">
865: 			<div class="tnt-main d-flex flex-column flex-grow-1 gap-3">
866: 				<div class="tnt-name-info">
867: 					<div class="d-flex align-items-center justify-content-between gap-3">
868: 						#if ($!attributes.get("teamId"))
869: 							<div class="tnt-left d-none d-sm-flex">
870: 								<div class="tnt-headshot position-relative" style="width:5rem;">
871: 									#printImage($website.teamLogo($!{attributes.get("teamId")}), ${attributes.get("team")}, "img-fluid")
872: 								</div>
873: 							</div>
874: 						#end
875: 						<div class="tnt-name-info-main flex-grow-1">
876: 							<div class="d-flex flex-column aling-items-center justify-content-between gap-3">
877: 								<div class="team-attributes">
878: 									<h1 class="m-0 p-0">
879: 										<span class="d-block">$pageTitleExcludeSchoolName</span>
880: 										<span class="d-block h4 text-muted">$!attributes.get("school_name")</span>
881: 									</h1>
882: 									#*
883: 									<ul class="list-unstyled list-inline-pipes d-flex align-items-center justify-content-start gap-2 m-0 w-100">
884: 										<li><a href="../teams?id=$!{attributes.get("teamId")}" aria-label="Team Stats - ${attributes.get("team")}">$!attributes.get("school_name")</a></li>
885: 										#if($season.length() > 0)<li><span>${season}</span></li>#end
886: 										#if($sport.length() > 0)<li><span>${sport}</span></li>#end
887: 									</ul>
888: 
889: 									 *#
890: 								</div>
891: 							</div>
892: 						</div>
893: 					</div>
894: 				</div>
895: 			</div>
896: 		</div>
897: 
898: 		#printFilters
899: 
900: 		## TEAM HIGHLIGHT STATS
901: 		#printHighlights
902: 	</div>
903: 
904: 	## TABS
905: 	<div class="tabs-container my-3">
906: 		#printTabs
907: 
908: 		<div class="tab-content p-3 border border-top-0">
909: 			#set ($url = $request.requestURI)
910: 
911: 			## TEAM PROFILE
912: 			<div #printPaneAttrs("profile")>
913: 				#printTeamProfileTabs()
914: 			</div> ## team profile
915: 
916: 			## ROSTER
917: 			#if ($showRoster)
918: 				<div #printPaneAttrs("roster")>
919: 					#set ($url = $website.includeAgain("../players?teamId=${teamId}&view=roster&ajax=true&requri=${request.requestURI}&tmpl=stats-bios-template"))
920: 					<div class="tabbed-ajax-content" data-url="$url"></div>
921: 				</div>
922: 			#end
923: 
924: 			## LINEUP
925: 			<div #printPaneAttrs("lineup")>
926: 				## start of overall/conference
927: 				#printLineupTabs()
928: 
929: 				<div class="dl-roster small">
930: 				Download roster:
931:                     <a href="../players?teamId=${attributes.teamId}&view=ext">${rosterExtension} (First Last) </a> |
932:                     <a href="../players?teamId=${attributes.teamId}&view=ext&type=lf"> ${rosterExtension} (Last, First)</a>
933:                     #if ($rosterExtraExtension)
934:                         <a href="../players?teamId=${attributes.teamId}&view=exte">${rosterExtraExtension} (First Last)</a> |
935:                         <a href="../players?teamId=${attributes.teamId}&view=exte&type=lf">${rosterExtraExtension} (Last, First)</a>
936:                     #end
937: 				</div>
938: 			</div> ## lineup
939: 
940: 			## GAMELOG
941: 			<div #printPaneAttrs("gamelog")>
942: 				<div class="stats-container table-responsive">
943: 					#if ($gamelogsCategoriesLabels && $gamelogsCategoriesLabels.size() > 1)
944: 						#printCategories($gamelogsCategoriesLabels, 'gamelog', '')
945: 					#else
946: 						#gamelogData($pos)
947: 					#end
948: 				</div>
949: 			</div>
950: 
951: 			## SPLITS
952: 			<div #printPaneAttrs("splits")>
953: 				<div class="stats-container table-responsive">
954: 					#if ($briefsTeamCategoriesLabels && $briefsTeamCategoriesLabels.size() > 1)
955: 						#printCategories($briefsTeamCategoriesLabels, 'splits', '')
956: 					#else
957: 						#splitsTeamNetworkData($pos)
958: 					#end
959: 				</div>
960: 			</div> ## splits
961: 
962: 			## ATTENDANCE
963: 			<div #printPaneAttrs("attendance")>
964: 				<div class="stats-container table-responsive">#printAttendance</div>
965: 			</div>
966: 		</div> ## tab-content
967: 	</div> ## tab-container
968: </div> ## stats-container
969: $wiki.su