Skip to navigation Skip to content Skip to footer

Player Stats

There was a problem with a Velocity script
Page/teaminfo-network-template
ErrorInvocation of method 'get' in class java.util.TreeMap threw exception java.lang.NullPointerException at cjksntz2wn52hh7y/teaminfo-network-template[line 220, column 29]
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: #set ($showconf = true)
7: #if ($options.get("stats_hide_conference") and $options.get("stats_hide_conference").equalsIgnoreCase("hide"))
8:     #set ($showconf = false)
9: #end
10: 
11: #set ($isSharedMeets = true)
12: #if ($sport and $sport.statistics == true)
13:     #set ($isSharedMeets = false)
14: #end
15: 
16: #set ($showTotalRow = false)
17: #if ($options.get("stats_individual_show_totals_row") and $options.get("stats_individual_show_totals_row").equalsIgnoreCase("show"))
18:     #set ($showTotalRow = true)
19: #end
20: 
21: #set ($isIncluded = $website.isIncluded())
22: 
23: #set ($isAjax = false)
24: #if ($request.getParameter('ajax').length() > 0)
25:     #set ($isAjax = true)
26:     #set ($isIncluded = true)
27: #end
28: 
29: #set ($idLength = 0)
30: #set ($idLength = $formatter.escapeXml($request.getParameter("id")).length())
31: #set ($teamCount = $page.getTeamIDs().size())
32: 
33: #set ($teamId = '')
34: #if ($request.getParameter("teamId").length() > 0)
35:     #set ($teamId = $request.getParameter("teamId"))
36: #end
37: 
38: #set ($isSingleTeam = false)
39: #if ($teamId.length() != 0 or $teamCount == 1)
40:     #set ($isSingleTeam = true)
41: #end
42: 
43: #if ($teamCount == 1 and (not $isIncluded) and $idLength == 0 and not $isSharedMeets)
44:     $website.decorate("")
45:     #set ($targetURL = "${page.url}/../teams?view=lineup")
46:     $response.sendRedirect($targetURL)
47:     #stop
48: #end
49: 
50: ## STAT LABELS
51: #if($request.getAttribute("statLabels").size() < 1)
52:     $website.includeAgain("stats-labels")
53:     #set ($statLabels = $!request.getAttribute("statLabels"))
54: #end
55: 
56: 
57: #set ($pos = "")
58: #set ($pos = $formatter.escapeXml($request.getParameter("pos")))
59: 
60: #if ($pos.length() == 0 and $briefsDefaultCategoryPosition and not $isIncluded and not $isSharedMeets)
61:     $website.decorate("")
62:     #set ($targetURL = "${page.url}?pos=" + $briefsDefaultCategoryPosition)
63:     #if($briefsDefaultSorting and $briefsDefaultSorting.containsKey($briefsDefaultCategoryPosition))
64:         #set ($targetURL = $targetURL + "&sort=" + $briefsDefaultSorting.get($briefsDefaultCategoryPosition))
65:     #end
66: 
67:     $response.sendRedirect($targetURL)
68: #stop
69: #end
70: 
71: ## We want to leave this undefined so we can test for that
72: #set ($minEsc = $formatter.escapeXml($request.getParameter("min")))
73: #if ($minEsc.length() > 0)
74:     #set ($min = $minEsc)
75: #end
76: 
77: #set ($cansort = $formatter.escapeXml($request.getParameter("cs")))
78: 
79: ## #set ($labels = $labels.get($positions.get($pos)))
80: 
81: #set ($url = $request.requestURI)
82: #if($isAjax)
83:     #if($request.getParameter("requri").length() > 0)
84:         #set ($url = $formatter.escapeXml($!request.getParameter("requri")))
85:     #end
86: #end
87: 
88: #set ($view = "")
89: #set ($view = $formatter.escapeXml($!request.getParameter("view")))
90: 
91: #set ($restriction = "0")
92: #set ($restrictionEsc = $formatter.escapeXml($request.getParameter("r")))
93: #if ($restrictionEsc.length() > 0)
94:     #set ($restriction = $restrictionEsc)
95: #end
96: 
97: #if($request.getAttribute("teamAbbr").size() < 1)
98:     $website.include("standings?tmpl=stats-standings-abbr-template")
99:     #set ($teamAbbr = $request.getAttribute("teamAbbr"))
100: #end
101: 
102: 
103: #*
104: <!--
105: Debug
106: URL: $url
107: isIncluded: $isIncluded
108: View: ${view}
109: Position: $pos
110: Sort: $sort
111: isAjax: $isAjax
112: isSharedMeets = $isSharedMeets
113: page.getTeamIDs.size() = $page.getTeamIDs().size()
114: teamId = $teamId
115: page.teams.entrySet() = $page.teams.entrySet().size()
116: isSingleTeam = $isSingleTeam
117: -->
118: *#
119: 
120: #if ($locale == "en_us")
121:     #set ($defLabel = "Defense")
122: #elseif ($locale == "en_gb")
123:     #set ($defLabel = "Defence")
124: #end
125: 
126: #macro (printTableHeader $label $class)
127:     ## Hack for now
128:     #set ($pos = "")
129:     #set ($pos = $formatter.escapeXml($request.getParameter("pos")))
130:     #set ($labels = $labels.get($pos))
131:     <th class="text-uppercase text-nowrap $class #if($sort == $key)table-active#end" #if($sort == $key) data-sort="1" #end data-key="$label" data-bs-toggle="tooltip" data-bs-placement="top" title="$!{labels.get($key)}">$label</th>
132: #end
133: 
134: #macro(printBriefsCategories $r)
135:     #set ($ariaLabel = "Overall Stats")
136:     #if ($r == "1")
137:         #set ($ariaLabel = "Conference Stats")
138:     #end
139:     #set ($briefsCategories = [])
140:     #if ($teamId.length() == 0 && $briefsCategoriesLabels)
141:         <div class="tab-container">
142:             #set ($activeCategory = "")
143:             #foreach ($entry in $briefsCategoriesLabels.entrySet())
144:                 #if ($foreach.first)
145:                     #set ($activeCategory = $entry.key)
146:                 #end
147:                 #if ($pos.length() > 0 && $entry.value.keySet().contains($pos))
148:                     #set ($activeCategory = $entry.key)
149:                 #end
150:             #end
151: 
152:             <ul class="nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-start gap-3" id="stats-bios-secondary-tabs" role="tablist">
153:                 #foreach ($category in $briefsCategoriesLabels.entrySet())
154:                     <li class="tabs-category nav-item text-center">
155:                         <a class="nav-link #if ($category.key == $activeCategory) active #end" href="#" role="tab" data-bs-toggle="tab" data-bs-target="#stats-bio-${category.key.toLowerCase()}-${r}" aria-label="${ariaLabel}: ${category.key}">$category.key</a>
156:                     </li>
157:                 #end
158:             </ul>
159: 
160:             <div class="tab-content py-3">
161:                 #foreach($category in $briefsCategoriesLabels.entrySet())
162: 
163:                     #set ($activeSubCategory = "")
164:                     #foreach ($subCategory in $category.value.entrySet())
165:                         #if ($foreach.first)
166:                             #set ($activeSubCategory = $subCategory.value)
167:                         #end
168:                         #if ($pos == $subCategory.key)
169:                             #set ($activeSubCategory = $subCategory.value)
170:                         #end
171:                     #end
172:                     <div class="tab-pane #if ($category.key == $activeCategory) active #end" id="stats-bio-${category.key.toLowerCase()}-${r}" data-pos="$pos">
173:                         <div class="tab-container">
174:                             <div class="d-flex flex-row text-nowrap align-items-center justify-content-center">
175:                                 <div class="tertiary-tab-select-container flex-fill">
176:                                     <select class="tab-nav-select-helper form-select" id="stats-bios-tertiary-select" aria-label="Choose a stat group">
177:                                         #foreach($briefsCat in $briefsCategoriesLabels.get("${category.key}").entrySet())
178:                                             <option value="#stats-bio-subs-${briefsCat.key.toLowerCase()}-${r}" #if ($briefsCat.value == $activeSubCategory || $foreach.first) selected #end>$briefsCat.value</option>
179:                                         #end
180:                                     </select>
181:                                     <script>
182:                                         $('.tab-nav-select-helper').on('change', function(e) {
183:                                             var id = $(this).val();
184:                                             $('a[data-bs-target="' + id + '"]').tab('show');
185: 
186:                                             // Adjust DataTables if present
187:                                             $('.dataTable').DataTable().columns.adjust().responsive.recalc();
188:                                         });
189:                                     </script>
190:                                 </div>
191:                             </div>
192:                             <ul class="d-none nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-start gap-3" id="stats-bios-tertiary-tabs" role="tablist">
193:                                 #foreach($briefsCat in $briefsCategoriesLabels.get("${category.key}").entrySet())
194:                                     <li class="tabs-category nav-item">
195:                                         <a class="nav-link #if ($briefsCat.value == $activeSubCategory) active #end" href="#" role="tab" data-bs-toggle="tab" data-bs-target="#stats-bio-subs-${briefsCat.key.toLowerCase()}-${r}" aria-label="${ariaLabel}: ${category.key}: ${briefsCat.value}">$briefsCat.value</a>
196:                                     </li>
197:                                 #end
198:                             </ul>
199: 
200:                             <div class="tab-content py-3">
201:                                 #foreach($briefsCat in $briefsCategoriesLabels.get("${category.key}").entrySet())
202:                                     <div class="tab-pane #if ($briefsCat.value == $activeSubCategory) active #end" id="stats-bio-subs-${briefsCat.key.toLowerCase()}-${r}">
203:                                         #printPlayers($briefsCat.key, $r)
204:                                     </div>
205:                                 #end
206:                             </div>
207:                         </div>
208:                     </div>
209:                 #end
210:             </div>
211:         </div> ## tab-container
212:     #else
213:         #printPlayers($pos, $r)
214:     #end
215: #end  ## printBriefsCategories
216: 
217: #macro(printPlayers $p $r)
218:     $request.setAttribute("icl-dataTables-script", true)
219: 
220:     #set ($briefs = $briefs.get($positions.get($p)))
221: 
222:     #set ($sortOrder = "asc")
223:     #if (($sort == "gs") || ($sort == "gp") || ($sort == "pts") || ($sort == "ptspm"))
224:         #set ($sortOrder = "desc")
225:     #end
226: 
227:     ## player stats (conference, naia)
228:     #set ($searching = "true")
229:     #set ($paging = "true")
230:     #set ($info = "true")
231:     #set ($fixedColumnStart = 1)
232:     #set ($ordering = "false")
233: 
234:     #if ($isIncluded || ($sort != 'name' && !$isSharedMeets))
235:         #set ($fixedColumnStart = 2)
236:     #end
237: 
238:     #if ($isIncluded)
239:         ## lineup pages
240:         #set ($searching = "false")
241:         #set ($paging = "false")
242:         #set ($info = "false")
243:         #set ($ordering = "true")
244:     #end
245: 
246: 
247: 
248: <div class="stats-container table-responsive-via-datatables">
249:     <table class="table table-hover table-light nowrap w-100" data-col-name="${sort}" data-sort-order="${sortOrder}" data-info="${info}" data-searching="${searching}" data-ordering="${ordering}" data-paging="${paging}" data-filter="false" data-responsive="false" data-fixed-column-start="${fixedColumnStart}" data-scroll-x="true" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
250:         #if ($minimum.length() > 0)
251:             <caption class="caption-side-top">$!minimum</caption>
252:         #end
253:         <thead class="thead-dark">
254:         <tr>
255:             #if ($isIncluded)
256:                 #printTableHeader("#", "text-center w-1")
257:             #elseif ($sort != 'name' && !$isSharedMeets)
258:                 #printTableHeader("Rk", "text-center w-1")
259:             #end
260: 
261:             #if ($cansort == 'n' || $isSharedMeets)
262:                 #printTableHeader("Name", "text-left")
263:             #else
264:                 <th class="text-left text-uppercase text-nowrap #if($sort.equals("name") && $ordering.equals("false")) table-active #end">Name</th>
265:             #end
266: 
267:             #if ($isIncluded)
268:                 #printTableHeader("Yr", "text-center")
269:                 #printTableHeader("Pos", "text-center")
270:             #elseif ($isSharedMeets)
271:                 #printTableHeader("Yr", "text-center")
272:             #else
273:                 #printTableHeader("Team", "text-center")
274:             #end
275: 
276:             ## Hack for now
277:             #set ($pos = "")
278:             #set ($pos = $formatter.escapeXml($request.getParameter("pos")))
279:             #set ($labels = $labels.get($pos))
280: 
281:             #foreach ($key in $briefs.keySet())
282:                 #if ($cansort == 'n')
283:                     #printTableHeader($briefs.get($key), "text-center")
284:                 #else
285:                     <th class="text-center text-uppercase text-nowrap #if($sort == $key && $ordering.equals("false"))table-active#end" #if($sort == $key) data-sort="1" #end data-key="$key">
286:                         <a class="text-reset" href="${url}?sort=${key}&view=${view}&pos=${p}&r=${r}" aria-label="sort table using ${briefs.get($key)}" data-sort-key="${key}" data-bs-toggle="tooltip" data-bs-placement="top" title="$!{labels.get($key)}">${briefs.get($key)}</a>
287:                     </th>
288:                 #end
289:             #end
290:         </tr>
291:         </thead>
292:         #set ($showCount = 0)
293:         #set ($rankValue = "abb")
294:         #set ($counter = 0)
295: 
296:         <tbody>
297:             #foreach ($individual in $individuals)
298:                 #if ($r == "1")
299:                     #set ($stats = $individual.statsConference)
300:                 #else
301:                     #set ($stats = $individual.stats)
302:                 #end
303: 
304:                 #set ($individualPosition = "")
305:                 #set ($individualPosition = $individual.position)
306:                 #set ($posVec = $individualPosition.split("/"))
307:                 #set ($individualPosition = $posVec[0])
308: 
309:                 #set ($show = "")
310: 
311:                 #set ($showAllPlayers = $options.get("stats_show_all_players"))
312:                 #set ($showPosition = $lineupShowPosition && $lineupShowPosition.containsKey($p))
313:                 #set ($showStat = $lineupShowStat && $lineupShowStat.containsKey($p))
314:                 #if (!$showAllPlayers.equalsIgnoreCase("yes") and ($showPosition or $showStat or $min))
315:                     #if ($showPosition)
316:                         #set ($indPositionsList = $lineupShowPosition.get($p))
317:                         #foreach ($indPos in $indPositionsList)
318:                             #if ($individualPosition.equalsIgnoreCase($indPos))
319:                                 #set ($show = "y")
320:                             #end
321:                         #end
322:                     #end
323: 
324:                     #if ($showStat)
325:                         #set ($statsList = $lineupShowStat.get($p))
326:                         #foreach ($statElem in $statsList)
327:                             #if ($stats.get($statElem) > 0)
328:                                 #set ($show = "y")
329:                             #end
330:                         #end
331:                     #end
332: 
333:                     #if ($min)
334:                         #set ($test = 0)
335:                         #set ($test = $stats.get($min))
336:                         #if ($test > 0)
337:                             #set ($show = "y")
338:                         #end
339:                     #end
340:                 #else
341:                     #set ($show = "y")
342:                 #end
343: 
344:                 #if ($show.length() > 0)
345:                     #set ($showCount = $showCount + 1)
346:                     #if ($showCount <= 125)
347:                     <tr>
348:                         #if ($isIncluded)
349:                             <td class="text-nowrap text-center #if($sort.equals("uniform") && $ordering.equals("false")) table-active #end">${individual.uniform}</td>
350:                         #elseif ($sort != 'name' && ! $isSharedMeets)
351:                             <td class="text-nowrap text-center">
352:                                 ## Need to figure out what value is
353:                                 #set ($value = ${stats.get($sort)})
354:                                 #if (!($value == $rankValue))
355:                                     ##This is a new rank value... let's update our ranking
356:                                     #set ($rank = $showCount)
357:                                     #set ($rankValue = $value)
358:                                 #end
359:                                 ${rank}
360:                             </td>
361:                         #end
362: 
363:                         <td class="text-nowrap text-left #if($sort.equals("name") && $ordering.equals("false")) table-active #end">
364:                             #if ($isSharedMeets)
365:                                 ${individual.firstName} ${individual.lastName}
366:                             #else
367:                                 <a href="${page.url}/${individual.pageName}">
368:                                     #if ($isIncluded)
369:                                         ${individual.firstName}
370:                                     #elseif ($individual.firstName.length() > 0)
371:                                         ${individual.firstName.substring(0, 1)}
372:                                     #end
373:                                     ${individual.lastName}
374:                                 </a>
375:                             #end
376:                         </td>
377: 
378:                         #if ($isIncluded)
379:                             <td class="text-nowrap text-center">$!{individual.year}</td>
380:                             <td class="text-nowrap text-center">
381:                                 #if ($individual.positionAbbreviation)
382:                                     $!individual.positionAbbreviation
383:                                 #else
384:                                     $!individual.position
385:                                 #end
386:                             </td>
387:                         #elseif ($isSharedMeets)
388:                             <td class="text-nowrap text-center">$!{individual.year}</td>
389:                         #else
390:                             #set ($teamname = "")
391:                             #set ($teamname = $individual.team)
392: 
393:                             ## TRY AND GRAB ALL THE TEAMS PAGES FROM WITHIN THE /CONF SECTION SETUP
394:                             ## THIS ALLOWS US TEAM NAMES TO LINK TO TEAMS STATS PAGE WITHIN THE /CONF SECTION IF SETUP
395:                             #*
396:                             $!request.setAttribute("pageObj", $page)
397:                             #if($request.getAttribute("conf_pages").size() < 1)
398:                                 $website.includeAgain("get-conf-pages?pageName=teams")
399:                                 #set ($confPages = $!request.getAttribute("conf_pages"))
400:                             #end
401: 
402:                             #set ($confTeams = {})
403: 
404:                             ## THIS BUILDS A MAPPING OF CONFERENCE NAMES AND THEIR ASSOCIATED TEAMS FROM THE TEAMS PAGE
405:                             #foreach ($conf in $confPages)
406:                                 #set ($ignore = $confTeams.put("$conf.name", { "teamsPage": $conf.pageObj, "teams": $conf.pageObj.teams }))
407:                             #end
408: 
409:                              *#
410: 
411:                             #set ($teamsURL = "teams?id=${individual.teamId}")
412:                             #*
413:                             #foreach ($entry in $confTeams.entrySet())
414:                                 #if ($entry.value.teams.containsValue($teamname))
415:                                     #set ($teamURL = "${entry.value.teamsPage.url}?id=${individual.teamId}")
416:                                 #end
417:                             #end
418: 
419:                              *#
420: 
421:                             #if($teamAbbr.size() > 0)
422:                                 ## THIS IS USED ONLY FOR SITES WANTING TO DISPLAY DIVISONS WITHIN THERE STATS
423:                                 #*
424:                                 #set ($teamname = $teamAbbr.get($individual.teamId))
425:                                 #set ($teamname = $teamAbbr.get($individual.team))
426:                                  *#
427:                             #end
428: 
429:                             <td class="text-nowrap text-center #if($sort.equals("team") && $ordering.equals("false")) table-active #end">
430:                                 #if ($teamname.length() > 0)
431:                                     <a href="$teamsURL">${teamname}</a>
432:                                 #end
433:                             </td>
434:                         #end
435: 
436:                         ## Briefs
437:                         #foreach ($key in $briefs.keySet())
438:                             #set ($value = "-")
439:                             #set ($value = $formatter.formatNumber(${stats.get($key)}, $!formats.get($key)))
440:                             <td class="text-center text-nowrap #if($sort == $key && $ordering.equals("false")) table-active #end" data-order="$tool.math.toDouble($value)">
441:                                 #if ($value.length() > 0)
442:                                     $value
443:                                 #else
444:                                     -
445:                                 #end
446:                             </td>
447:                         #end
448:                     </tr>
449:                     #end ## page limit
450:                 #end ## showing
451:             #end ## foreach individual
452:         </tbody>
453:         #if ($individuals.size() == 0)
454:             <caption>
455:                 #if ($isSharedMeets)
456:                     This team's roster is empty
457:                 #elseif ($hasBiosBeforeFilter)
458:                     No players meet the minimum
459:                 #else
460:                     No stats are available at this time
461:                 #end
462:             </caption>
463:         #end
464:     </table>
465: </div>
466:     #if ($isIncluded && $showTotalRow)
467:     <div class="table-totals mb-3 small text-start text-muted p-2">
468:         <div class="d-flex align-items-center justify-content-start totals gap-2 mb-2 flex-column flex-md-row">
469:             <div class="heading text-center text-md-end col-12 col-md-3 fw-bold">Totals</div>
470:             #set ($teamStats = $request.getAttribute("teamStats"))
471:             <div class="calculated-totals flex-fill w-100 m-0">
472:                 <ul class="m-0 list-unstyled d-flex flex-wrap justify-content-center align-items-stretch border-top border-start">
473:                     #foreach ($key in $briefs.keySet())
474:                         #set ($value = "-")
475:                         #set ($value = $formatter.formatNumber(${teamStats.get($key)}, $!formats.get($key)))
476:                         <li class="flex-fill text-center border-bottom border-end p-2 flex-fill">
477:                             <div class="d-flex flex-column justify-content-center align-items-center h-100">
478:                                 <span class="uppercase key initialism">$briefs.get($key)</span>
479:                                 <span class="value fw-bold m-0 lh-1 nowrap">#if ($value.length() > 0)${value}#else-#end</span>
480:                             </div>
481:                         </li>
482:                     #end
483:                 </ul>
484:             </div>
485:         </div>
486:         <div class="d-flex align-items-center justify-content-start opponent-totals gap-2 mb-2 flex-column flex-md-row">
487:             <div class="heading text-center text-md-end col-12 col-md-3 fw-bold">Opponents</div>
488:             <div class="calculated-totals flex-fill w-100 m-0">
489:                 <ul class="m-0 list-unstyled d-flex flex-wrap justify-content-center align-items-stretch border-top border-start">
490:                     #foreach ($key in $briefs.keySet())
491:                         #set ($keyopp = "${key}opp")
492:                         #set ($value = "-")
493:                         #set ($value = $formatter.formatNumber(${teamStats.get($keyopp)}, $!formats.get($key)))
494:                         <li class="flex-fill text-center border-bottom border-end p-2 flex-fill">
495:                             <div class="d-flex flex-column justify-content-center align-items-center h-100">
496:                                 <span class="uppercase key initialism">$briefs.get($key)</span>
497:                                 <span class="value fw-bold m-0 lh-1 nowrap">#if ($value.length() > 0)${value}#else-#end</span>
498:                             </div>
499:                         </li>
500:                     #end
501:                 </ul>
502:             </div>
503:         </div>
504:     </div>
505:     #end
506: #end ## printPlayers
507: 
508: #macro (printFilters)
509:     <div class="page-filters d-print-none">
510:         <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">
511:             ## #printTeamsFilter
512:             <div class="flex-fill">
513:                 <div class="d-flex flex-wrap align-items-end justify-content-between gap-3 flex-row">
514:                     $!request.setAttribute("pageObj", $page)
515:                     $website.include("conf-season-filter-template")
516:                 </div>
517:             </div>
518:             <div class="" role="group" aria-label="Print friendly version">
519:                 <a href="${page.url}?dec=printer-decorator" class="btn btn-outline-secondary text-nowrap"><span class="fa fa-print"></span> Print</a>
520:             </div>
521:         </div>
522:     </div>
523: #end ## printFilters
524: 
525: ### END MACROS ###
526: 
527: ## TEAMS LAYOUTS FOR SHARED MEETS
528: #if ($isSharedMeets && !$isSingleTeam)
529: 
530:     #set ($teams = $tool.sorter.sort($page.teams.entrySet(), "value"))
531:     #set ($teamsThreshold = 20)
532: 
533:     #if ($page.title.length() > 0)
534:     <h1>$page.title</h1>
535:     #else
536:     <h1>Teams</h1>
537:     #end
538: 
539:     #if ($teams.size() > $teamsThreshold)
540: 
541:         #set ($alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
542: 
543:     <div class="alphabet-filter" data-module="stats/alphabet-filter">
544:         <div class="alphabet-filter-chars">
545:             <span class="alphabet-filter-border"> | </span>
546:             #foreach ($alphabet in $alphabets.split(""))
547:                 #if ($alphabet.length() > 0)
548:                     <a href="#alphabet-filter-${alphabet}" class="alphabet-filter-char">$alphabet</a>
549:                     <span class="alphabet-filter-border"> | </span>
550:                 #end
551:             #end
552:         </div> ## alphabet-filter-char
553: 
554:     <div class="alphabet-filter-list">
555:     <div class="alphabet-filter-column">
556:         #set ($lastAlphabet = "")
557:         #set ($counter = 0)
558: 
559:         #foreach ($team in $teams)
560:             #set ($teamName = $team.value)
561: 
562:             #if ($teamName.charAt(0) != $lastAlphabet)
563:                 #set ($counter = $counter + 1)
564:                 #if ($counter > 1)
565:                 </div> ## alphabet-filter-section
566:                 #end
567:                 #if ($counter == 8 || $counter == 15)
568:                 </div> ## alphabet-filter-column
569:                 <div class="alphabet-filter-column">
570:                 #end
571:                 #set ($lastAlphabet = $teamName.charAt(0))
572:             <div class="alphabet-filter-section" id="alphabet-filter-${lastAlphabet}">
573:                 <h4 class="alphabet-filter-char-title">| $lastAlphabet |</h4>
574:             #end
575:             <a href="${page.url}?teamId=${team.key}" class="alphabet-filter-link">$teamName</a>
576:         #end
577:     </div> ## alphabet-filter-section
578:     </div> ## alphabet-filter-column
579:     </div> ## alphabet-filter-list
580:     </div> ## alphabet-filter
581: 
582:     #else ## plain list
583: 
584:     <div class="stats-container table-responsive">
585:         <table class="table table-hover">
586:             #foreach ($team in $teams)
587:                 <tr><td class="text"><a href="${page.url}?teamId=${team.key}">$team.value</a></td></tr>
588:             #end
589:             #if ($teams.size() == 0)
590:                 <tr><td>There are no teams that match this criteria</td></tr>
591:             #end
592:         </table>
593:     </div>
594: 
595:     #end ## teams threshold
596: 
597:     ## TEAMINFO ROSTER LAYOUT
598: #elseif ($isIncluded && $view == 'roster')
599: 
600:     #set ($baseball = $sport && $sport.XMLCode == "bsgame")
601: <div class="stats-container table-responsive table-responsive-webkit-overflow-scroll-fix">
602:     <table class="table table-hover">
603:         <thead class="thead-dark">
604:         <tr>
605:             <th scope="col" class="text-nowrap text-center w-1">#</th>
606:             <th scope="col" class="text-nowrap text-left text-start text-uppercase pinned-col">Name</th>
607:             <th scope="col" class="text-nowrap text-center text-uppercase ">Position</th>
608:             <th scope="col" class="text-nowrap text-center text-uppercase">Year</th>
609:             <th scope="col" class="text-nowrap text-center text-uppercase">Status</th>
610:             #if ($baseball)
611:                 <th scope="col" class="text-nowrap text-center text-uppercase">Height</th>
612:                 <th scope="col" class="text-nowrap text-center text-uppercase">Weight</th>
613:                 <th scope="col" class="text-nowrap text-center text-uppercase">Bats</th>
614:                 <th scope="col" class="text-nowrap text-center text-uppercase">Throws</th>
615:                 <th scope="col" class="text-nowrap text-center text-uppercase">DOB</th>
616:                 <th scope="col" class="text-nowrap text-left text-uppercase">Hometown</th>
617:             #end
618:         </tr>
619:         </thead>
620:         <tbody>
621:             #foreach ($individual in $individuals)
622:             <tr data-additional-roster-status="$additionalRosterStatus" data-player-status="$individual.playerStatus" data-active="$individual.active" #if($additionalRosterStatus && $individual.playerStatus == "Inactive") class="table-warning #if(!$wiki.valid()) d-none #end" #end>
623:                 <td scope="row" class="text text-center">${individual.uniform}</td>
624:                 <td class="text text-left text-start pinned-col">
625:                     <a href="${page.url}/${individual.pageName}">${individual.firstName} ${individual.lastName}</a>
626:                 </td>
627:                 <td class="text-center">
628:                     #if ($individual.positionAbbreviation)
629:                 $!individual.positionAbbreviation
630:               #else
631:                         $!individual.position
632:                     #end
633:                 </td>
634:                 <td class="text-center">$!{individual.year}</td>
635:                 <td class="text-center">
636:                     #if($additionalRosterStatus)
637:                         $individual.playerStatus
638:                     #elseif ($individual.active)
639:                         Active
640:                     #else
641:                         Inactive
642:                     #end
643:                 </td>
644:                 #if ($baseball)
645:                     <td class="text-center">$!{individual.dataMap["height"]}</td>
646:                     <td class="text-center">$!{individual.dataMap["weight"]}</td>
647:                     <td class="text-center">$!{individual.dataMap["bats"]}</td>
648:                     <td class="text-center">$!{individual.dataMap["throws"]}</td>
649:                     <td class="text-center">$!{individual.dataMap["born"]}</td>
650:                     <td class="text-left text-start">$!{individual.dataMap["hometown"]}</td>
651:                 #end
652:             </tr>
653:             #end
654:         </tbody>
655:     </table>
656: </div>
657: 
658:     ## SHARED MEETS PLAYERS
659: #elseif ($isSharedMeets)
660: 
661:     #if ($teamId)
662:         #set ($playersPageTitle = $page.title)
663:         #foreach($team in $page.teams.entrySet())
664:             #if ($teamId == $team.key)
665:                 #set ($playersPageTitle = $team.value)
666:             #end
667:         #end
668:     <h1>$playersPageTitle</h1>
669:     #end
670: 
671:     #printPlayers($pos, $restriction)
672: 
673:     ## PLAYERS / LINEUP
674: #else
675: 
676:     ## do not show these options on the lineup page
677:     #if (not $isIncluded)
678: 
679:         #if ($isAjax)
680:             $website.decorate('')
681:             #printPlayers($pos $restriction)
682:         #stop
683:         #end
684: 
685:         ## ARCHIVES
686:         #if ($page.contentType == "stat/bios")
687:         <div class="float-end">$website.include("navbar-playerstats-archive?tmpl=schedule-archive-list-template")</div>
688:         #end
689: 
690:         <div class="page-content-header d-flex flex-column align-items-center gap-3 mb-3">
691:             #if ($page.title.length() > 0 && !$isSharedMeets)
692:             <h1>$page.title</h1>
693:             #else
694:             <h1>Player Stats</h1>
695:             #end
696: 
697:             #printFilters
698: 
699:         </div>
700: 
701:         ##if ($minimum.length() > 0)
702:     <!--<div class="clearfix align-right">$!minimum</div>-->
703:         ##end
704: 
705:         #if ($showconf && !$isSharedMeets)
706:             $request.setAttribute("icl-responsive-tabs-script", true)
707:             <div class="tab-container">
708:                 <div class="tab-nav m-0">
709:                     <ul class="nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-start gap-3" id="stats-bios-primary-tabs" role="tablist">
710:                         <li class="nav-item flex-fill flex-md-grow-0 flex-md-shrink-0">
711:                             <a class="nav-link text-nowrap text-center #if ($restriction == "0") active #end" href="${url}?sort=${sort}&view=${view}&pos=${pos}&r=0" role="tab" data-bs-toggle="tab" data-bs-target="#overall" aria-controls="overall" aria-selected="true">Overall</a>
712:                         </li>
713:                         <li class="nav-item flex-fill flex-md-grow-0 flex-md-shrink-0">
714:                             <a class="nav-link text-nowrap text-center #if ($restriction == "1") active #end" href="${url}?sort=${sort}&view=${view}&pos=${pos}&r=1" role="tab" data-bs-toggle="tab" data-bs-target="#conf" aria-controls="conf">Conference</a>
715:                         </li>
716:                     </ul>
717:                 </div>
718: 
719:                 <div class="tab-content p-3 border">
720:                     <div class="tab-pane #if ($restriction.equals("0")) active #end" role="tabpanel" id="overall">
721:                         #printBriefsCategories("0")
722:                     </div>
723:                     <div class="tab-pane #if ($restriction.equals("1")) active #end" role="tabpanel" id="conf">
724:                         #printBriefsCategories("1")
725:                     </div>
726:                 </div>
727:             </div> ## tab-container overall/conf
728:         #else
729:             #printBriefsCategories($restriction)
730:         #end
731: 
732:     #else
733:         #printBriefsCategories($restriction)
734:     #end ## not isIncluded
735: #end ## LAYOUTS
736: 
737: $wiki.su