Related Bios
Justin Phan
Zach Hall
Nick Kadlecik
Luke DiFrancesco
Patrick Crossey
Brett Carney
Mason Gee-Montgomery
Luke Bedell
Austin Navarrette
Joshua Smith
Matthew Boss
Colin Schuster
Trey Minnich
Munyaradzi Mangwende
Jack Crouch
Peter Hontas
Alex Glatz
Ryan Coolidge
Brett Marcus
Joey Spitalli
Joe Dinko
Giuseppe Orsini
Kevin Chrissis
Jackson Mitchell
Mario Robaina
Corey King
JP Wassmann
Kyle Turcovsky
Donald Day III
Thomas DelMastro
Cooper Tulloch
Sam Jenkins
Pablo Garcia
Nate Stefonsky
Richard Phillips
Alec Peltekian
Isaac Withrow
Max Winebrake
J.J. Henson
Alexander Sfakianos
David Traganza
Jeremy Hill
Robertson Albrecht
Michael Amadio
Cameron Brown
Steven Clark
Joshua Clopp
Kanyon Combs
Adam Poltrack
Brian Victor
Travis Johnston
Skyler Wadas
Luis Rivera II
Chaz Brown
Thomas Strayer
Dante Grecco
Austin Subler
Michael Babbit
Dominic Barandica
Thomas Hankey
Jack Williams
Brennan Ryan
Phillip Wyatt
Anthony Polizzi
Derek Clontz
John Feczko
Dee Gose
Houruiyang Zong
John DelMastro
Joshua Blamer
Ian Henderson
Weston Roberts
Ryan Jones
Charles Webb
Josh Schlichting
Steven Bachie
Hunter Tulloch
Mukund Mahesh
Jacob Berg
Jack Baker
Colt Morgan
Chase Witte
Adam Zybko
Jason Lockamy
Andrew Lease
Reed Gershenson
Grant Cook
Thomas Koss
Tyler Bushman
Austin Keil
Dylan Zegers
Height:
6-0
Weight:
185
Year:
Fr.
Hometown:
South Fayette, Pa.
High School:
South Fayette
Position:
QB
Major:
Biochemistry
gp
10
yds
3033
td
34
yds/g
303.3
Freshman (2018): Selected as the quarterback on the D3football.com All-South Region Third Team, and was one of just 12 freshman across the country to earn all-region honors, and the only one on the offensive side of the ball… Joined Dan Whalen (2007 third team) and Rob Cuda (2015 and 2017 third team) as the only Spartans quarterbacks to receive all-region honors… Became the first player in UAA history to be named both the Offensive Player of the Year and the Rookie of the Year… Was the first CWRU player ever to be named the PAC Newcomer of the Year, and was selected to both the PAC and UAA First Teams… Recorded one of the best statistical seasons ever by a Spartan quarterback, matching a school record with 34 touchdowns, while throwing for 3,033 yards, the third-most in school history… Finished the year with a 161.01 efficiency (third in school history), while completing 62.4% of his passes and throwing just nine interceptions… Ranked fifth in DIII in passing touchdowns, sixth in passing yards per game (303.3), 10th in total offense (315.3), 11th in passing yards, 15th in points responsible for per game (21.2), 17th in efficiency and completions per game (22.1), 22nd in yards per pass attempt (8.57) and 33rd in completion percentage… Led the PAC in each of the statistical categories as well… Named the PAC Athlete of the Week twice, and the PAC Rookie of the Week on four occasions…. Also garnered UAA Athlete of the Week honors four times during the 2018 season… Threw for three or more touchdowns in a game seven times, including four five-touchdown games… Had six efforts of 300 or more passing yards… Threw for 414 yards and five touchdowns during a loss to Washington & Jefferson on October 6, the fourth-highest single-game yardage total in program history and the second-highest ever by a freshman quarterback… Also had five-touchdown games against Grove City on September 15, Thiel on September 22, and Waynesburg on November 3… After one season, ranks 10th in school history in career passing yards, first in career efficiency, and sixth in career passing touchdowns.
Personal: Was a four-year member of the South Fayette High School football team, serving as a team captain during his senior year... Coached by Joe Rossi... The Northwest Nine Offensive Player of the Year and an all-state and all-conference first team selection his senior year... Sixth in WPIAL history in passing yards (7.452) and second in touchdowns (94)... A member of the honor roll... Also played basketball in high school... Born August 4... Son of Stew and Charmian.
Statistics category
Overall
Conf
Completions
221
198
Attempts
354
319
Completion %
62.4%
62.1%
Yards
3033
2799
Yards per game
303.3
311.0
Yards per attempt
8.6
8.8
Touchdowns
34
34
Interceptions
9
8
Sacks
17
16
Yards lost
93
89
Pass Efficiency
161.0
165.9
Date
Opponent
Score
comp
att
pct
yds
y/a
td
int
sac
yds
Sep 1
Rochester (N.Y.)
W, 38-10
23
35
65.7%
234
6.7
0
1
1
4
Sep 15
at Grove City
W, 49-23
24
34
70.6%
361
10.6
5
0
1
2
Sep 22
Thiel
W, 63-20
19
26
73.1%
258
9.9
5
0
1
1
Sep 29
at Westminster (Pa.)
W, 35-14
25
34
73.5%
330
9.7
4
1
2
12
Oct 6
at Wash. & Jeff.
L, 44-36
29
44
65.9%
414
9.4
5
2
4
24
Oct 13
St. Vincent
W, 37-7
22
32
68.8%
348
10.9
4
0
0
0
Oct 20
at Geneva
W, 27-14
14
28
50.0%
232
8.3
3
1
0
0
Oct 27
at Bethany (W.V.)
W, 34-3
17
35
48.6%
198
5.7
2
1
2
9
Nov 3
Waynesburg
W, 41-17
27
37
73.0%
327
8.8
5
1
1
7
Nov 10
Carnegie Mellon
L, 29-23
21
49
42.9%
331
6.8
1
2
5
34
Date
Opponent
Score
rush
yds
y/a
lng
td
fum
lost
Sep 1
Rochester (N.Y.)
W, 38-10
4
38
9.5
18
1
-
-
Sep 15
at Grove City
W, 49-23
3
7
2.3
10
0
-
-
Sep 22
Thiel
W, 63-20
1
-1
-1.0
0
0
1
1
Sep 29
at Westminster (Pa.)
W, 35-14
8
24
3.0
10
0
-
-
Oct 6
at Wash. & Jeff.
L, 44-36
9
13
1.4
15
0
2
2
Oct 13
St. Vincent
W, 37-7
3
23
7.7
16
0
-
-
Oct 20
at Geneva
W, 27-14
-
-
-
-
-
-
-
Oct 27
at Bethany (W.V.)
W, 34-3
5
-2
-0.4
7
0
-
-
Nov 3
Waynesburg
W, 41-17
6
34
5.7
15
0
-
-
Nov 10
Carnegie Mellon
L, 29-23
7
-16
-2.3
15
0
-
-
Date
Opponent
Score
rec
yds
y/r
lng
td
fum
lost
Sep 1
Rochester (N.Y.)
W, 38-10
-
-
-
-
-
-
-
Sep 15
at Grove City
W, 49-23
-
-
-
-
-
-
-
Sep 22
Thiel
W, 63-20
-
-
-
-
-
1
1
Sep 29
at Westminster (Pa.)
W, 35-14
-
-
-
-
-
-
-
Oct 6
at Wash. & Jeff.
L, 44-36
-
-
-
-
-
2
2
Oct 13
St. Vincent
W, 37-7
-
-
-
-
-
-
-
Oct 20
at Geneva
W, 27-14
-
-
-
-
-
-
-
Oct 27
at Bethany (W.V.)
W, 34-3
-
-
-
-
-
-
-
Nov 3
Waynesburg
W, 41-17
-
-
-
-
-
-
-
Nov 10
Carnegie Mellon
L, 29-23
-
-
-
-
-
-
-
Date
Opponent
Score
fgm
fga
lng
xpm
xpa
pts
Sep 1
Rochester (N.Y.)
W, 38-10
-
-
-
-
-
0
Sep 15
at Grove City
W, 49-23
-
-
-
-
-
0
Sep 22
Thiel
W, 63-20
-
-
-
-
-
0
Sep 29
at Westminster (Pa.)
W, 35-14
-
-
-
-
-
0
Oct 6
at Wash. & Jeff.
L, 44-36
-
-
-
0
0
0
Oct 13
St. Vincent
W, 37-7
-
-
-
-
-
0
Oct 20
at Geneva
W, 27-14
-
-
-
-
-
0
Oct 27
at Bethany (W.V.)
W, 34-3
-
-
-
-
-
0
Nov 3
Waynesburg
W, 41-17
-
-
-
-
-
0
Nov 10
Carnegie Mellon
L, 29-23
-
-
-
-
-
0
Date
Opponent
Score
punt
yds
avg
long
in20
fc
tb
blk
Sep 1
Rochester (N.Y.)
W, 38-10
-
-
-
-
-
-
-
-
Sep 15
at Grove City
W, 49-23
-
-
-
-
-
-
-
-
Sep 22
Thiel
W, 63-20
-
-
-
-
-
-
-
-
Sep 29
at Westminster (Pa.)
W, 35-14
-
-
-
-
-
-
-
-
Oct 6
at Wash. & Jeff.
L, 44-36
-
-
-
-
-
-
-
-
Oct 13
St. Vincent
W, 37-7
-
-
-
-
-
-
-
-
Oct 20
at Geneva
W, 27-14
-
-
-
-
-
-
-
-
Oct 27
at Bethany (W.V.)
W, 34-3
-
-
-
-
-
-
-
-
Nov 3
Waynesburg
W, 41-17
-
-
-
-
-
-
-
-
Nov 10
Carnegie Mellon
L, 29-23
-
-
-
-
-
-
-
-
Date
Opponent
Score
kr
yds
avg
lng
td
pr
yds
avg
lng
td
Sep 1
Rochester (N.Y.)
W, 38-10
-
-
-
-
-
-
-
-
-
-
Sep 15
at Grove City
W, 49-23
-
-
-
-
-
-
-
-
-
-
Sep 22
Thiel
W, 63-20
-
-
-
-
-
-
-
-
-
-
Sep 29
at Westminster (Pa.)
W, 35-14
-
-
-
-
-
-
-
-
-
-
Oct 6
at Wash. & Jeff.
L, 44-36
-
-
-
-
-
-
-
-
-
-
Oct 13
St. Vincent
W, 37-7
-
-
-
-
-
-
-
-
-
-
Oct 20
at Geneva
W, 27-14
-
-
-
-
-
-
-
-
-
-
Oct 27
at Bethany (W.V.)
W, 34-3
-
-
-
-
-
-
-
-
-
-
Nov 3
Waynesburg
W, 41-17
-
-
-
-
-
-
-
-
-
-
Nov 10
Carnegie Mellon
L, 29-23
-
-
-
-
-
-
-
-
-
-
Date
Opponent
Score
gp
rush
rcv
pr
kr
yds
Sep 1
Rochester (N.Y.)
W, 38-10
1
38
-
-
-
38
Sep 15
at Grove City
W, 49-23
1
7
-
-
-
7
Sep 22
Thiel
W, 63-20
1
-1
-
-
-
-1
Sep 29
at Westminster (Pa.)
W, 35-14
1
24
-
-
-
24
Oct 6
at Wash. & Jeff.
L, 44-36
1
13
-
-
-
13
Oct 13
St. Vincent
W, 37-7
1
23
-
-
-
23
Oct 20
at Geneva
W, 27-14
1
-
-
-
-
0
Oct 27
at Bethany (W.V.)
W, 34-3
1
-2
-
-
-
-2
Nov 3
Waynesburg
W, 41-17
1
34
-
-
-
34
Nov 10
Carnegie Mellon
L, 29-23
1
-16
-
-
-
-16
Date
Opponent
Score
pts
rush
rec
kr
pr
int
fum
xpm
fgm
saf
misc
2pt
Sep 1
Rochester (N.Y.)
W, 38-10
6
1
-
-
-
-
-
-
-
-
0
-
Sep 15
at Grove City
W, 49-23
0
0
-
-
-
-
-
-
-
-
0
-
Sep 22
Thiel
W, 63-20
0
0
-
-
-
-
-
-
-
-
0
-
Sep 29
at Westminster (Pa.)
W, 35-14
0
0
-
-
-
-
-
-
-
-
0
-
Oct 6
at Wash. & Jeff.
L, 44-36
0
0
-
-
-
-
-
0
-
-
0
0
Oct 13
St. Vincent
W, 37-7
0
0
-
-
-
-
-
-
-
-
0
-
Oct 20
at Geneva
W, 27-14
0
-
-
-
-
-
-
-
-
-
0
-
Oct 27
at Bethany (W.V.)
W, 34-3
0
0
-
-
-
-
-
-
-
-
0
-
Nov 3
Waynesburg
W, 41-17
0
0
-
-
-
-
-
-
-
-
0
-
Nov 10
Carnegie Mellon
L, 29-23
0
0
-
-
-
-
-
-
-
-
0
-
Date
Opponent
Score
tack
ast
tot
sack
lost
tfl
yds
ff
fr
td
int
yds
td
brup
blk
saf
Sep 1
Rochester (N.Y.)
W, 38-10
-
-
0.0
-
-
0
-
-
-
-
-
-
-
-
-
-
Sep 15
at Grove City
W, 49-23
-
-
0.0
-
-
0
-
-
-
-
-
-
-
-
-
-
Sep 22
Thiel
W, 63-20
-
-
0.0
-
-
0
-
-
-
-
-
-
-
-
-
-
Sep 29
at Westminster (Pa.)
W, 35-14
-
-
0.0
-
-
0
-
-
-
-
-
-
-
-
-
-
Oct 6
at Wash. & Jeff.
L, 44-36
-
-
0.0
-
-
0
-
-
-
-
-
-
-
-
-
-
Oct 13
St. Vincent
W, 37-7
-
-
0.0
-
-
0
-
-
-
-
-
-
-
-
-
-
Oct 20
at Geneva
W, 27-14
-
-
0.0
-
-
0
-
-
-
-
-
-
-
-
-
-
Oct 27
at Bethany (W.V.)
W, 34-3
-
-
0.0
-
-
0
-
-
-
-
-
-
-
-
-
-
Nov 3
Waynesburg
W, 41-17
-
-
0.0
-
-
0
-
-
-
-
-
-
-
-
-
-
Nov 10
Carnegie Mellon
L, 29-23
-
-
0.0
-
-
0
-
-
-
-
-
-
-
-
-
-
Career Stats - Passing
gp
comp
att
pct
yds
y/g
y/a
td
int
lg
effic
2018-19
10
221
354
62.4%
3033
303.3
8.6
34
9
81
161.0
2019-20
11
242
400
60.5%
2966
269.6
7.4
26
14
60
137.2
2020-21
-
-
-
-
-
-
-
-
-
-
0.0
Total
21
463
754
61.4%
5999
285.7
8.0
60
23
81
148.4
Career Stats - Rushing
gp
rush
yds
y/g
avg
td
lg
fum
lost
2018-19
10
46
120
12.0
2.6
1
18
3
3
2019-20
11
36
-47
-4.3
-1.3
3
15
3
1
2020-21
-
-
-
-
-
-
-
-
-
Total
21
82
73
3.5
0.9
4
18
6
4
Career Stats - Receiving
gp
rec
rec/g
yds
y/g
avg
td
lg
2018-19
10
-
-
-
-
-
-
-
2019-20
11
1
0.1
19
1.7
19.0
0
19
2020-21
-
-
-
-
-
-
-
-
Total
21
1
0.0
19
0.9
19.0
0
19
Career Stats - Kicking
gp
fgm
fga
pct
lg
xpm
xpa
pct
pts
2018-19
10
-
-
-
-
0
0
-
0
2019-20
11
-
-
-
-
-
-
-
0
2020-21
-
-
-
-
-
-
-
-
0
Total
21
-
-
-
-
0
0
-
0
Career Stats - Punting
gp
punt
yds
avg
lg
in20
fc
tb
blk
2018-19
10
-
-
-
-
-
-
-
-
2019-20
11
-
-
-
-
-
-
-
-
2020-21
-
-
-
-
-
-
-
-
-
Total
21
-
-
-
-
-
-
-
-
Career Stats - Returns
kr
yds
avg
td
lg
pr
yds
avg
td
lg
2018-19
-
-
-
-
-
-
-
-
-
-
2019-20
-
-
-
-
-
-
-
-
-
-
2020-21
-
-
-
-
-
-
-
-
-
-
Total
-
-
-
-
-
-
-
-
-
-
Career Stats - All-Purpose
gp
rush
rcv
pr
kr
yds
ypg
2018-19
10
120
-
-
-
120
12.0
2019-20
11
-47
19
-
-
-28
-2.5
2020-21
-
-
-
-
-
0
-
Total
21
73
19
-
-
92
4.4
Career Stats - Scoring
pts
pts/g
rush
rec
kr
pr
int
fum
xpm
fgm
2pt
misc
2018-19
6
0.6
1
-
-
-
-
-
0
-
0
0
2019-20
18
1.6
3
0
-
-
-
-
-
-
-
0
2020-21
0
-
-
-
-
-
-
-
-
-
-
0
Total
24
1.1
4
0
-
-
-
-
0
-
0
0
Career Stats - Defense
gp
tkl
ast
tot
tkl/g
sck
yds
tfl
yds
ff
fr
yds
int
yds
brup
blk
2018-19
10
-
-
0.0
.0
-
-
0
-
-
-
-
-
-
-
-
2019-20
11
0
1
1.0
.1
-
-
0
-
-
-
-
-
-
-
-
2020-21
-
-
-
0.0
-
-
-
0
-
-
-
-
-
-
-
-
Total
21
0
1
1.0
.0
-
-
0
-
-
-
-
-
-
-
-
Splits Stats - Passing
gp
comp
att
pct
yds
y/g
y/a
td
int
lg
effic
Event
Total
10
221
354
62.4%
3033
303.3
8.6
34
9
81
161.0
Conference
9
198
319
62.1%
2799
311.0
8.8
34
8
81
165.9
Exhibition
-
-
-
-
-
-
-
-
-
-
0.0
Location
Home
5
112
179
62.6%
1498
299.6
8.4
15
4
73
156.1
Away
5
109
175
62.3%
1535
307.0
8.8
19
5
81
166.1
Neutral
-
-
-
-
-
-
-
-
-
-
0.0
Result
Wins
8
171
261
65.5%
2288
286.0
8.8
28
5
81
170.7
Losses
2
50
93
53.8%
745
372.5
8.0
6
4
73
133.7
Month
September
4
91
129
70.5%
1183
295.8
9.2
14
2
81
180.3
October
4
82
139
59.0%
1192
298.0
8.6
14
4
42
158.5
November
2
48
86
55.8%
658
329.0
7.7
6
3
73
136.1
Splits Stats - Rushing
gp
rush
yds
y/g
avg
td
lg
fum
lost
Event
Total
10
46
120
12.0
2.6
1
18
3
3
Conference
9
42
82
9.1
2.0
0
16
3
3
Exhibition
-
-
-
-
-
-
-
-
-
There was a problem with a Velocity script
Page bio-template
Error VM #split: too many arguments to macro. Wanted 3 got 5 at bio-template[line 313, column 17]
Page source:
1: $website.addCss($website.cdn("/info/photo-gallery.css"))
2: <script src="${website.cdn("/info/klass.min.js")}"></script>
3: <script src="${website.cdn("/info/code.photoswipe.jquery-3.0.5.min.js")}"></script>
4: <script src="${website.cdn("/info/masonry.pkgd.min.js")}"></script>
5: <script src="${website.cdn("/info/imagesloaded.pkgd.min.js")}"></script>
6: <script src="${website.cdn("/info/photogallery/photogallery.js")}"></script>
7:
8: ## PICK UP OPTIONS
9: $website.include("options")
10: #set ($options = $request.getAttribute("options"))
11: #set ($locale = "en_us")
12: #set ($locale = $options.get("locale"))
13:
14: ## HACK TO GET STATS URL FROM RENDERER... NEEDS SERVER CHANGE
15: #set ($bioObject = $page.getDataAsObject())
16: #set ($statsURL = $bioObject.statsURL)
17:
18: #if ($statsURL.length() > 0)
19: $website.includeAgain("${statsURL}?tmpl=bio-stats-template")
20: ## various settings to get the variables set
21: #set ($events = $request.getAttribute("bio_events"))
22: #set ($seasons = $request.getAttribute("bio_seasons"))
23: #set ($career = $request.getAttribute("bio_career"))
24: #set ($labels = $request.getAttribute("bio_labels"))
25: #set ($briefs = $request.getAttribute("bio_briefs"))
26: #set ($gamelogs = $request.getAttribute("bio_gamelogs"))
27: #set ($splits = $request.getAttribute("bio_splits"))
28: #set ($statPosition = $request.getAttribute("bio_position"))
29: #set ($positions = $request.getAttribute("bio_positions"))
30: #set ($playerId = $request.getAttribute("bio_player_id"))
31: #set ($highlights = $request.getAttribute("bio_highlights"))
32: #set ($formats = $request.getAttribute("bio_formats"))
33: #set ($gamelogsCategoriesLabels = $request.getAttribute("bio_gamelogs_labels"))
34: #set ($briefsCategoriesLabels = $request.getAttribute("bio_briefs_labels"))
35: #set ($gamesResults = $request.getAttribute("bio_games_results"))
36: #set ($monthsPlayed = $request.getAttribute("bio_months_played"))
37: #end
38:
39: #set ($pos = "")
40: #set ($pos = $attributes.get("position"))
41: #set ($pos = $statPosition)
42: #set ($posVec = $pos.split("/"))
43: #set ($pos = $posVec[0])
44: #set ($pos = $pos.toLowerCase())
45: #set ($statPos = $positions.get($pos))
46: #set ($paramPos = $request.getParameter("pos"))
47:
48: #set ($playerId = $attributes.get("playerId"))
49: #set ($stats = $splits.overall)
50: #set ($highlights = $highlights.get($statPos))
51:
52: #set ($showHighlights = true)
53: #if ($options.get("bio_show_highlights") && $options.get("bio_show_highlights") == false)
54: #set ($showHighlights = false)
55: #end
56:
57: #set ($enhancedLayout = false)
58: #if (($options.get("bio_enhanced_layout") == "yes") || ($request.getParameter("bio_enhanced_layout") == true))
59: #set ($enhancedLayout = true)
60: $website.addCss($website.cdn("/info/bio-styles-enhanced.css"))
61: #end
62:
63: #set ($showActionShots = true)
64: #if ($options.get("bio_show_action_shots") && $options.get("bio_show_action_shots") == false)
65: #set ($showActionShots = false)
66: #end
67:
68: #set ($actionShotsLimit = 5)
69: #set ($actionShotsLimit = $tool.math.toInteger($options.get("bio_action_shots_limit")))
70:
71: #set ($showCareer = $wiki.valid() && $seasons)
72: #if ("yes" == $options.get("stats_show_career") && $seasons)
73: #set ($showCareer = true)
74: #end
75:
76: #set ($hasEvents = $events.size() > 0)
77: #set ($hasSynopsis = $synopsis.trim().length() > 0)
78: #set ($htmlStatsURL = "${page.url}-stats")
79: #set ($hasHTMLStats = $website.exists($htmlStatsURL))
80: #set ($bioBriefURL = "${page.url}-brief")
81: #set ($hasBioBrief = $website.exists("$bioBriefURL"))
82: #set ($showRoster = ($page.contentType == "loki/bio" && $page.headlinesFeatured.size() > 0) || ($page.contentType == "loki/bio-network" && $page.sectionPage.children.size() > 1))
83: #if ($options.get("bio_hide_roster") == true)
84: #set ($showRoster = false)
85: #end
86:
87: #set ($view = "")
88: #if ($hasSynopsis || $hasBioBrief)
89: #set ($view = "bio")
90: #elseif ($statsURL.length() > 0)
91: #set ($view = "profile")
92: #elseif ($hasHTMLStats)
93: #set ($view = "htmlstats")
94: #elseif ($releases.size() > 0)
95: #set ($view = "news")
96: #elseif ($playerPhotos.size() > 0)
97: #set ($view = "photos")
98: #elseif ($playerVideos.size() > 0)
99: #set ($view = "videos")
100: #end
101:
102: #if ($options.get("bio_default_view").length() > 0)
103: #set ($checkView = $options.get("bio_default_view"))
104: #end
105:
106: #if ($request.getParameter("view"))
107: #set ($checkView = $request.getParameter("view"))
108: #end
109:
110: #if ($checkView == "profile" && $statsURL.length() > 0)
111: #set ($view = "profile")
112: #elseif ($checkView == "bio" && ($hasSynopsis || $hasBioBrief))
113: #set ($view = "bio")
114: #elseif ($checkView == "gamelog" && $statsURL.length() > 0)
115: #set ($view = "gamelog")
116: #elseif ($checkView == "career" && $showCareer)
117: #set ($view = "career")
118: #elseif ($checkView == "splits" && $statsURL.length() > 0)
119: #set ($view = "splits")
120: #elseif ($checkView == "htmlstats" && $hasHTMLStats)
121: #set ($view = "htmlstats")
122: #elseif ($checkView == "news" && $releases.size() > 0)
123: #set ($view = "news")
124: #elseif ($checkView == "photos" && $playerPhotos.size() > 0)
125: #set ($view = "photos")
126: #elseif ($checkView == "videos" && $playerVideos.size() > 0)
127: #set ($view = "videos")
128: #end
129:
130: #macro (printResultAriaLabel $event)
131: #set ($ariaLabel = "${event.sport} event: ${formatter.formatDate($event.date, 'MMMM d hh:mm a:')}")
132: #if ($event.neutralSite.length() > 0 || $event.home)
133: #set ($ariaLabel = "${ariaLabel} vs.")
134: #else
135: #set ($ariaLabel = "${ariaLabel} at")
136: #end
137: #set ($ariaLabel = "${ariaLabel} ${event.opponent.name}:")
138: #if ($event.neutralSite.length() > 0)
139: #set ($ariaLabel = "${ariaLabel} @ ${event.neutralSite}:")
140: #end
141: #set ($ariaLabel = "${ariaLabel} Box Score")
142: aria-label="$ariaLabel"
143: #end
144:
145: #macro (printGrid $items $type)
146: <div class="news-layout grid">
147: <div class="stories">
148: <ul>
149: #foreach ($item in $items)
150: #if ($item.title.length() > 0)
151:
152: <li class="story ${type}">
153: <div class="clearfix">
154: <a href="$item.url" class="title-box">
155: <span class="thumb">
156: #if ($item.thumbnailURL)
157: <img src="$website.cdn("/info/images/spacer.gif")" data-src="${item.thumbnailURL}?max_width=300" alt="" class="lazyload" />
158: #elseif ($item.contentType == "loki/youtube")
159: <img src="$website.cdn("/info/images/spacer.gif")" data-src="http://img.youtube.com/vi/${item.dataAsString}/0.jpg" alt="" class="lazyload" />
160: #else
161: <img src="$website.cdn("/info/images/spacer.gif")" data-src="/images/setup/thumbnail_default.jpg?max_width=300" alt="" class="lazyload" />
162: #end
163: </span>
164: <span class="title">$item.title</span>
165: </a>
166: </div>
167: </li>
168: #end
169: #end ## foreach
170: </ul>
171: </div>
172: </div>
173: #end ## ends macro
174:
175: #macro (gamelogData $p)
176:
177: #set ($p = $positions.get($p))
178: #set ($gamelogs = $gamelogs.get($p))
179:
180: #if ($hasEvents)
181: <div class="stats-box full clearfix">
182: <div class="scrollable">
183: <div>
184: <table>
185: <tr class="thead">
186: <th class="text">Date</th>
187: <th class="pinned-col text">Opponent</th>
188: <th>Score</th>
189: #foreach ($gamelog in $gamelogs)
190: <th>$gamelog</th>
191: #end
192: </tr>
193: #foreach ($event in $events)
194: <tr>
195: <td class="text">$formatter.formatDate($event.event.date, "MMM d")</td>
196: <td class="pinned-col text">
197: #if ($event.event.neutralSite.length() > 0) vs. #elseif (!$event.event.home) at #end
198: $event.event.opponent.name
199: </td>
200: <td>
201: #if ($event.event.statusCode >= 0)
202: #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
203: <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
204: #else
205: ${event.event.APResult}
206: #end
207: #else #end
208: </td>
209: #foreach ($gamelog in $gamelogs.keySet())
210: #set ($value = "-")
211: #set ($value = $formatter.formatNumber($event.stats.get($gamelog), $formats.get($gamelog)))
212: <td>$value</td>
213: #end
214: </tr>
215: #end
216: </table>
217: </div>
218: </div> ## scrollable
219: </div> ## stats-box
220: #end
221:
222: #end ## macro gamelogData
223:
224: #macro (split $statPosBriefs $label $stats)
225: <tr>
226: <td class="pinned-col text">${label}</td>
227: #foreach ($brief in $statPosBriefs.keySet())
228: #set ($value = "-")
229: #set ($value = $!formatter.formatNumber($stats.get($brief), $formats.get($brief)))
230: <td>#if ($value.length() > 0) $value #else - #end</td>
231: #end
232: </tr>
233: #end
234:
235: #macro (careerData $p)
236: #set ($p = $positions.get($p))
237: #set ($statPosBriefs = $briefs.get($p))
238:
239: <div class="stats-box full clearfix">
240: <div class="scrollable">
241: <div>
242: <table>
243: <tr class="thead">
244: <th class="pinned-col"> </th>
245: #foreach ($brief in $statPosBriefs)
246: <th>$brief</th>
247: #end
248: </tr>
249:
250: #set ($careerTotals = $request.getAttribute("careerTotals"))
251: #set ($careerMap = $request.getAttribute("careerMap"))
252:
253: #foreach ($season in $seasons)
254: ## Check if we did not get stats for this season
255: #if ($careerMap.get($season.seasonName))
256: #set ($label = "<a href='${season.path}?view=profile'>$season.seasonName</a>")
257: #split($statPosBriefs, $label, $careerMap[$season.seasonName])
258: #elseif ($wiki.valid())
259: <tr>
260: <td class="text">${season.seasonName}</td>
261: <td colspan="${statPosBriefs.size()}">We could not find the "players" page in the ${season.seasonName} section.</td>
262: </tr>
263: #end
264: #end
265:
266: #split($statPosBriefs, "Total", $request.getAttribute("careerTotals").overall)
267:
268: </table>
269: </div>
270: </div> ## scrollable
271: </div> ## stats-box
272:
273: #end ## macro careerData
274:
275: #macro (splitsData $p)
276:
277: #set ($p = $positions.get($p))
278: #set ($statPosBriefs = $briefs.get($p))
279: #set ($colspan = $tool.math.add($statPosBriefs.size(), 1))
280:
281: #if ($statPosBriefs.size() > 0)
282: <div class="stats-box full clearfix">
283: <div class="scrollable">
284: <div>
285: <table>
286: <tr>
287: <th class="pinned-col"> </th>
288: #foreach ($brief in $statPosBriefs)
289: <th>$brief</th>
290: #end
291: </tr>
292:
293: #split($statPosBriefs, "Total", $splits.overall)
294: #split($statPosBriefs, "Conference", $splits.conference)
295: #split($statPosBriefs, "Exhibition", $splits.exhibition)
296:
297: <tr class="empty-row"><td colspan="$colspan"><div class="empty-cell">-</div></td></tr>
298:
299: #split($statPosBriefs, "Home", $splits.home)
300: #split($statPosBriefs, "Away", $splits.away)
301: #split($statPosBriefs, "Neutral", $splits.neutral)
302:
303: <tr class="empty-row"><td colspan="$colspan"><div class="empty-cell">-</div></td></tr>
304:
305: #foreach($gameResult in $gamesResults.entrySet())
306: #if ($gameResult.key == "wins")
307: #set ($splitGameResult = $splits.inWins)
308: #elseif ($gameResult.key == "losses")
309: #set ($splitGameResult = $splits.inLosses)
310: #elseif ($gameResult.key == "ties")
311: #set ($splitGameResult = $splits.inTies)
312: #end
313:
314: #split($statPosBriefs, $gameResult.value, $splitGameResult)
315: #end
316:
317: <tr class="empty-row"><td colspan="$colspan"><div class="empty-cell">-</div></td></tr>
318:
319: #if ($monthsPlayed and $monthsPlayed.size() > 0)
320: #foreach($month in $monthsPlayed)
321: #if ($month == 'January')
322: #set ($splitMonth = $splits.january)
323: #elseif ($month == 'February')
324: #set ($splitMonth = $splits.february)
325: #elseif ($month == 'March')
326: #set($splitMonth = $splits.march)
327: #elseif ($month == 'April')
328: #set($splitMonth = $splits.april)
329: #elseif ($month == 'May')
330: #set ($splitMonth = $splits.may)
331: #elseif ($month == 'June')
332: #set ($splitMonth = $splits.june)
333: #elseif ($month == 'July')
334: #set($splitMonth = $splits.july)
335: #elseif ($month == 'August')
336: #set ($splitMonth = $splits.august)
337: #elseif ($month == 'September')
338: #set($splitMonth = $splits.september)
339: #elseif ($month == 'October')
340: #set($splitMonth = $splits.october)
341: #elseif ($month == 'November')
342: #set ($splitMonth = $splits.november)
343: #elseif ($month == 'December')
344: #set($splitMonth = $splits.december)
345: #end
346:
347: #split($statPosBriefs, $month, $splitMonth)
348: #end ## foreach
349: #end
350: </table>
351: </div>
352: </div> ## scrollable
353: </div> ## srollable-table
354: #end
355:
356: #end ## macro splitsData
357:
358: #macro (printRecentGames)
359: #if ($hasEvents)
360: <table>
361: <tr class="thead accent-bg"><th colspan="3">Recent Games</th></tr>
362:
363: #set ($eventEnd = -1)
364: #foreach ($event in $events)
365: #if ($event.event.result.resolved)
366: #set ($eventEnd = $velocityCount)
367: #end
368: #end
369:
370: #set ($eventStart = $eventEnd - 5)
371: #if ($eventStart < 0) #set ($eventStart = 0) #end
372:
373: #foreach ($event in $events)
374: #if ($velocityCount >= $eventStart and $velocityCount <= $eventEnd)
375: <tr>
376: <td class="text">$formatter.formatDate($event.event.date, "MMM d")</td>
377: <td class="text">
378: #if ($event.event.neutralSite.length() > 0) vs.
379: #elseif (!$event.event.home) at
380: #else ## nothing for a home game
381: #end
382: $event.event.opponent.name
383: </td>
384: <td class="text">
385: #if ($event.event.statusCode >= 0)
386: #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
387: <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
388: #else
389: ${event.event.APResult}
390: #end
391: #end
392: </td>
393: </tr>
394: #end ## if
395: #end
396: </table>
397: #end
398: #end ## macro printRecentGames
399:
400: #macro (printCategories $briefCategoryLabels $v $ariaLabel)
401:
402: <div class="tab-container secondary clearfix" data-module="stats/tabs" data-type="secondary">
403: <div class="tab-nav" data-module="jscroll" data-momentum="false">
404: <div>
405: <ul class="clearfix">
406: #foreach($briefCat in $briefCategoryLabels.entrySet())
407: #set ($briefCatLabel = $briefCat.value)
408: #set ($briefCatKey = $briefCat.key)
409:
410: #if ($locale == "en_gb" && $briefCatLabel == "Defense")
411: #set ($briefCatLabel = "Defence")
412: #end
413:
414: <li #if ($activePos == $briefCatKey) class="active" #end><a href="${page.url}?view=${v}&pos=${briefCatKey}" role="button" aria-label="${ariaLabel}: ${briefCatLabel}">$briefCatLabel</a></li>
415: #end
416: </ul>
417: </div>
418: </div>
419: <div class="tab-panels">
420: #foreach ($briefCat in $briefCategoryLabels.entrySet())
421: #set ($class = "tab-panel clearfix")
422: #if ($briefCat.key == $activePos)
423: #set ($class = "tab-panel active clearfix")
424: #end
425: <div class="$class">
426: <div class="stats-wrap clearfix">
427: #if ($v == "splits")
428: #splitsData($briefCat.key)
429: #elseif ($v == "career")
430: #careerData($briefCat.key)
431: #end
432: </div>
433: </div>
434: #end
435: </div>
436: </div> ## tab-container
437:
438: #end ## macro printCategories
439:
440: #macro (printHeadshot)
441: #if ($enhancedLayout)
442:
443: #if ($headshot.url)
444: <img src="$headshot.url?max_width=300&max_height=400" alt="$fullName" />
445: #else
446: #if ($website.exists("/images/setup/headshot_default.jpg"))
447: <img src="/images/setup/headshot_default.jpg?max_width=300&max_height=400" alt="$fullName" />
448: #else
449: <img src="$website.cdn("/info/images/default_headshot.jpg?max_width=300&max_height=400")" alt="$fullName" />
450: #end
451: #end
452:
453: #else
454:
455: #if ($!attributes.get("number").length() > 0)<span class="number">$!attributes.get("number")</span>#end
456:
457: #if ($headshot.url)
458: <img src="$headshot.url?max_width=160&max_height=210" alt="$fullName" />
459: #else
460: #if ($website.exists("/images/setup/headshot_default.jpg"))
461: <img src="/images/setup/headshot_default.jpg?max_width=160&max_height=210" alt="" />
462: #else
463: <img src="$website.cdn("/info/images/default_headshot.jpg?max_width=160&max_height=210")" alt="" />
464: #end
465: #end
466:
467: #end ## ## enhancedLayout check
468: #end ## macro printHeadshot
469:
470: #macro (printBioInfo)
471: #if ($enhancedLayout)
472:
473: <h2 class="player-heading">
474: #if ($!attributes.get("number").length() > 0)<span class="number accent-bg">$!attributes.get("number")</span>#end
475: <span class="name">$fullName</span>
476: </h2>
477:
478: <ul>
479: #foreach ($i in [1..10])
480: #set ($stickyKey = "bio_custom${i}_sticky")
481: #if ($options.get($stickyKey).length() > 0 && $attributes.get("custom${i}").length() > 0)
482: <li>
483: <dl>
484: <dt class="label">$options.get($stickyKey): </dt>
485: <dd class="value">$!attributes.get("custom${i}")</dd>
486: </dl>
487: </li>
488: #end
489: #end
490:
491: #foreach ($field in $fields)
492: #if (!$field.key.startsWith("custom"))
493: #if ($attributes.get($field.key).length() > 0 && ($field.key != "first_name" && $field.key != "last_name" && $field.key != "number" && $field.key != "full_name"))
494: #if ($field.key == "phone1" || $field.key == "phone2")
495: <li>
496: <dl>
497: <dt class="label">Phone: </dt>
498: <dd class="value">$!attributes.get($field.key)</dd>
499: </dl>
500: </li>
501: #elseif ($field.key == "email_address")
502: #set ($emailAdd = $attributes.get($field.key))
503: <li>
504: <dl>
505: <dt class="label">Email: </dt>
506: <dd class="value"><a href="mailto:${emailAdd}">$emailAdd</a></dd>
507: </dl>
508: </li>
509: #elseif ($field.key == "weight_class")
510: <li>
511: <dl>
512: <dt class="label">Class: </dt>
513: <dd class="value">$!attributes.get($field.key)</dd>
514: </dl>
515: </li>
516: #elseif ($field.key != "position_abbr")
517: <li>
518: <dl>
519: <dt class="label">$field.value: </dt>
520: <dd class="value">$!attributes.get($field.key)</dd>
521: </dl>
522: </li>
523: #end
524: #end
525: #end
526: #end
527:
528: #foreach ($i in [1..10])
529: #set ($customKey = "bio_custom${i}")
530: #if ($options.get($customKey).length() > 0 && $attributes.get("custom${i}"))
531: <li>
532: <dl>
533: <dt class="label">$options.get($customKey): </dt>
534: <dd class="value">$!attributes.get("custom${i}")</dd>
535: </dl>
536: </li>
537: #end
538: #end
539: </ul>
540:
541: #else
542: ## default layout
543:
544: <div class="player-name">
545: #if ($!attributes.get("number").length() > 0)<span class="number">$!attributes.get("number")</span><span class="sep"> - </span>#end
546: <span class="name">$fullName</span>
547: </div>
548:
549: <table role="presentation">
550: #foreach ($i in [1..10])
551: #set ($stickyKey = "bio_custom${i}_sticky")
552: #if ($options.get($stickyKey).length() > 0 && $attributes.get("custom${i}").length() > 0)
553: <tr>
554: <td class="label">$options.get($stickyKey): </td>
555: <td class="value">$!attributes.get("custom${i}")</td>
556: </tr>
557: #end
558: #end
559:
560: #foreach ($field in $fields)
561: #if (!$field.key.startsWith("custom"))
562: #if ($attributes.get($field.key).length() > 0 && ($field.key != "first_name" && $field.key != "last_name" && $field.key != "number" && $field.key != "full_name"))
563: #if ($field.key == "phone1" || $field.key == "phone2")
564: <tr>
565: <td class="label">Phone: </td>
566: <td class="value">$!attributes.get($field.key)</td>
567: </tr>
568: #elseif ($field.key == "email_address")
569: #set ($emailAdd = $attributes.get($field.key))
570: <tr>
571: <td class="label">Email: </td>
572: <td class="value"><a href="mailto:${emailAdd}">$emailAdd</a></td>
573: </tr>
574: #elseif ($field.key == "weight_class")
575: <tr>
576: <td class="label">Class: </td>
577: <td class="value">$!attributes.get($field.key)</td>
578: </tr>
579: #elseif ($field.key != "position_abbr")
580: <tr>
581: <td class="label">$field.value: </td>
582: <td class="value">$!attributes.get($field.key)</td>
583: </tr>
584: #end
585: #end
586: #end
587: #end
588:
589: #foreach ($i in [1..10])
590: #set ($customKey = "bio_custom${i}")
591: #if ($options.get($customKey).length() > 0 && $attributes.get("custom${i}"))
592: <tr>
593: <td class="label">$options.get($customKey): </td>
594: <td class="value">$!attributes.get("custom${i}")</td>
595: </tr>
596: #end
597: #end
598: </table>
599: #end ## enhancedLayout check
600: #end ## macro printBioInfo
601:
602: #macro (printActionShots)
603: #if ($showActionShots)
604: ## BANNERS SLIDER
605: #set ($slickSettings = {
606: "autoplay": true,
607: "fade": true,
608: "arrows": false,
609: "slidesToShow": 1,
610: "slidesToScroll": 1,
611: "lazyLoad": "ondemand",
612: "responsive": "none"
613: })
614: #set ($slickSettings = $slickSettings.toString().replace("=", ":"))
615: <div class="action-shots clearfix">
616: <div class="slider" data-module="slick-slider-init" data-slick-settings="$slickSettings">
617: #foreach ($photo in $playerPhotos)
618: #if ($velocityCount <= $actionShotsLimit)
619: #set ($imgAlt = "")
620: #if (!$image.altText.equals($image.title))
621: #set ($imgAlt = $image.altText)
622: #elseif( $image.title.length() == 0 )
623: #set ($imgAlt = "Action shot for $page.title image $velocityCount")
624: #end
625: <div class="image">
626: <img data-lazy="$photo.url" alt="$imgAlt" />
627: </div>
628: #end
629: #end
630: </div>
631: </div>
632: #end
633: #end ## macro printActionShots
634:
635: #macro (printHighlights)
636: #if ($highlights && $showHighlights)
637: <div class="highlights #if ($enhancedLayout) highlights-bio-enhanced #else highlights-bio #end clearfix">
638: #foreach ($highlight in $highlights.keySet())
639: #set ($value = "-")
640: #set ($value = $formatter.formatNumber($stats.get($highlight), $formats.get($highlight)))
641: <div class="stat clearfix">
642: <span class="stat-title">$!highlights.get($highlight)</span>
643: <span class="stat-value">$value</span>
644: </div>
645: #end
646: </div>
647: #end
648: #end ## macro printHighlights
649: #macro (printRoster)
650: #if ($enhancedLayout)
651: $website.includeAgain("${page.url}?tmpl=roster-switcher-template&id=roster-list")
652: #else
653: #if ($page.contentType == "loki/bio")
654: #set ($headlinesFeaturedSize = 0)
655: #foreach ($featuredPage in $page.headlinesFeatured)
656: #if ($featuredPage.contentType == "loki/headlines")
657: #set ($headlinesFeaturedSize = $headlinesFeaturedSize + 1)
658: #end
659: #end
660: #if ($headlinesFeaturedSize > 0)
661: <select class="roster-select-list" aria-label="Select a player to view its full bio from the list of options below.">
662: <option selected="selected">Related Bios</option>
663: #foreach ($featuredPage in $page.headlinesFeatured)
664: #if ($featuredPage.contentType == "loki/headlines")
665: $website.includeAgain("${featuredPage.url}?tmpl=roster-list-template¤t_url=${page.url}")
666: #end
667: #end
668: </select>
669: #end
670: #elseif ($page.contentType == "loki/bio-network")
671: #set ($relatedPlayers = $page.sectionPage.children)
672: #set ($teamNames = {})
673: #foreach ($relatedPlayer in $relatedPlayers)
674: #if ($relatedPlayer.contentType == "loki/bio-network")
675: #set ($relatedPlayerObj = $relatedPlayer.getDataAsObject().getAttributes())
676: #set ($teamName = $relatedPlayerObj.get("team"))
677: #if ($teamName.length() > 0)
678: #if (!$teamNames.containsValue($teamName))
679: $!teamNames.put($tool.math.add($teamNames.size(), 1), $teamName)
680: #end
681: #end
682: #end
683: #end
684:
685: <select class="roster-select-list" aria-label="Select a player to view its full bio from the list of options below.">
686: #foreach ($i in [1..$teamNames.size()])
687: #if ($teamNames.size() > 1)
688: <optgroup label="$teamNames.get($i)">
689: #end
690:
691: #foreach ($relatedPlayer in $relatedPlayers)
692: #if ($relatedPlayer.contentType == "loki/bio-network")
693: #set ($relatedPlayerObj = $relatedPlayer.getDataAsObject().getAttributes())
694: #set ($teamName = $relatedPlayerObj.get("team"))
695: #if ($teamName.length() > 0 && $teamName == $teamNames.get($i))
696: #set ($playerFirstName = $relatedPlayerObj.get("first_name"))
697: #set ($playerLastName = $relatedPlayerObj.get("last_name"))
698: #if ($page.url == $relatedPlayer.url)
699: <option value="$relatedPlayer.url" selected="selected">${playerFirstName} ${playerLastName}</option>
700: #else
701: <option value="$relatedPlayer.url">${playerFirstName} ${playerLastName}</option>
702: #end
703: #end
704: #end
705: #end
706:
707: #if ($teamNames.size() > 1)
708: </optgroup>
709: #end
710: #end
711: </select>
712: #end
713: #end ## enhancedLayout check
714: #end ## macro printRoster
715:
716: ################################################## END MACROS #############################################################
717:
718: #if ($attributes.get("full_name").length() > 0)
719: #set ($fullName = $attributes.get("full_name"))
720: #else
721: #set ($firstName = $!attributes.get("first_name"))
722: #set ($lastName = $!attributes.get("last_name"))
723: #set ($fullName = "${firstName} ${lastName}")
724: #end
725:
726: #set ($actionShots = false)
727: #if ($enhancedLayout && $playerPhotos.size() > 0)
728: #set ($actionShots = true)
729: #end
730:
731: #if ($enhancedLayout)
732: #set ($rootClass = "bio-enhanced")
733: #if ($actionShots && $showActionShots)
734: #set ($rootClass = "${rootClass} action")
735: #else
736: #set ($rootClass = "${rootClass} plain")
737: #end
738: #else
739: #set ($rootClass = "bio-wrap")
740: #end
741:
742: ## FULL ROSTER
743: <div class="${rootClass} #if ($highlights) bio-wrap-has-highlights #end clearfix" data-module="stats/responsive-container">
744:
745: ## RELATED BIOS
746: #if ($showRoster)
747: <div class="related-bios clearfix">#printRoster</div>
748: #end
749:
750: #if ($actionShots)
751: #printActionShots
752: #end
753:
754: <div class="head clearfix">
755: <div class="clearfix">
756:
757: <div class="player-about clearfix">
758: <div class="player-headshot">#printHeadshot</div>
759: <div class="player-info">#printBioInfo</div>
760: </div>
761:
762: #printHighlights
763:
764: </div>
765: </div> ## head
766:
767: #if ($view.length() > 0)
768: <div class="body clearfix">
769:
770: <div class="tab-container primary clearfix" data-module="stats/tabs" data-type="primary">
771: <div class="tab-nav" data-module="jscroll" data-momentum="false">
772: <div>
773: <ul class="clearfix">
774: #if ($hasSynopsis || $hasBioBrief)
775: <li #if ($view == "bio") class="active" #end><a href="${page.url}?view=bio">Bio</a></li>
776: #end
777:
778: #if ($statsURL.length() > 0)
779: <li #if ($view == "profile") class="active" #end><a href="${page.url}?view=profile">Player Profile</a></li>
780: <li #if ($view == "gamelog") class="active" #end><a href="${page.url}?view=gamelog">Game Log</a></li>
781: #if ($showCareer)
782: <li #if ($view == "career") class="active" #end><a href="${page.url}?view=career">Career Stats</a></li>
783: #end
784: <li #if ($view == "splits") class="active" #end><a href="${page.url}?view=splits">Split Stats</a></li>
785: #end
786:
787: #if ($hasHTMLStats)
788: <li #if ($view == "htmlstats") class="active" #end><a href="${page.url}?view=htmlstats">HTML Stats</a></li>
789: #end
790:
791: #if ($releases.size() > 0)
792: <li #if ($view == "news") class="active" #end><a href="${page.url}?view=news">News</a></li>
793: #end
794:
795: #if ($playerPhotos.size() > 0)
796: <li #if ($view == "photos") class="active" #end><a href="${page.url}?view=photos">Photos</a></li>
797: #end
798:
799: #if ($playerVideos.size() > 0)
800: <li #if ($view == "videos") class="active" #end><a href="${page.url}?view=videos">Videos</a></li>
801: #end
802: </ul>
803: </div>
804: </div> ## tab-nav
805:
806: <div class="tab-panels clearfix">
807:
808: ## BIO
809: #if ($hasSynopsis || $hasBioBrief)
810:
811: #set ($class = "tab-panel clearfix")
812: #if ($view == "bio")
813: #set ($class = "tab-panel active clearfix")
814: #end
815: <div class="${class}">
816:
817: <div class="synopsis clearfix">
818: #if ($hasSynopsis)
819: $synopsis
820: #elseif ($hasBioBrief)
821: $website.include("$bioBriefURL")
822: #end
823: </div>
824:
825: </div> ## tab-panel
826: #end
827: ## BIO
828:
829: ## STATS
830: #if ($statsURL.length() > 0)
831:
832: ## PROFILE
833: #set ($class = "tab-panel clearfix")
834: #if ($view == "profile")
835: #set ($class = "tab-panel active clearfix")
836: #end
837: <div class="${class}">
838: <div class="stats-wrap clearfix">
839:
840: ## LAST SIX GAMES
841: <div class="stats-box half">
842: #printRecentGames()
843: </div>
844:
845: ## RANKING
846: <div class="stats-box half">
847: #if ($statPos.length() > 0)
848: $website.include("players?tmpl=stats-bios-rank-template&rank=${playerId}&pos=${statPos}")
849: #end
850: </div>
851:
852: </div> ## stats-wrap
853: </div> ## tab-content
854: ## PROFILE
855:
856: ## GAMELOG
857: #set ($class = "tab-panel clearfix")
858: #if ($view == "gamelog")
859: #set ($class = "tab-panel active clearfix")
860: #end
861:
862: #set ($activePos = $statPos)
863: #if ($view == "gamelog" && $paramPos.length() > 0)
864: #if ($positions.get($paramPos).length() > 0)
865: #set ($activePos = $positions.get($paramPos))
866: #end
867: #end
868:
869: <div class="${class}">
870:
871: #if ($gamelogsCategoriesLabels)
872: <div class="tab-container clearfix secondary" data-module="stats/tabs" data-type="secondary">
873: <div class="tab-nav" data-module="jscroll" data-momentum="false">
874: <div>
875: <ul class="clearfix">
876: #foreach($gamelogsCatLabel in $gamelogsCategoriesLabels.entrySet())
877: #set($gamelogsCatLabelVal = $gamelogsCatLabel.value)
878:
879: #if ($locale == "en_gb" && $gamelogsCatLabelVal == "Defense")
880: #set($gamelogsCatLabelVal = "Defence")
881: #end
882:
883: <li #if ($activePos == $gamelogsCatLabel.key) class="active" #end><a href="${page.url}?view=gamelog&pos=${gamelogsCatLabel.key}" role="button" aria-label="Game Log: ${gamelogsCatLabelVal}">$gamelogsCatLabelVal</a></li>
884: #end
885: </ul>
886: </div>
887: </div>
888: <div class="tab-panels">
889: #foreach($gamelogsCatLabel in $gamelogsCategoriesLabels.entrySet())
890: #set ($class = "tab-panel clearfix")
891: #if ($gamelogsCatLabel.key == $activePos)
892: #set ($class = "tab-panel active clearfix")
893: #end
894: <div class="${class}">
895: <div class="stats-wrap clearfix">#gamelogData($gamelogsCatLabel.key)</div>
896: </div>
897: #end
898: </div>
899: </div>
900: #else
901: <div class="stats-wrap clearfix">#gamelogData($pos)</div>
902: #end
903:
904: </div> ## tab-panel
905: ## GAMELOG
906:
907:
908: ## CAREER
909: #if ($showCareer)
910:
911: #set ($activePos = $statPos)
912: #if ($view == "career" && $paramPos.length() > 0)
913: #if ($positions.get($paramPos).length() > 0)
914: #set ($activePos = $positions.get($paramPos))
915: #end
916: #end
917:
918: #set ($class = "tab-panel clearfix")
919: #if ($view == "career")
920: #set ($class = "tab-panel active clearfix")
921: #end
922:
923: <div class="${class}">
924:
925: #if ($briefsCategoriesLabels)
926: #printCategories($briefsCategoriesLabels "career" "Career Stats")
927: #else
928: <div class="stats-wrap clearfix">#careerData($activePos)</div>
929: #end
930:
931: </div> ## tab-panel
932: #end
933: ## CAREER
934:
935: ## SPLITS
936: #set ($class = "tab-panel clearfix")
937: #if ($view == "splits")
938: #set ($class = "tab-panel active clearfix")
939: #end
940:
941: #set ($activePos = $statPos)
942: #if ($view == "splits" && $paramPos.length() > 0)
943: #if ($positions.get($paramPos).length() > 0)
944: #set ($activePos = $positions.get($paramPos))
945: #end
946: #end
947:
948: <div class="${class}">
949:
950: #if ($briefsCategoriesLabels)
951: #printCategories($briefsCategoriesLabels "splits" "Splits Stats")
952: #else
953: <div class="stats-wrap clearfix">#splitsData($pos)</div>
954: #end
955:
956: </div> ## tab-panel
957: ## SPLITS
958:
959: #end
960: ## STATS
961:
962: ## HTML STATS
963: #if ($hasHTMLStats)
964:
965: #set ($class = "tab-panel clearfix")
966: #if ($view == "htmlstats")
967: #set ($class = "tab-panel active clearfix")
968: #end
969: <div class="${class}">
970: <a href="${htmlStatsURL}" class="bio-htmlstats-identifier">Click to view HTML Stats</a>
971: </div>
972:
973: #end
974: ## HTML STATS
975:
976: ## NEWS
977: #if ($releases.size() > 0)
978: #set ($class = "tab-panel clearfix")
979: #if ($view == "news")
980: #set ($class = "tab-panel active clearfix")
981: #end
982: <div class="${class}">
983: #printGrid($releases, "article")
984: </div> ## tab-content
985: #end
986: ## NEWS
987:
988: ## PHOTOS
989: #if ($playerPhotos.size() > 0)
990: #set ($class = "tab-panel clearfix")
991: #if ($view == "photos")
992: #set ($class = "tab-panel active clearfix")
993: #end
994: <div class="${class}">
995: $website.includeAgain("${page.url}?tmpl=bio-photos-template")
996: </div> ## tab-content
997: #end
998: ## PHOTOS
999:
1000: ## VIDEOS
1001: #if ($playerVideos.size() > 0)
1002: #set ($class = "tab-panel clearfix")
1003: #if ($view == "videos")
1004: #set ($class = "tab-panel active clearfix")
1005: #end
1006: <div class="${class}">
1007: #printGrid($playerVideos, "video")
1008: </div> ## tab-content
1009: #end
1010: ## VIDEOS
1011:
1012: </div> ## tab-panels
1013: </div> ## tab-container
1014: </div> ## body
1015: #end
1016:
1017: $wiki
1018: </div> ## ends bio-wrap
1019:
1020: ## GLOBAL ADS SERVER
1021: #if ($website.ads.isAdvertisingEnabled('BIOS'))
1022: $website.includeAgain("global-adserver-slots?adSlot=bios")
1023: #end