13 Alex Soqui
13 - Alex Soqui
Height: 5-8
Bats/Throws: R/R
Year: Sophomore
Hometown: Acushnet, Mass.
High School: New Bedford
Position: Pitcher
Major: Physical Therapy
app 14
gs 12
w 3
l 8
sv 0
ip 47.0
era 5.21
k 23

2018 Season: Started 36 of 37 games that she appeared in for the Sharks ... Served primarily as the team's designated player, when not in the pitching circle ... Batted .271 (29-107) with 16 runs batted in, 10 runs scored and six doubles ... Registered seven multi-hit games, including three straight games with two hits apiece to hit .750 (6-8) with four doubles, three RBI and three runs scored over the stretch from March 6-7 ... Went 3-4 with a double, two runs scored and four RBI at Anna Maria College on April 28 ... Appeared in 14 contests as a pitcher, while making 12 starts and tossing one complete game ... Posted a 5.21 earned run average over 47 innings, which ranked second on the team ... Struck out 23 and walked 13 ... Enjoyed a four-game stretch where she posted a 0.91 ERA over 15 and a third innings pitched, while striking out eight and issuing four walks from March 9-28 ... Threw four and a third innings of four-hit, shutout ball in addition to a strike out and two walks to earn a win over Brandeis University on March 28 ... Gave up an unearned run in five innings on five hits and fanned four batters to earn the victory over Heidelberg University on March 9.

2017 Season: Started 30 of 34 games, including 14 appearances from the pitching circle ... Made her collegiate debut, going 2-2 as the team's designated player vs. Meredith College on March 9 ... Hurled two hitless innings, striking out a batter and issuing a pair of walks in her first career pitching appearance on March 29 vs. Wentworth Institute of Technology ... Led the Sharks and ranked ninth among conference leaders with a 2.98 earned run average ... Made 10 starts from the pitching circle, tossing 56 1/3 innings, while striking out 21 and walking 20 ... Hurled five complete games, including an eight-inning outing, where she allowed no earned runs on seven hits and a walk to go with five strikeouts at Mount Ida College on April 29 ... Won her first collegiate pitching start, allowing just one earned run on five hits and two walks, while fanning four in seven complete innings vs. Eastern Nazarene College on April 5 ... Batted .264 (24-91) and saw time at first base and the outfield ... Knocked in eight runs and collected two doubles and a triple ... Recorded six multi-hit games to rank fourth on the team ... Owned a pair of five-game hitting streaks, including a span from April 9-15, where she batted .438 (7-16) with two RBI and a run scored.

High School/Personal: Four-year letterwinner in softball and swimming and played a year of Junior Varsity basketball for New Bedford High School ... Named a Big Three Conference Softball All-Star by the Boston Globe, Boston Herald for her sophomore, junior and senior campaigns for the Whalers ... Tabbed to the New Bedford Standard-Times Super Team following her sophomore and junior seasons and was named to the Standard-Times All-Star squad as a senior for NBHS softball ... Named a Captain for NBHS softball for her sophomore, junior and senior years, while being selected a Captain for the New Bedford High School swim team as a senior ... Earned Most Improved honors for New Bedford High swim team as a senior ... Member of National Honor Society at New Bedford High and was also a Homeroom Representative ... Born August 5, 1998 ... Majoring in Physical Therapy at Simmons and would like to pursue a career in Pediatric Physical Therapy ... Daughter of Jennifer Carreau-Soqui and Steve Soqui ... Enjoys music and watching Netflix.

Recent Games
Apr 28 at Anna Maria W, 14-10
Apr 29 Suffolk L, 10-1
Apr 29 Suffolk L, 14-0
May 3 vs. Emmanuel (Mass.) L, 8-3
May 5 vs. Saint Joseph's (Me.) W, 4-1
May 5 vs. Emmanuel (Mass.) L, 6-3
Statistics category Overall Conf
Games 37 21
Plate appearances 109 67
At Bats 107 65
Runs 10 6
Hits 29 18
Doubles 6 2
Triples - -
Home Runs - -
Runs Batted In 16 10
Total bases 35 20
Walks 1 1
Hit by pitch - -
Strikeouts 14 10
Sacrifice Flies 1 1
Sacrifice Hits - -
Hit into double play 1 -
Stolen Bases - -
Caught Stealing - -
Batting Average .271 .277
On Base Percentage .275 .284
Slugging Percentage .327 .308
Appearances 14 7
Games started 12 6
Wins 3 1
Losses 8 3
Saves 0 0
Complete Games 1 -
Shutouts - -
Innings Pitched 47.0 23.1
Hits 78 38
Runs 59 29
Earned Runs 35 17
Walks 13 6
Strikeouts 23 13
Strikeouts per Game 3.43 3.90
Doubles Allowed 10 5
Triples Allowed 2 -
Home Runs Allows 5 -
At Bats Against 215 108
Batting Average Against .363 .352
Earned Run Average 5.21 5.10
Wild pitches 7 5
Hit Batters 7 3
Balks - -
Sacrifice Flies Allowed 2 1
Sacrifice Hits Allowed 11 7
Total Chances 34 15
Put Outs 11 3
Assists 21 10
Errors 2 2
Fielding Percentage .941 .867
Double Plays - -
Stolen Bases Allowed 18 8
Runners Caught Stealing 1 -
Runners Caught Stealing Percentage .053 -
Passed Balls - -
Catcher's Interference - -
Date Opponent Score ab r h 2b 3b hr rbi bb k sb cs
Mar 6 vs. Heidelberg L, 5-3 3 0 0 - - - 0 - - - -
Mar 6 vs. Rhodes L, 29-5 3 1 2 2 - - 1 - - - -
Mar 7 vs. Penn St.-New Kens. W, 19-0 2 2 2 - - - 1 - - - -
Mar 7 vs. Muhlenberg L, 9-2 3 0 2 2 - - 1 - - - -
Mar 8 vs. Muskingum L, 3-2 4 0 0 - - - 1 - - - -
Mar 8 vs. DeSales L, 13-0 2 0 0 - - - 0 - - - -
Mar 9 vs. WPI L, 8-6 4 0 0 - - - 0 - 1 - -
Mar 9 vs. Heidelberg W, 8-6 0 0 0 - - - 0 - - - -
Mar 24 Emmanuel (Mass.) L, 6-4 3 0 0 - - - 0 - 3 - -
Mar 24 Emmanuel (Mass.) W, 4-2 - - - - - - - - - - -
Mar 25 at Albertus Magnus L, 7-4 3 0 1 - - - 0 - - - -
Mar 25 at Albertus Magnus L, 9-1 3 0 1 - - - 0 - - - -
Mar 28 Brandeis W, 2-0 2 0 0 - - - 0 - 1 - -
Mar 28 Brandeis W, 2-1 3 0 0 - - - 0 - - - -
Mar 30 Union (N.Y.) W, 8-0 2 0 1 - - - 1 - - - -
Mar 30 Union (N.Y.) W, 6-3 - - - - - - - - - - -
Mar 31 Mount Ida L, 8-4 4 1 3 - - - 0 - 1 - -
Mar 31 Mount Ida W, 5-1 3 0 1 - - - 1 - 1 - -
Apr 7 at Regis (Mass.) W, 14-1 4 0 0 - - - 0 - 2 - -
Apr 7 at Regis (Mass.) W, 5-1 - - - - - - - - - - -
Apr 8 Saint Joseph's (Me.) W, 4-3 3 0 0 - - - 0 - - - -
Apr 8 Saint Joseph's (Me.) W, 8-4 3 0 1 - - - 0 - - - -
Apr 10 Norwich W, 11-5 3 1 2 - - - 3 - - - -
Apr 10 Norwich W, 9-8 4 0 0 - - - 1 - - - -
Apr 14 at Lasell W, 10-0 3 0 0 - - - 0 - - - -
Apr 14 at Lasell L, 5-4 3 0 1 1 - - 0 - 1 - -
Apr 18 MIT L, 7-1 3 0 1 - - - 0 - 1 - -
Apr 18 MIT L, 8-0 2 0 0 - - - 0 - - - -
Apr 21 at Johnson & Wales (RI) L, 11-0 2 0 0 - - - 0 - - - -
Apr 21 at Johnson & Wales (RI) L, 6-0 2 0 0 - - - 0 - - - -
Apr 22 at St. Joseph (Conn.) W, 8-2 4 1 3 - - - 0 - - - -
Apr 22 at St. Joseph (Conn.) W, 6-0 3 1 0 - - - 0 1 2 - -
Apr 27 Rivier W, 10-2 4 0 1 - - - 1 - - - -
Apr 27 Rivier W, 8-7 4 0 1 - - - 0 - - - -
Apr 28 at Anna Maria W, 18-2 4 2 3 1 - - 4 - - - -
Apr 28 at Anna Maria W, 14-10 - - - - - - - - - - -
Apr 29 Suffolk L, 10-1 3 0 0 - - - 0 - - - -
Apr 29 Suffolk L, 14-0 0 0 0 - - - 0 - - - -
May 3 vs. Emmanuel (Mass.) L, 8-3 3 0 1 - - - 0 - - - -
May 5 vs. Saint Joseph's (Me.) W, 4-1 3 0 1 - - - 1 - - - -
May 5 vs. Emmanuel (Mass.) L, 6-3 3 1 1 - - - 0 - 1 - -
Date Opponent Score hbp sf sh tb xbh hdp go fo go/fo pa
Mar 6 vs. Heidelberg L, 5-3 - - - 0 0 - 2 1 2.00 3
Mar 6 vs. Rhodes L, 29-5 - - - 4 2 - 1 - - 3
Mar 7 vs. Penn St.-New Kens. W, 19-0 - - - 2 0 - - - - 2
Mar 7 vs. Muhlenberg L, 9-2 - - - 4 2 - - 1 - 3
Mar 8 vs. Muskingum L, 3-2 - - - 0 0 1 2 1 2.00 4
Mar 8 vs. DeSales L, 13-0 - - - 0 0 - 1 1 1.00 2
Mar 9 vs. WPI L, 8-6 - - - 0 0 - - 3 - 4
Mar 9 vs. Heidelberg W, 8-6 - - - 0 0 - - - - 0
Mar 24 Emmanuel (Mass.) L, 6-4 - - - 0 0 - - - - 3
Mar 24 Emmanuel (Mass.) W, 4-2 - - - - - - - - - -
Mar 25 at Albertus Magnus L, 7-4 - - - 1 0 - 2 - - 3
Mar 25 at Albertus Magnus L, 9-1 - - - 1 0 - 2 - - 3
Mar 28 Brandeis W, 2-0 - - - 0 0 - - 1 - 2
Mar 28 Brandeis W, 2-1 - - - 0 0 - - 3 - 3
Mar 30 Union (N.Y.) W, 8-0 - - - 1 0 - - 1 - 2
Mar 30 Union (N.Y.) W, 6-3 - - - - - - - - - -
Mar 31 Mount Ida L, 8-4 - - - 3 0 - - - - 4
Mar 31 Mount Ida W, 5-1 - - - 1 0 - 1 - - 3
Apr 7 at Regis (Mass.) W, 14-1 - - - 0 0 - - 1 - 4
Apr 7 at Regis (Mass.) W, 5-1 - - - - - - - - - -
Apr 8 Saint Joseph's (Me.) W, 4-3 - - - 0 0 - 2 1 2.00 3
Apr 8 Saint Joseph's (Me.) W, 8-4 - - - 1 0 - 1 1 1.00 3
Apr 10 Norwich W, 11-5 - 1 - 2 0 - 1 1 1.00 4
Apr 10 Norwich W, 9-8 - - - 0 0 - 3 1 3.00 4
Apr 14 at Lasell W, 10-0 - - - 0 0 - 1 - - 3
Apr 14 at Lasell L, 5-4 - - - 2 1 - 1 - - 3
Apr 18 MIT L, 7-1 - - - 1 0 - - 1 - 3
Apr 18 MIT L, 8-0 - - - 0 0 - 1 1 1.00 2
Apr 21 at Johnson & Wales (RI) L, 11-0 - - - 0 0 - 2 - - 2
Apr 21 at Johnson & Wales (RI) L, 6-0 - - - 0 0 - - 1 - 2
Apr 22 at St. Joseph (Conn.) W, 8-2 - - - 3 0 - 1 - - 4
Apr 22 at St. Joseph (Conn.) W, 6-0 - - - 0 0 - - 1 - 4
Apr 27 Rivier W, 10-2 - - - 1 0 - 2 - - 4
Apr 27 Rivier W, 8-7 - - - 1 0 - 2 1 2.00 4
Apr 28 at Anna Maria W, 18-2 - - - 4 1 - 1 - - 4
Apr 28 at Anna Maria W, 14-10 - - - - - - - - - -
Apr 29 Suffolk L, 10-1 - - - 0 0 - 2 1 2.00 3
Apr 29 Suffolk L, 14-0 - - - 0 0 - - - - 0
May 3 vs. Emmanuel (Mass.) L, 8-3 - - - 1 0 - 1 1 1.00 3
May 5 vs. Saint Joseph's (Me.) W, 4-1 - - - 1 0 - 2 - - 3
May 5 vs. Emmanuel (Mass.) L, 6-3 - - - 1 0 - 1 - - 3
Date Opponent Score gs w l sv ip h r er era bb k hr
Mar 6 vs. Heidelberg L, 5-3 1 0 1 0 6.0 7 5 3 3.50 2 2 -
Mar 6 vs. Rhodes L, 29-5 0 0 0 0 0.0 - - - 0.00 - - -
Mar 7 vs. Penn St.-New Kens. W, 19-0 0 0 0 0 0.0 - - - 0.00 - - -
Mar 7 vs. Muhlenberg L, 9-2 1 0 1 0 4.1 8 8 6 9.69 1 0 -
Mar 8 vs. Muskingum L, 3-2 0 0 0 0 0.0 - - - 0.00 - - -
Mar 8 vs. DeSales L, 13-0 1 0 1 0 0.2 5 5 5 52.50 0 0 2
Mar 9 vs. WPI L, 8-6 0 0 0 0 0.0 - - - 0.00 - - -
Mar 9 vs. Heidelberg W, 8-6 0 1 0 0 5.0 5 1 - 0.00 - 4 -
Mar 24 Emmanuel (Mass.) L, 6-4 1 0 1 0 5.1 6 4 1 1.31 1 3 -
Mar 24 Emmanuel (Mass.) W, 4-2 - - - - - - - - - - - -
Mar 25 at Albertus Magnus L, 7-4 0 0 0 0 0.0 - - - 0.00 - - -
Mar 25 at Albertus Magnus L, 9-1 0 0 0 0 0.2 3 3 1 10.50 1 - -
Mar 28 Brandeis W, 2-0 1 1 0 0 4.1 4 0 0 0.00 2 1 -
Mar 28 Brandeis W, 2-1 0 0 0 0 0.0 - - - 0.00 - - -
Mar 30 Union (N.Y.) W, 8-0 0 0 0 0 0.0 - - - 0.00 - - -
Mar 30 Union (N.Y.) W, 6-3 - - - - - - - - - - - -
Mar 31 Mount Ida L, 8-4 1 0 1 0 2.1 8 4 4 12.00 1 0 -
Mar 31 Mount Ida W, 5-1 0 0 0 0 0.0 - - - 0.00 - - -
Apr 7 at Regis (Mass.) W, 14-1 0 0 0 0 0.0 - - - 0.00 - - -
Apr 7 at Regis (Mass.) W, 5-1 - - - - - - - - - - - -
Apr 8 Saint Joseph's (Me.) W, 4-3 0 0 0 0 0.0 - - - 0.00 - - -
Apr 8 Saint Joseph's (Me.) W, 8-4 1 1 0 0 4.2 5 3 3 4.50 2 1 -
Apr 10 Norwich W, 11-5 0 0 0 0 0.0 - - - 0.00 - - -
Apr 10 Norwich W, 9-8 1 0 0 0 4.2 8 6 6 9.00 0 7 -
Apr 14 at Lasell W, 10-0 0 0 0 0 0.0 - - - 0.00 - - -
Apr 14 at Lasell L, 5-4 1 0 0 0 3.2 6 4 1 1.91 0 2 -
Apr 18 MIT L, 7-1 0 0 0 0 0.0 - - - 0.00 - - -
Apr 18 MIT L, 8-0 1 0 1 0 0.1 5 6 2 42.00 0 0 2
Apr 21 at Johnson & Wales (RI) L, 11-0 0 0 0 0 0.0 - - - 0.00 - - -
Apr 21 at Johnson & Wales (RI) L, 6-0 0 0 0 0 0.0 - - - 0.00 - - -
Apr 22 at St. Joseph (Conn.) W, 8-2 0 0 0 0 0.0 - - - 0.00 - - -
Apr 22 at St. Joseph (Conn.) W, 6-0 0 0 0 0 0.0 - - - 0.00 - - -
Apr 27 Rivier W, 10-2 0 0 0 0 0.0 - - - 0.00 - - -
Apr 27 Rivier W, 8-7 0 0 0 0 0.0 - - - 0.00 - - -
Apr 28 at Anna Maria W, 18-2 0 0 0 0 0.0 - - - 0.00 - - -
Apr 28 at Anna Maria W, 14-10 - - - - - - - - - - - -
Apr 29 Suffolk L, 10-1 0 0 0 0 0.0 - - - 0.00 - - -
Apr 29 Suffolk L, 14-0 1 0 1 0 2.0 2 5 1 3.50 1 0 -
May 3 vs. Emmanuel (Mass.) L, 8-3 0 0 0 0 0.0 - - - 0.00 - - -
May 5 vs. Saint Joseph's (Me.) W, 4-1 0 0 0 0 0.0 - - - 0.00 - - -
May 5 vs. Emmanuel (Mass.) L, 6-3 1 0 1 0 3.0 6 5 2 4.67 2 3 1
Date Opponent Score tc po a e fpct dp sba rcs rcs% pb ci
Mar 6 vs. Heidelberg L, 5-3 5 2 3 0 1.000 - 4 - - - -
Mar 6 vs. Rhodes L, 29-5 5 4 1 0 1.000 - - - - - -
Mar 7 vs. Penn St.-New Kens. W, 19-0 0 0 0 0 - - - - - - -
Mar 7 vs. Muhlenberg L, 9-2 1 0 1 0 1.000 - 3 - - - -
Mar 8 vs. Muskingum L, 3-2 0 0 0 0 - - - - - - -
Mar 8 vs. DeSales L, 13-0 1 0 1 0 1.000 - 1 - - - -
Mar 9 vs. WPI L, 8-6 0 0 0 0 - - - - - - -
Mar 9 vs. Heidelberg W, 8-6 4 1 3 0 1.000 - 1 - - - -
Mar 24 Emmanuel (Mass.) L, 6-4 2 1 1 0 1.000 - - - - - -
Mar 24 Emmanuel (Mass.) W, 4-2 - - - - - - - - - - -
Mar 25 at Albertus Magnus L, 7-4 0 0 0 0 - - - - - - -
Mar 25 at Albertus Magnus L, 9-1 0 0 0 0 - - - - - - -
Mar 28 Brandeis W, 2-0 2 1 1 0 1.000 - - - - - -
Mar 28 Brandeis W, 2-1 0 0 0 0 - - - - - - -
Mar 30 Union (N.Y.) W, 8-0 0 0 0 0 - - - - - - -
Mar 30 Union (N.Y.) W, 6-3 - - - - - - - - - - -
Mar 31 Mount Ida L, 8-4 3 1 2 0 1.000 - 3 - - - -
Mar 31 Mount Ida W, 5-1 0 0 0 0 - - - - - - -
Apr 7 at Regis (Mass.) W, 14-1 1 0 1 0 1.000 - - - - - -
Apr 7 at Regis (Mass.) W, 5-1 - - - - - - - - - - -
Apr 8 Saint Joseph's (Me.) W, 4-3 0 0 0 0 - - - - - - -
Apr 8 Saint Joseph's (Me.) W, 8-4 1 0 1 0 1.000 - - - - - -
Apr 10 Norwich W, 11-5 0 0 0 0 - - - - - - -
Apr 10 Norwich W, 9-8 3 0 2 1 .667 - 3 - - - -
Apr 14 at Lasell W, 10-0 0 0 0 0 - - - - - - -
Apr 14 at Lasell L, 5-4 5 1 3 1 .800 - 1 - - - -
Apr 18 MIT L, 7-1 0 0 0 0 - - - - - - -
Apr 18 MIT L, 8-0 0 0 0 0 - - 1 - - - -
Apr 21 at Johnson & Wales (RI) L, 11-0 0 0 0 0 - - - - - - -
Apr 21 at Johnson & Wales (RI) L, 6-0 0 0 0 0 - - - - - - -
Apr 22 at St. Joseph (Conn.) W, 8-2 0 0 0 0 - - - - - - -
Apr 22 at St. Joseph (Conn.) W, 6-0 0 0 0 0 - - - - - - -
Apr 27 Rivier W, 10-2 0 0 0 0 - - - - - - -
Apr 27 Rivier W, 8-7 0 0 0 0 - - - - - - -
Apr 28 at Anna Maria W, 18-2 0 0 0 0 - - - - - - -
Apr 28 at Anna Maria W, 14-10 - - - - - - - - - - -
Apr 29 Suffolk L, 10-1 0 0 0 0 - - - - - - -
Apr 29 Suffolk L, 14-0 0 0 0 0 - - 1 - - - -
May 3 vs. Emmanuel (Mass.) L, 8-3 0 0 0 0 - - - - - - -
May 5 vs. Saint Joseph's (Me.) W, 4-1 0 0 0 0 - - - - - - -
May 5 vs. Emmanuel (Mass.) L, 6-3 1 0 1 0 1.000 - - 1 1.000 - -
  g ab r h 2b 3b hr rbi bb k sb cs avg obp slg
2016-17 34 91 5 24 2 1 - 8 4 18 - - .264 .295 .308
2017-18 37 107 10 29 6 - - 16 1 14 - - .271 .275 .327
2018-19 8 11 0 2 1 - - 2 1 2 - - .182 .250 .273
2019-20 5 6 1 0 - - - 0 1 2 - - .000 .143 .000
Total 84 215 16 55 9 1 - 26 7 36 - - .256 .278 .307
  g hbp sf sh tb xbh hdp go fo go/fo pa
2016-17 34 - - - 28 3 1 27 20 1.35 95
2017-18 37 - 1 - 35 6 1 35 24 1.46 109
2018-19 8 - - - 3 1 - 2 5 0.40 12
2019-20 5 - - - 0 0 - 2 2 1.00 7
Total 84 - 1 - 66 10 2 66 51 1.29 223
  app gs w l sv cg ip h r er bb k k/7 hr era
2016-17 14 10 3 6 0 5 56.1 74 42 24 20 21 2.61 1 2.98
2017-18 14 12 3 8 0 1 47.0 78 59 35 13 23 3.43 5 5.21
2018-19 7 5 0 3 0 - 14.1 45 38 25 10 5 2.44 - 12.21
2019-20 5 4 2 2 0 2 24.0 32 14 8 5 9 2.63 - 2.33
Total 40 31 8 19 0 8 141.2 229 153 92 48 58 2.87 6 4.55
  g tc po a e fpct dp sba rcs rcs% pb ci
2016-17 34 37 11 24 2 .946 2 5 3 .375 - -
2017-18 37 34 11 21 2 .941 - 18 1 .053 - -
2018-19 8 3 0 2 1 .667 - 2 - - - -
2019-20 5 5 0 5 0 1.000 - 5 1 .167 - -
Total 84 79 22 52 5 .937 2 30 5 .143 - -
  g ab r h 2b 3b hr rbi bb k sb cs avg obp slg
Total 37 107 10 29 6 - - 16 1 14 - - .271 .275 .327
Conference 21 65 6 18 2 - - 10 1 10 - - .277 .284 .308
Exhibition - - - - - - - - - - - - - - -
-
Home 16 46 2 11 - - - 7 - 7 - - .239 .234 .239
Away 10 31 4 9 2 - - 4 1 5 - - .290 .313 .355
There was a problem with a Velocity script
Pagebio-template
ErrorVM #split: too few arguments to macro. Wanted 5 got 3 at bio-template[line 301, column 1]
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 &nbsp; #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">&nbsp;</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">&nbsp;</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&current_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