Golden Valley Statistical Leaders

Batting Average Leaders
Batting Average GP AVG
37 .420
40 .413
36 .387
36 .381
39 .366
View All
Runs Batted In Leaders
Runs Batted In GP RBI
40 43
36 30
39 30
35 29
38 29
View All
Stolen Bases Leaders
Stolen Bases GP SB
35 19
40 18
Siskiyous
There was a problem with a Velocity script
Pagesports/bsb/2011-12/goldenvalley/stats-leader-template
ErrorInvocation of method 'substring' in class java.lang.String threw exception java.lang.StringIndexOutOfBoundsException: String index out of range: 1 at ntq76d1sc0cj694dsports/bsb/2011-12/goldenvalley/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>