There was a problem with a Velocity script
Page sports/sball/2015-16/stats-leader-template
Error Invocation of method 'substring' in class java.lang.String threw exception java.lang.StringIndexOutOfBoundsException: String index out of range: 1 at w0a6ym3iwtqq5ux6sports/sball/2015-16/stats-leader-template[line 118, column 132]
Page source:
1: ## PICK UP OPTIONS
2: $website.include("options")
3: #set ($options = $request.getAttribute("options"))
4:
5: #* BEGIN TABLE STYLE OPTIONS ***************#
6: #set($tableClass = "")
7: #set($tableHeadClass = "thead-dark")
8: #if ($options.get("table_bordered") != "false") #set($tableClass = "$tableClass table-bordered") #end
9: #if ($options.get("table_hover") != "false") #set($tableClass = "$tableClass table-hover") #end
10: #if ($options.get("table_head_dark") == "true" || $request.getParameter("thead") == "dark") #set($tableHeadClass = "$tableHeadClass thead-dark") #end
11: #if ($options.get("table_head_dark") == "false" || $request.getParameter("thead") == "light") #set($tableHeadClass = "$tableHeadClass thead-light") #end
12: #* END TABLE STYLES OPTIONS ****************#
13:
14: #set ($locale = "en_us")
15: #set ($locale = $options.get("locale"))
16: #set ($jsRenderingParam = "jsRendering=true")
17:
18: $website.include("standings?tmpl=stats-standings-abbr-template&${jsRenderingParam}")
19: #set ($teamAbbr = $request.getAttribute("teamAbbr"))
20:
21: #set ($rosterHeadshots = [])
22: $website.include("${page.sectionPage.url}/roster?tmpl=roster-headshots-template&excludeBlank=true&${jsRenderingParam}")
23: #set ($rosterHeadshots = $!request.getAttribute("roster_headshots"))
24:
25: #set ($lastIndex = $page.url.lastIndexOf("/"))
26: #set ($seasonPath = $page.url.substring(0, $lastIndex))
27: #set ($playersUrl = "${seasonPath}/players")
28: #set ($teamsUrl = "${seasonPath}/teams")
29:
30: #set ($dropdownsWrapperClass = "dropdowns d-flex justify-content-center align-items-center flex-wrap gap-3 p-3 border-top")
31:
32: $!request.setAttribute("locale", $locale)
33: $!request.setAttribute("jsRenderingParam", $jsRenderingParam)
34: $!request.setAttribute("playersPageName", $playersPageName)
35: $!request.setAttribute("teamsPageName", $teamsPageName)
36:
37: ## Keep this in case the config template is overriden into the site, but now the default configuration is into the sport metadata
38: #if ($website.exists("stats-leader-config-template"))
39: $website.include("stats-leader-config-template")
40: #if ($sport.enumCode == 0)
41: #set ($pageLayout = $request.getAttribute("footballTabsConfig"))
42: #elseif ($sport.enumCode == 1 || $sport.enumCode == 11)
43: #set ($pageLayout = $request.getAttribute("baseballTabsConfig"))
44: #elseif ($sport.enumCode == 5)
45: #set ($pageLayout = $request.getAttribute("iceHockeyTabsConfig"))
46: #elseif ($sport.enumCode == 3)
47: #set ($pageLayout = $request.getAttribute("soccerTabsConfig"))
48: #elseif ($sport.enumCode == 9)
49: #set ($pageLayout = $request.getAttribute("fieldHockeyTabsConfig"))
50: #elseif ($sport.enumCode == 6 or $sport.enumCode == 10)
51: #set ($pageLayout = $request.getAttribute("lacrosseTabsConfig"))
52: #elseif ($sport.enumCode == 12)
53: #set ($pageLayout = $request.getAttribute("waterPoloTabsConfig"))
54: #elseif ($sport.enumCode == 4)
55: #set ($pageLayout = $request.getAttribute("volleyballTabsConfig"))
56: #elseif ($sport.enumCode == 2)
57: #set ($pageLayout = $request.getAttribute("basketballlTabsConfig"))
58: #end
59: #end
60:
61: #*******************
62: ****** MACROS ******
63: *******************#
64:
65: #macro (printImage $src $alt $class)
66: <div class="ratio ratio-1x1 img-mh-3 img-mw-3 rounded-circle overflow-hidden img-thumbnail">
67: <img src="${src}" alt="$!{alt}" class="lazyloaded img-fluid h-auto ${class}" loading="lazy" />
68: </div>
69: #end
70:
71: #macro (leaders $leaders $key $statName $th)
72: #set ($label = $labels.get($key))
73: #set ($atLeastOneStat = false)
74: <div class="table-responsive">
75: <table class="table ${tableClass} small align-middle w-100">
76: <caption class="visually-hidden">${label} Leaders</caption>
77: <thead class="${tableHeadClass}">
78: <tr>
79: <th scope="col">${label}</th>
80: <th scope="col" class="stat-val align-center text-uppercase" aria-label="games played"><abbr title="Games Played">GP</abbr></th>
81: <th scope="col" class="stat-val align-center text-uppercase table-active" aria-label="${statName}"><abbr title="${statName}">$th</abbr></th>
82: </tr>
83: </thead>
84: <tbody>
85: #foreach ($leader in $leaders)
86: #if ($leader.key == $key)
87: #foreach ($player in $leader.value)
88: #if($player.stats.get($key) > 0)
89: <tr>
90: <td>
91: <div class="d-flex align-items-center gap-1">
92: #if ($player.teamId.length() > 0)
93: #set ($playerName = $player.firstName + ' '+ $player.lastName)
94: #set ($src = "/info/images/default-headshot.png")
95: #if ($rosterHeadshots.size() > 0)
96: #foreach ($rosterPlayer in $rosterHeadshots)
97: #if ($playerName == $rosterPlayer.name)
98: #if ($rosterPlayer.headshot.length() > 0)
99: #set ($src = $rosterPlayer.headshot)
100: #elseif ($website.exists("/images/setup/default-headshot.png"))
101: #set ($src = "/images/setup/default-headshot.png")
102: #elseif ($website.exists("/images/setup/headshot_default.jpg"))
103: #set ($src = "/images/setup/headshot_default.jpg")
104: #end
105: #end
106: #end
107: #set ($src = "${src}?max_width=48")
108: #printImage($src, $playerName, "start-50 translate-middle-x")
109: #else
110: #printImage($website.teamLogo($player.teamId), $player.team, "top-50 start-50 translate-middle p-1")
111: #end
112: #end
113: <div class="d-flex flex-column">
114: #set ($playerUrl = "${playersUrl}?id=${player.playerId}")
115: #if ($player.pageName.length() > 0)
116: #set ($playerUrl = "${playersUrl}/${player.pageName}")
117: #end
118: <a href="${playerUrl}" class="player-name text-decoration-none">${player.firstName.substring(0,1)} ${player.lastName}</a>
119: #if ($player.teamId.length() > 0)
120: #set ($teamUrl = "${teamsUrl}?id=${player.teamId}")
121: #if ($player.teamPageName.length() > 0)
122: #set ($teamUrl = "${teamsUrl}/${player.teamPageName}")
123: #end
124: <a href="${teamUrl}" class="player-team fst-italic small text-decoration-none text-muted lh-1">$player.team</a>
125: #else
126: <span class="player-team fst-italic small text-muted">$player.team</span>
127: #end
128: </div>
129: </div>
130: </td>
131: #set ($atLeastOneStat = true)
132: <td class="stat-gp align-center">$formatter.formatNumber(${player.stats.get('gp')}, $formats.get('gp'))</td>
133: <td class="stat-val align-center table-active">$formatter.formatNumber(${player.stats.get($key)}, $formats.get($key))</td>
134: </tr>
135: #end
136: #end
137: #end ## players
138: #end ## leaders
139: #if (! $atLeastOneStat)
140: <tr><td colspan="3">Stats aren't available</td></tr>
141: #end
142: </tbody>
143: <tfoot class="text-center">
144: <tr>
145: <td colspan="3" class="border-bottom-0 p-0">
146: #set ($url = "${seasonPath}/players?sort=${key}&${jsRenderingParam}")
147: <a class="btn btn-link d-block text-decoration-none btn-sm" href="${url}" aria-label="View all by ${statName}">View All</a>
148: </td>
149: </tr>
150: </tfoot>
151: </table>
152: </div>
153: #end ## macro leaders
154:
155: #macro (generateLeaderSections $leaders $config $columnClass)
156: #foreach ($section in $config)
157: <div class="${columnClass}">
158: #leaders($leaders, $section.key, $section.statName, $section.abbr)
159: </div>
160: #end
161: #end ## generateLeaderSections
162:
163: #macro (generateTabs $tabConfig $columnClass)
164: #if ($tabConfig.tabs.size() > 1)
165: <div class="row">
166: <div class="col-xs-12 col-sm-12">
167: <div class="tab-container">
168: <ul class="nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3" id="stats-leader-tabs" role="tablist">
169: #foreach ($tab in $tabConfig.tabs)
170: #set ($tabId = $tab.label.toLowerCase().replace(' ', '-'))
171: <li class="tabs-category nav-item text-center" role="presentation">
172: <a class="nav-link #if($foreach.index == 0)active#end" href="#" role="tab" data-bs-toggle="tab" data-bs-target="#${tabId}-pane" aria-selected="#if($foreach.index == 0)true#{else}false#end" aria-controls="${tabId}-pane" id="${tabId}-tab" tabindex="#if($foreach.index == 0)0#{else}-1#end">${tab.label}</a>
173: </li>
174: #end
175: </ul>
176: <div class="tab-content pt-3">
177: #foreach ($tab in $tabConfig.tabs)
178: #set ($tabId = $tab.label.toLowerCase().replace(' ', '-'))
179: <div class="tab-pane #if($foreach.index == 0)active#end" id="${tabId}-pane" role="tabpanel" aria-labelledby="${tabId}-tab" tabindex="0">
180: <div class="row g-3">
181: #generateLeaderSections($leaders, $tab.config, $columnClass)
182: </div>
183: </div>
184: #end
185: </div>
186: </div> ## tab-container
187: </div>
188: </div>
189: #else
190: <div class="row g-3">
191: #generateLeaderSections($leaders, $tabConfig.tabs[0].config, 'col-12 col-md-6 col-xl-3')
192: </div>
193: #end
194: #end ## generateTabs
195:
196: #macro (generateDropdown $label $items $forTeam)
197: #set ($mainPageUrl = $playersPageName)
198: #if ($forTeam)
199: #set ($mainPageUrl = $teamsPageName)
200: #end
201:
202: #set ($id = $label.toLowerCase().replaceAll('[^a-z0-9]', '-') + "-dropdown")
203: <div class="dropdown">
204: <button class="btn btn-secondary dropdown-toggle" type="button" id="${id}" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
205: ${label}
206: </button>
207: <ul class="dropdown-menu" aria-labelledby="${id}" role="menu">
208: #foreach ($item in $items)
209: #set ($url = "${seasonPath}/${mainPageUrl}?${jsRenderingParam}")
210: #if ($item.key)
211: #set ($url = "${url}&sort=${item.key}")
212: #end
213: <li><a class="dropdown-item" role="menuitem" href="${url}">${item.name}</a></li>
214: #end
215: </ul>
216: </div>
217: #end
218:
219: #macro (printFilters)
220: <div class="my-3 d-print-none">
221: <div class="btn-toolbar d-flex justify-content-between gap-3 flex-column flex-sm-row flex-sm-nowrap" role="toolbar" aria-label="Schedule tool bar">
222: ## #printTeamsFilter
223: <div class="flex-fill">
224: <div class="d-flex flex-wrap align-items-end justify-content-between gap-3 flex-row">
225: $!request.setAttribute("pageObj", $page)
226: $website.include("conf-season-filter-template")
227: </div>
228: </div>
229: <div class="m-0" role="group" aria-label="Print friendly version">
230: <a href="${page.url}?dec=printer-decorator" class="btn btn-link border text-decoration-none text-nowrap"><span class="fa fa-print" aria-hidden="true"></span> Print</a>
231: </div>
232: </div>
233: </div>
234: #end ## printFilters
235:
236: #********************
237: ****** CONTENT ******
238: ********************#
239:
240: <div class="stats-leaders">
241:
242: #if ($page.title.length() > 0)
243: <h1>$page.title</h1>
244: #else
245: <h1>Individual Leaders</h1>
246: #end
247:
248: ## ARCHIVES
249: #printFilters
250:
251: <div class="stats-leaders-contents">
252:
253: #if ($pageLayout)
254: #if ($pageLayout.tabs && $pageLayout.tabs.size() > 0)
255: #generateTabs($pageLayout, 'col-12 col-md-6 col-xl-3')
256: #end
257: <div class="${dropdownsWrapperClass}">
258: #if ($pageLayout.dropdowns && $pageLayout.dropdowns.size() > 0)
259: #foreach ($dropdown in $pageLayout.dropdowns)
260: #generateDropdown($dropdown.label, $dropdown.config, $dropdown.forTeam)
261: #end
262: #end
263: <!-- Player Stats by Team Dropdown -->
264: $website.include("${seasonPath}/teams?tmpl=stats-team-lineup-template")
265: </div>
266: #else
267: <div>
268: <div class="alert alert-primary" role="alert">
269: We do not support a leader page for this sport (${sport}).
270: </div>
271: </div>
272: #end
273: </div>
274:
275: $wiki.su
276: </div>
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Privacy Policy & Terms of Service .