There was a problem with a Velocity script
Page/httpd/prestosports/site-public/WEB-INF/themes/generic-bootstrap/teaminfo-network-template
ErrorInvocation of method 'getOverall' in class com.prestosports.content.sport.stats.StatsSplitter threw exception java.lang.NullPointerException at /httpd/prestosports/site-public/WEB-INF/themes/generic-bootstrap/teaminfo-network-template[line 14, column 24]
Page source:
1: ## PICK UP OPTIONS
2: $website.include("options")
3: #set ($options = $request.getAttribute("options"))
4: 
5: #set ($locale = "en_us")
6: #set ($locale = $options.get("locale"))
7: 
8: #set ($showConf = true)
9: #if ($options.get("stats_hide_conference") and $options.get("stats_hide_conference").equalsIgnoreCase("hide"))
10:     #set ($showConf = false)
11: #end
12: 
13: #set ($teamId = $attributes.get("teamId"))
14: #set ($stats = $splits.overall)
15: 
16: #set ($pos = "")
17: #if ($sport.enumCode == 0) ## Football
18:     #set ($pos = "off")
19: #elseif ($sport.enumCode == 2) ## Basketball
20:     #set ($pos = "sh")
21: #elseif ($sport.enumCode == 3) ## Soccer
22:     #set ($pos = "kickers")
23: #elseif ($sport.enumCode == 9) ## Field Hockey
24:     #set ($pos = "fielder")
25: #end
26: 
27: #set ($posEsc = $formatter.escapeXml($request.getParameter("pos").toLowerCase()))
28: #if ($posEsc.length() > 0)
29:     #set ($pos = $posEsc)
30: #end
31: 
32: #if ($sport.enumCode == 2) ## Basketball
33:     #if ($pos == "bc")
34:         #set ($pos = "sh")
35:     #end
36:     #if ($pos == "bt")
37:         #set ($pos = "st")
38:     #end
39:     #if ($pos == "bm")
40:         #set ($pos = "sm")
41:     #end
42: #end
43: 
44: #if ($sport.enumCode == 3) ## Soccer
45:     #if ($pos == "goalie")
46:         #set ($pos = "kickers")
47:     #end
48:     #if ($pos == "gg")
49:         #set ($pos = "kg")
50:     #end
51: #end
52: 
53: #if ($sport.enumCode == 9) ## Field Hockey
54:     #if ($pos == "goalie")
55:         #set ($pos = "fielder")
56:     #end
57:     #if ($pos == "gg")
58:         #set ($pos = "kg")
59:     #end
60: #end
61: 
62: #set ($restriction = 0)
63: #set ($restrictionEsc = $formatter.escapeXml($request.getParameter("r")))
64: #if ($restrictionEsc.length() > 0 && $restrictionEsc.equals("1"))
65:     #set ($restriction = 1)
66: #end
67: 
68: #set ($view = "profile")
69: #if ($request.getParameter("view"))
70:     #set ($view = $formatter.escapeXml($!request.getParameter("view")))
71: #end
72: 
73: #if ($briefsCategoriesLabels)
74:     #set($briefsCategoriesSeason = $briefsCategoriesLabels.get("Season"))
75:     #set($firstCategoryPos = $briefsCategoriesSeason.keySet().iterator().next())
76: #end
77: 
78: #set ($showRoster = false)
79: #if ($options.get("stats_show_roster") and $options.get("stats_show_roster").equalsIgnoreCase("yes"))
80:     #set ($showRoster = true)
81: #end
82: 
83: #set ($showAttendance = true)
84: #if ($options.get("stats_show_attendance") and $options.get("stats_show_attendance").equalsIgnoreCase("hide"))
85:     #set ($showAttendance = false)
86: #end
87: 
88: ## MACROS
89: #macro (printTableHeader $label $class)
90: 	<th class="text-uppercase $class">$label</th>
91: #end
92: 
93: #macro (printResultAriaLabel $event)
94:     #set ($ariaLabel = "${event.sport} event: ${formatter.formatDate($event.date, 'MMMM d hh:mm a:')}")
95:     #if ($event.neutralSite.length() > 0 || $event.home) 
96:         #set ($ariaLabel = "${ariaLabel} vs.")
97: 	#else
98: 		#set ($ariaLabel = "${ariaLabel} at")
99: 	#end
100: 	#set ($ariaLabel = "${ariaLabel} ${event.opponent.name}:")
101: 	#if ($event.neutralSite.length() > 0)
102: 		#set ($ariaLabel = "${ariaLabel} @ ${event.neutralSite}:")
103: 	#end
104: 	#set ($ariaLabel = "${ariaLabel} Box Score")
105:     aria-label="$ariaLabel"
106: #end
107: 
108: #macro (printLineupCategories $categories $r)
109: 
110:     #if ($allowChooseSort)
111:         #set ($sortParam = "")
112:     
113:         #if ($lineupDefaultSorting && $lineupDefaultSorting.containsKey($pos))
114:             #set ($sortParam = $lineupDefaultSorting.get($pos))
115:         #end
116:         
117:         #if ($request.getParameter("sort").length() > 0)
118:             #set ($sortParam = $request.getParameter("sort"))
119:         #end
120:     #end
121: 
122:     <div class="brief-categories">
123:         <select class="category-switcher form-control my-3">
124:             #foreach ($category in $categories.entrySet())
125:                 #set ($briefCategoryURL = "${page.url}?tmpl=brief-category-template&pos=${category.key}&r=${r}")
126:                 #if ($sortParam.length() > 0)
127:                     #set ($briefCategoryURL = "${briefCategoryURL}&sort=${sortParam}")
128:                 #end
129:                 
130:                 <option value="$briefCategoryURL">$category.value</option>
131:             #end
132:         </select>
133:         <div class="panes">
134:         #foreach($category in $categories.entrySet())
135:             #if ($foreach.count == 1)
136:             <div class="pane active">Loading...</div>
137:             #else
138:             <div class="pane d-none">Loading...</div>
139:             #end
140:         #end
141:         </div>
142:     </div>
143: #end ## printLineupCategories
144: 
145: #macro(printBriefCategories $r)
146: ## Set this for the inner page to pull something out
147: 	#if ($r == 1)
148: 		#set ($restrictionLabel = "conf")
149: 		$!request.setAttribute("teamStats", $splits.conference)
150: 	#else
151: 		#set ($restrictionLabel = "overall")
152: 		$!request.setAttribute("teamStats", $splits.overall)
153: 	#end
154: 
155: 	#if ($briefsCategoriesLabels)
156: 		#set($allowChooseSort = false)
157:   	
158: 		#if ($lineupFilters && $lineupFilters.containsKey("allowChooseSort"))
159: 			#set ($allowChooseSort = true)
160: 		#end
161: 
162: 		#if ($briefsCategoriesLabels.containsKey("Game"))
163: 			#set ($briefsCategoriesGame = $briefsCategoriesLabels.get("Game"))
164:       	
165: 			## Print Game categories tables
166: 			## Get the first Game category position
167: 			#set ($gamePos = $briefsCategoriesGame.keySet().iterator().next())
168:       
169: 			## GAME
170: 			<div #if ($pos.equals($gamePos)) class="tab-pane active" #else class="tab-pane" #end id="lineup-${restrictionLabel}-game" role="tabpanel">
171: 			    #printLineupCategories($briefsCategoriesGame, $r)
172: 			</div>
173: 
174: 			## Print the Season categories tables
175: 			#set ($briefsCategoriesSeason = $briefsCategoriesLabels.get("Season"))
176:    
177: 			## SEASON
178: 			<div #if ($pos.equals($firstCategoryPos)) class="tab-pane active" #else class="tab-pane" #end id="lineup-${restrictionLabel}-season" role="tabpanel">
179:     			#printLineupCategories($briefsCategoriesSeason, $r)
180: 			</div>
181:   		
182: 			## Print the Minutes categories tables
183: 			#if ($briefsCategoriesLabels.containsKey("Minutes"))
184: 				#set($briefsCategoriesMinutes = $briefsCategoriesLabels.get("Minutes"))
185: 				#set($minutesPos = $briefsCategoriesMinutes.keySet().iterator().next())
186:       		
187: 				#set($showMinutesTab = false)
188: 				#if ($lineupMinTeam && $lineupMinTeam.containsKey($minutesPos))
189: 					#set($lineupMinOverallValues = $lineupMinTeam.get($minutesPos))
190:   			
191: 					#set($lineupMinOverallStat = $lineupMinOverallValues[0])
192: 					#set($lineupMinOverallMinVal = $lineupMinOverallValues[1])
193: 					#set($lineupMinOverallMinNumericValue = $tool.number.toNumber($lineupMinOverallMinVal))
194:   			
195: 					#if ($tool.math.round($splits.overall[$lineupMinOverallStat]) && $tool.math.round($splits.overall[$lineupMinOverallStat]) >= $lineupMinOverallMinNumericValue)
196: 						#set($showMinutesTab = true)
197: 					#end	
198: 				#end
199: 
200: 				#if ($showMinutesTab)
201: 					## MINUTES
202: 					<div #if ($pos.equals($minutesPos)) class="tab-pane active" #else class="tab-pane" #end id="lineup-${restrictionLabel}-minutes" role="tabpanel">
203:     					#printLineupCategories($briefsCategoriesMinutes, $r)
204: 					</div>
205: 				#end
206: 			#end ## end minutes
207: 		#else
208: 		    ## SINGLE SEASON
209: 		    #set($briefsCategoriesSeason = $briefsCategoriesLabels.get("Season"))
210:             #printLineupCategories($briefsCategoriesSeason, $r)
211: 		#end
212: 		
213: 	#elseif ($lineupFilters)
214: 
215: 		## All of the supported sports has lineupFilters, so print it without matter it does not have briefs category, yeah voleyball is you :)
216: 		#set ($sort = $formatter.escapeXml($request.getParameter("sort")))
217: 		#set ($url = "../players?teamId=${attributes.teamId}&view=lineup&sort=$!{sort}&r=${r}")
218: 		$website.includeAgain($url)
219: 		
220: 	#else
221: 		We do not support this sport
222: 	#end
223: #end ## printBriefCategories
224: 
225: #macro (printCategories $briefCategoryLabels $v)
226: 	<div class="nav nav-pills mb-3" role="tablist">
227: 		#foreach($label in $briefCategoryLabels.entrySet())
228: 			#set($catLabel = $label.value)
229: 			#if ($locale == "en_gb" && $catLabel == "Defense")
230: 				#set ($catLabel = "Defence")
231: 			#end
232: 			#set ($btnClass = "btn btn-outline-secondary rounded-0")
233: 			#if ($pos == $label.key || ($pos.length() == 0 && $velocityCount == 1)) 
234: 				#set ($btnClass = "${btnClass} active") 
235: 			#end 
236: 			<button class="$btnClass" data-url="${page.url}?view=${v}&pos=${label.key}" data-toggle="tab" data-target="#gamelog-${v}-${label.key}" style="margin-right:-1px">${catLabel}</button>
237: 		#end
238: 	</div>
239: 	<div class="tab-content">
240: 		#foreach ($briefCat in $briefCategoryLabels.entrySet())
241: 			#set ($classAttr = "tab-pane")
242: 			#if ($briefCat.key == $pos || ($pos.length() == 0 && $velocityCount == 1))
243: 				#set ($classAttr = "${classAttr} active")
244: 			#end
245: 			<div class="$classAttr" id="gamelog-${v}-${briefCat.key}" role="tabpanel">
246: 				#if ($v == "gamelog")
247: 					#gamelogData($briefCat.key)
248: 				#elseif ($v == "splits")
249: 					#splitsTeamNetworkData($briefCat.key)
250: 				#end
251: 			</div>
252: 		#end  
253: 	</div>
254: #end ## printCategories
255:   
256: #macro (printSeasonGameMinutesTabs $r)
257:     #if ($briefsCategoriesLabels.containsKey("Game"))
258:         #set ($briefsCategoriesGame = $briefsCategoriesLabels.get("Game"))
259:         #set ($gamePos = $briefsCategoriesGame.keySet().iterator().next())
260: 		
261: 		#set ($restrictionLabel = "overall")
262: 		#if ($r == 1)
263: 			#set ($restrictionLabel = "conf")
264: 		#end
265:         	
266: 		#set ($showMinutesTab = false)
267:         #if ($briefsCategoriesLabels.containsKey("Minutes"))
268:             #set ($briefsCategoriesMinutes = $briefsCategoriesLabels.get("Minutes"))
269:             #set ($minutesPos = $briefsCategoriesMinutes.keySet().iterator().next())
270:     		
271:             #if ($lineupMinTeam && $lineupMinTeam.containsKey($minutesPos))
272:                 #set ($lineupMinOverallValues = $lineupMinTeam.get($minutesPos))
273:                 #set ($lineupMinOverallStat = $lineupMinOverallValues[0])
274:                 #set ($lineupMinOverallMinVal = $lineupMinOverallValues[1])
275:                 #set ($lineupMinOverallMinNumericValue = $tool.number.toNumber($lineupMinOverallMinVal))
276:   			
277:                 #if ($tool.math.round($splits.overall[$lineupMinOverallStat]) && $tool.math.round($splits.overall[$lineupMinOverallStat]) >= $lineupMinOverallMinNumericValue)
278:                     #set($showMinutesTab = true)
279:                 #end	
280:   		    #end
281: 		#end
282: 		
283: 		#set ($sortParam = "")
284: 		#if ($request.getParameter("sort").length() > 0)
285: 		    #set ($sortParam = $request.getParameter("sort"))
286: 		    #set ($sortParam = "&sort=${sortParam}")
287: 		#end
288: 		
289: 		<div class="nav nav-pills" role="tablist">
290: 			#printSubTab($pos.equals($gamePos), "${url}?view=lineup&r=${r}&pos=${gamePos}${sortParam}", "Game", "#lineup-${restrictionLabel}-game")
291: 			#printSubTab($pos.equals($firstCategoryPos), "${url}?view=lineup&r=${r}&pos=${firstCategoryPos}${sortParam}", "Season", "#lineup-${restrictionLabel}-season")
292:     		#if ($showMinutesTab)
293:                 #printSubTab($pos.equals($minutesPos), "${url}?view=lineup&r=${r}&pos=${minutesPos}${sortParam}", "Minutes", "#lineup-${restrictionLabel}-minutes")
294:     		#end
295: 		</div>
296: 		<div class="tab-content">
297: 			#printBriefCategories($r)
298: 		</div>
299:     #end
300: #end ## printSeasonGameMinutesTabs
301:   
302: #macro (printLineupTabs)
303: 	#set ($navClass = "nav nav-pills")
304: 	#if ($briefsCategoriesLabels.containsKey("Game"))
305: 		#set ($navClass = "${navClass} float-left mr-3")
306: 	#end
307: 	<div class="$navClass" role="tablist">
308: 		#printSubTab(true, "${url}?view=lineup&r=0&pos=${pos}", "Overall", "#lineup-overall-pane")
309: 		#if ($showConf)
310: 			#printSubTab(false, "${url}?view=lineup&r=1&pos=${pos}", "Conference", "#lineup-conf-pane")
311: 		#end
312: 	</div>
313: 		
314: 	<div class="tab-content">
315: 		<div class="tab-pane active" id="lineup-overall-pane" role="tabpanel">
316: 			#if ($briefsCategoriesLabels.containsKey("Game"))
317: 				#printSeasonGameMinutesTabs(0)
318: 			#else
319: 				#printBriefCategories(0)
320: 			#end
321: 		</div>
322: 		#if ($showConf)
323: 			<div class="tab-pane" id="lineup-conf-pane" role="tabpanel">
324: 				#if ($briefsCategoriesLabels.containsKey("Game"))
325: 					#printSeasonGameMinutesTabs(1)
326: 				#else
327: 					#printBriefCategories(1)
328: 				#end
329: 			</div>
330: 		#end
331: 	</div>
332: #end ## printLineupTabs
333: 
334: #macro (printHighlights)
335:     #if ($highlights)
336:         <div class="d-flex flex-wrap">
337:         #foreach ($highlight in $highlights.keySet())
338:             #set ($value = "-")
339:             #set ($value = $formatter.formatNumber($stats.get($highlight), $formats.get($highlight)))
340:             #set ($classAttr = "flex-fill p-2 border border-white bg-primary text-white text-center")
341:             <div class="$classAttr">
342:                 <div class="text-uppercase small">$!highlights.get($highlight).replace("per game", "")</div>
343:                 <div class="h5 m-0 font-weight-bold">$!value</div>
344:             </div>
345:         #end
346:         </div>
347:     #end
348: #end ## macro printHighlights
349: 
350: #macro (gamelogData $p)
351: 
352:     #set ($gamelogStats = $gamelogs.get($p))
353: 
354: <table class="table table-hover">
355:     <thead class="thead-dark">
356:     <tr>
357: 		#printTableHeader("Date", "w-1 text-start text-left")
358:                 #printTableHeader("Opponent", "")
359:                 #printTableHeader("Score", "text-center")
360:                 #foreach ($gamelog in $gamelogStats)
361: 		#printTableHeader($gamelog, "text-center")
362: 	#end
363:     </tr>
364:     </thead>
365:         #foreach ($event in $events)
366:             <tr>
367:                 <td class="text-nowrap text-start text-left">
368:                     $formatter.formatDate($event.event.date, "MMM d") 
369:                     #if (!$event.event.overall)
370:                         #set ($atLeastOneNotOverall = true) # 
371:                     #end
372:                 </td>
373:                 <td class="text-nowrap">
374: 					#if ($event.event.neutralSite.length() > 0) vs. #elseif (!$event.event.home) at #end
375: 					$event.event.opponent.name
376:                 </td>
377:                 <td class="text-nowrap text-center">
378:                 #if ($event.event.statusCode >= 0)
379:                     #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
380:                         <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
381:                     #else
382:                         ${event.event.APResult}
383:                     #end
384:                 #else &nbsp; 
385:                 #end
386:                 </td>
387:                 #foreach ($gamelog in $gamelogStats.keySet())
388:                     #set ($value = "-")
389:                     #set ($value = $formatter.formatNumber($event.stats.get($gamelog), $formats.get($gamelog)))
390:                     <td class="text-center text-nowrap">$value</td>
391:                 #end
392:             </tr>
393:         #end
394:     </table>
395: #end ## gamelogData
396: 
397: #macro (printRecentGames)
398:     <table class="table table-hover">
399:             <thead class="thead-dark">
400: 		<tr>
401: 			#printTableHeader("Date", "w-1 text-start text-left")
402: 			#printTableHeader("Opponent", "")
403: 			#printTableHeader("Result", "text-center")
404: 		</tr>
405:             </thead>
406: 
407:         #set ($eventEnd = -1)
408:         #foreach ($event in $events)
409:             #if ($event.event.result.resolved)
410:                 #set ($eventEnd = $velocityCount)
411:             #end
412:         #end
413: 
414:         #set ($eventStart = $eventEnd - 5)
415:         #if ($eventStart < 0) #set ($eventStart = 0) #end
416: 
417:         #foreach ($event in $events)
418:             #if ($velocityCount >= $eventStart and $velocityCount <= $eventEnd)
419:                 <tr>
420:                     <td class="text-nowrap text-start text-left">$formatter.formatDate($event.event.date, "MMM d")</td>
421:                     <td>
422:                         #if ($event.event.neutralSite.length() > 0) vs.
423:                         #elseif (!$event.event.home) at
424:                         #else ## nothing for a home game
425:                         #end
426:                         $event.event.opponent.name
427:                     </td>
428:                     <td class="text-center">
429:                         #if ($event.event.statusCode >= 0)
430:                             #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
431:                                 <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
432:                             #else
433:                                 ${event.event.APResult}
434:                             #end
435:                         #end
436:                     </td>
437:                 </tr>
438:             #end
439:         #end
440:     </table>
441: #end ## printRecentGames
442: 
443: #macro (splitTeamNetwork $statPosBriefs $label $stats)
444:     <tr>
445:         <th scope="row" class="font-weight-normal text-end text-right">${label}</th>
446:         #foreach ($brief in $statPosBriefs.keySet())
447:             #set ($value = "-")
448:             #set ($value = $!formatter.formatNumber($stats.get($brief), $formats.get($brief)))
449:             <td class="text-center text-nowrap">#if ($value.length() > 0) $value #else - #end</td>
450:         #end
451:     </tr>
452: #end ## split
453: 
454: #macro (splitsTeamNetworkData $p)
455: 	#set ($statPosBriefs = $briefs.get($p))
456: 	#set ($colspan = $tool.math.add($statPosBriefs.size(), 1))  
457:     
458: 	#if ($statPosBriefs.size() > 0)
459:     <table class="table table-hover">
460:         <thead class="thead-dark">
461:         <tr>
462:             <th class="text-uppercase" aria-label="Title"> </th>
463: 			#foreach ($brief in $statPosBriefs)
464: 				#printTableHeader($brief, "text-center")
465: 			#end
466:         </tr>
467:         </thead>
468: 			#splitTeamNetwork($statPosBriefs, "Total", $splits.overall)
469: 			#if ($showConf)
470: 				#splitTeamNetwork($statPosBriefs, "Conference", $splits.conference)
471: 				#splitTeamNetwork($statPosBriefs, "Exhibition", $splits.exhibition)
472: 			#else
473: 				#splitTeamNetwork($statPosBriefs, "Exhibition", $splits.exhibition)
474: 			#end ## hide overall/conf
475: 
476: 			<tr class="bg-transparent">
477: 				<td colspan="$colspan">&nbsp;</td>
478: 			</tr>
479: 
480: 			#splitTeamNetwork($statPosBriefs, "Home", $splits.home)
481: 			#splitTeamNetwork($statPosBriefs, "Away", $splits.away)
482: 			#splitTeamNetwork($statPosBriefs, "Neutral", $splits.neutral)
483: 
484: 			<tr class="bg-transparent">
485: 				<td colspan="$colspan">&nbsp;</td>
486: 			</tr>
487: 
488: 			#foreach($gameResult in $gamesResults.entrySet())
489: 				#if ($gameResult.key == "wins")
490: 					#set ($splitGameResult = $splits.inWins)
491: 				#elseif ($gameResult.key == "losses")
492: 					#set ($splitGameResult = $splits.inLosses)
493: 				#elseif ($gameResult.key == "ties")
494: 					#set ($splitGameResult = $splits.inTies)
495: 				#end
496:     
497: 				#splitTeamNetwork($statPosBriefs, $gameResult.value, $splitGameResult)
498: 			#end
499: 
500: 			<tr class="bg-transparent">
501: 				<td colspan="$colspan">&nbsp;</td>
502: 			</tr>
503: 
504: 			#if ($monthsPlayed and $monthsPlayed.size() > 0)
505: 				#foreach($month in $monthsPlayed)
506: 					#if ($month == 'January')
507: 						#set ($splitMonth = $splits.january)
508: 					#elseif ($month == 'February')
509: 						#set ($splitMonth = $splits.february)
510: 					#elseif ($month == 'March')
511: 						#set($splitMonth = $splits.march)
512: 					#elseif ($month == 'April')
513: 						#set($splitMonth = $splits.april)
514: 					#elseif ($month == 'May')
515: 						#set ($splitMonth = $splits.may)
516: 					#elseif ($month == 'June')
517: 						#set ($splitMonth = $splits.june)
518: 					#elseif ($month == 'July')
519: 						#set($splitMonth = $splits.july)
520: 					#elseif ($month == 'August')
521: 						#set ($splitMonth = $splits.august)
522: 					#elseif ($month == 'September')
523: 						#set($splitMonth = $splits.september)
524: 					#elseif ($month == 'October')
525: 						#set($splitMonth = $splits.october)
526: 					#elseif ($month == 'November')
527: 						#set ($splitMonth = $splits.november)
528: 					#elseif ($month == 'December')
529: 						#set($splitMonth = $splits.december)
530: 					#end
531:   
532: 					#splitTeamNetwork($statPosBriefs, $month, $splitMonth)
533: 				#end ## foreach
534: 			#end
535: 		</table>
536: 	#end
537: #end ## splitsTeamNetworkData
538: 
539: #macro (printAttendance)
540:     #if ($showAttendance)
541:         <table class="table table-hover">
542:                 <thead class="thead-dark">
543:                 <tr>
544: 					#printTableHeader("Date", "w-1 text-start text-left")
545:                     #printTableHeader("Opponent", "")
546:                     #printTableHeader("Score", "text-center")
547:                     #printTableHeader("Attend", "text-center")
548:                 </tr>
549:                 </thead>
550:             #set ($counter = 0)
551:             #foreach ($event in $events)
552:                 <tr>
553:                     <td class="text-nowrap text-start text-left">$formatter.formatDate($event.event.date, "MMM d")</td>
554:                     <td class="text-nowrap">
555:                         #if ($event.event.neutralSite.length() > 0) vs.
556:                         #elseif (!$event.event.home) at
557:                         #else ## nothing for a home game
558:                         #end
559:                         $event.event.opponent.name
560:                     </td>
561:                     <td class="text-nowrap text-center">
562:                     #if ($event.event.statusCode >= 0)
563:                         #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
564:                             <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
565:                         #else
566:                             ${event.event.result}
567:                         #end
568:                     #else &nbsp; #end
569:                     </td>
570:                     <td class="text-nowrap text-center">
571:                         #set ($value = "-")
572:                         #set ($value = $!formatter.formatNumber($event.stats.get('at'), $formats.get('at')))
573:                         #if ($value.length() > 0) $value #else - #end
574:                     </td>
575:                 </tr>
576:             #end
577:         </table>
578:     #end ## showAttendance
579: #end
580: 
581: #macro (printTab $viewParam $label)
582: 	#set ($classAttr = "nav-link text-nowrap")
583: 	#if ($viewParam == $view)
584: 		#set ($classAttr = "${classAttr} active")
585: 	#end
586: 	<li class="nav-item"><a href="${page.url}?view=${viewParam}" class="$classAttr" role="tab" data-toggle="tab" data-target="#${viewParam}" aria-controls="$viewParam">$label</a></li>
587: #end
588: 
589: #macro (printSubTab $active $url $label $target)
590: 	#set ($classAttr = "btn btn-sm btn-outline-secondary rounded-0")
591: 	#if ($active)
592: 		#set ($classAttr = "${classAttr} active")
593: 	#end
594: 	<button data-url="$url" class="$classAttr" data-toggle="tab" data-target="$target" style="margin-right:-1px">$label</button>
595: #end
596: 
597: #macro (printPaneAttrs $viewParam)
598: 	#set ($classAttr = "tab-pane")
599: 	#if ($viewParam == $view)
600: 		#set ($classAttr = "tab-pane active")
601: 	#else
602: 		#set ($classAttr = "${classAttr} fade")
603: 	#end
604: 	
605: 	class="$classAttr" role="tabpanel" id="$viewParam"
606: #end
607: 
608: #macro (printCoachViewUrl)
609: 	#set ($coachViewUrl = "${page.url}?tmpl=teaminfo-network-monospace-template")
610:     #set ($enumCode = $sport.enumCode)
611:     
612: 	#if ($enumCode == 2)
613:         #set ($coachViewUrl = "${coachViewUrl}&sort=ptspg") 
614:     #elseif ($enumCode == 1 || $enumCode == 11)
615:         #set ($coachViewUrl = "${coachViewUrl}&sort=ab&pos=h")
616:     #end
617:     
618:     #if ($enumCode == 7 || $enumCode == 8 || $enumCode > 11) #else
619:         <li class="nav-item" data-skip="true"><a href="$coachViewUrl" target="_blank" class="nav-link text-nowrap">Coach's View</a></li>
620:     #end
621: #end
622: 
623: #macro (printTabs)
624: 	<div class="tab-nav" style="overflow-x:auto">
625:     	<ul class="nav nav-tabs flex-nowrap" role="tablist">
626:     		#printTab("profile", "Team Profile")
627:     		
628:     		#if ($showRoster)
629:     			#printTab("roster", "Roster")
630:     		#end
631:     		
632:     		#printTab("lineup", "Lineup")
633:     		#printTab("gamelog", "Game Log")
634:     		#printTab("splits", "Split Stats")
635:     		
636:     		#if ($showAttendance)
637:     			#printTab("attendance", "Attendance")
638:     		#end
639:     		
640:             #printCoachViewUrl
641:         </ul>
642: 	</div>
643: #end ## printTabs
644: 
645: #macro (printSeasonsList)
646:     $!request.setAttribute("pageObj", $page)
647:     
648:     #set ($seasonPages = [])
649:     $website.include("get-season-pages")
650:     #set ($seasonPages = $request.getAttribute("season_pages"))
651:     
652:     #if ($seasonPages.size() > 0)
653:         ## This is used to define the current season. It is assumed that the list of available seasons will have the most recent first.
654:         $!request.setAttribute("current_season", $seasonPages.get(0).season.name)
655: 
656:         <div class="season-selector flex-fill">
657:             <div class="input-group">
658:                 <div class="input-group-prepend">
659:                     <label class="input-group-text" for="filter-by-season-select" id="filter-by-season-group-text">Season</label> 
660:                 </div>
661:                 
662:                 <select id="season-selector" class="form-control season-filter custom-select" onchange="location=this.value;" aria-describedby="filter-by-season-group-text" id="filter-by-season-select" aria-label="Change the season by selecting an option from the list">
663:                 #foreach ($entry in $seasonPages)
664: 					#set ($seasonLabel = $entry.season.name)
665:                     #if ($entry.season.title.length() > 0)
666:                         #set ($seasonLabel = $entry.season.title)
667:                     #end
668: 
669:                     #if ($entry.pageObj.url == $request.requestURI)
670:                         <option value="$entry.pageObj.url" selected="selected">$seasonLabel</option>
671:                     #else
672:                         <option value="$entry.pageObj.url">$seasonLabel</option>
673:                     #end
674:                 #end
675:                 </select>
676:             </div>
677:         </div>
678:     #end
679: #end ## macro printSeasonsList
680: ############ END MACROS #############
681: 
682: #set ($pageTitle = $page.title)
683: #if ($pageTitle.trim().length() == 0)
684: 	#set ($season = "")
685: 	#if ($page.url.matches(".*/\d{4}-\d{2}/.*"))
686: 		#set ($truncateStr = $page.url.split("/\d{4}-\d{2}/").get(0))
687: 		#set ($season = $page.url.replace($truncateStr, "").substring(1, 8))
688: 	#end
689: 	
690: 	#set ($gender = "")
691: 	#if ($sport.enumCode == 6 or $sport.enumCode == 10)
692: 	#else
693: 		#if ($page.url.matches(".*/sports/m.*") || $page.url.matches(".*/sports/m-*"))
694: 			##set ($gender = "Men's")
695: 		#elseif ($page.url.matches(".*/sports/w.*") || $page.url.matches(".*/sports/w-*"))
696: 			##set ($gender = "Women's")
697: 		#end
698: 	#end
699: 	
700: 	#set ($pageTitle = "${season} ${gender} ${sport} Statistics")
701: 
702: #end
703: 
704: #if ($attributes.get("school_name").length() > 0)
705: 	#set ($pageTitle = "${pageTitle} - ${attributes.get('school_name')}")
706: #end
707: 
708: $!request.setAttribute("pageTitle", "${pageTitle}")
709: 
710: <head><title>$pageTitle</title></head>
711: 	
712: 
713: <div class="page-content team-stats" data-module="bs-scripts/brief-category-switcher">
714:     
715:     <h1>$pageTitle</h1>
716:     #printSeasonsList
717: 	
718: 	## TEAM HIGHLIGHT STATS
719: 	<div class="my-3">#printHighlights</div>
720: 
721:     ## TABS
722: 	<div class="tabs-container my-3" data-module="stats/tabs">
723:         #printTabs
724:     
725:         <div class="tab-content p-3 border border-top-0">
726:             
727:             ## TEAM PROFILE
728:             <div #printPaneAttrs("profile")>
729:                 
730:                 <div class="row">
731:                     <div class="col-lg">
732:     					<div class="mb-3">
733: 							<h5>Team Summary</h5>
734: 							<div class="stats-container table-responsive">
735: 								$website.include("${page.sectionPage.sectionPage.url}/schedule?teamId=${teamId}&tmpl=schedule-data-template")
736: 							</div>
737:     					</div>
738:     					<div class="mb-3">
739:     						<h5>Recent Results</h5>
740:     						<div class="stats-container table-responsive">#printRecentGames</div>
741:     					</div>
742:                     </div>
743:                     <div class="col-lg">
744:     					<div class="mb-3">
745: 							<h5>Team Stats</h5>
746: 							<div class="stats-container table-responsive">
747: 								$website.include("${page.sectionPage.url}/teams?tmpl=stats-teams-rank-template&rank=${teamId}")
748: 							</div>
749:     					</div>
750:                     </div>
751:                 </div>
752:             </div> ## team profile
753:     
754:             ## ROSTER
755:             #if ($showRoster)
756:                 <div #printPaneAttrs("roster")>
757: 					$website.includeAgain("../players?teamId=${teamId}&view=roster&tmpl=stats-bios-template")
758:                 </div>
759:             #end
760:     
761:             ## LINEUP
762:             <div #printPaneAttrs("lineup")>
763:                 ## start of overall/conference
764:                 #set ($url = $request.requestURI)
765:     			
766:     			#printLineupTabs
767:                
768:                 Download roster:
769:                 <a href="../players?teamId=${attributes.teamId}&view=ext">${rosterExtension} (First Last) </a> | 
770:                 <a href="../players?teamId=${attributes.teamId}&view=ext&type=lf"> ${rosterExtension} (Last, First)</a>
771:                 #if ($rosterExtraExtension)
772:                     <a href="../players?teamId=${attributes.teamId}&view=exte">${rosterExtraExtension} (First Last)</a> | 
773:                     <a href="../players?teamId=${attributes.teamId}&view=exte&type=lf">${rosterExtraExtension} (Last, First)</a>
774: 				#end
775:             </div> ## lineup
776:     
777:             ## GAMELOG
778:             <div #printPaneAttrs("gamelog")>
779:             	<div class="stats-container table-responsive">
780: 					#if ($gamelogsCategoriesLabels && $gamelogsCategoriesLabels.size() > 1)
781: 						#printCategories($gamelogsCategoriesLabels, 'gamelog')
782: 					#else
783: 						#gamelogData($pos)
784: 					#end
785:     			</div>
786:             </div>
787:     
788:             ## SPLITS
789:             <div #printPaneAttrs("splits")>
790:     			<div class="stats-container table-responsive">
791: 					#if ($briefsTeamCategoriesLabels && $briefsTeamCategoriesLabels.size() > 1)
792: 						#printCategories($briefsTeamCategoriesLabels, 'splits')
793: 					#else
794: 						#splitsTeamNetworkData($pos)
795: 					#end
796: 				</div>
797:             </div> ## splits
798:     
799:             ## ATTENDANCE
800:             <div #printPaneAttrs("attendance")>
801: 				<div class="stats-container table-responsive">#printAttendance</div>
802:             </div>
803:         </div> ## tab-content
804: 	</div> ## tab-container
805: </div> ## stats-container
806: $wiki.su