
Height: | 6-2 |
Weight: | 215 |
Year: | Sr. |
Hometown: | Waldorf, Md. |
High School: | Westlake |
Position: | LB/DE |
2015 (Junior): Selected as an All-NJAC Honorable Mention... Finished the year with 68 tackles including 28 unassisted… Earmed 5.5 sacks on the season and 11.5 tackles for loss… Recorded one fumble recovery.
2014 (Sophomore): Ranked second on the Wolverines with 8.5 sacks while starting in all 14 games at defensive end… Credited with 51 tackles with 11 coming for a loss as well as two forced fumbles, two fumble recoveries and a blocked kick… Also broke up two passes and recorded three more quarterback hurries… Had at least two tackles in 12 games with six stops in the first three contests… Made six tackles with 1.5 sacks against Southern Virginia while being issues a hurry and a pass breakup… Forced a fumble, broke up a pass and sacked the quarterback at Concordia… Recorded four stops with a TFL at Menlo… Pair of sacks and five tackles at Virginia-Lynchburg… Named ECAC Defensive Player of the Week after tallying season-high seven tackles at Division I Charlotte while also recording a sack, a forced fumble and a pair of recoveries… Season-high three sacks along with seven tackles against MIT in 2nd Round of NCAA Playoffs… Also blocked a punt that was returned for a touchdown against the Engineers… Tallied six stops against Hobart in the NCAA Quarterfinals.
2013 (Freshman): Appeared in all 13 games at defensive end and will compete for a starting spot as a sophomore in 2014… Finished with ten tackles, 4.0 sacks and a blocked kick… Had assisted tackles in first two outings against Salisbury and at Birmingham Southern… Season-high three stops with 1.5 sacks against Virginia-Lynchburg… Blocked a kick that resulted in a touchdown against Menlo… Tallied two tackles with a sack in Quarterfinals at Mount Union.
Recent Games | ||
---|---|---|
Oct 22 | at Rowan | W, 24-17 |
Oct 29 | Montclair St. | W, 37-14 |
Nov 5 | at Salisbury | W, 44-27 |
Nov 12 | William Paterson | W, 59-14 |
Nov 19 | Stevenson | W, 38-17 |
Nov 26 | at John Carroll | L, 20-17 |
Statistics category | Overall | Conf | ||
---|---|---|---|---|
Solo tackles | 37 | 22 | ||
Assists | 33 | 24 | ||
Tackles | 70.0 | 46.0 | ||
Tackles per game | 5.8 | 5.1 | ||
Sacks | 8 | 2.5 | ||
Sack yards | 64 | 20 | ||
Interceptions | 1 | - | ||
Returned for touchdown | 0 | - | ||
Fumble recoveries | 3 | 3 | ||
Fumble return TDs | - | - |
Date | Opponent | Score | comp | att | pct | yds | y/a | td | int | sac | yds |
---|---|---|---|---|---|---|---|---|---|---|---|
Sep 2 | Delaware Valley | L, 21-14 | - | - | - | - | - | - | - | - | - |
Sep 10 | Frostburg St. | W, 43-7 | - | - | - | - | - | - | - | - | - |
Sep 17 | at Christopher Newport | L, 42-28 | - | - | - | - | - | - | - | - | - |
Oct 1 | at Southern Virginia | W, 63-9 | - | - | - | - | - | - | - | - | - |
Oct 8 | TCNJ | W, 41-0 | - | - | - | - | - | - | - | - | - |
Oct 15 | at Kean | W, 48-17 | - | - | - | - | - | - | - | - | - |
Oct 22 | at Rowan | W, 24-17 | - | - | - | - | - | - | - | - | - |
Oct 29 | Montclair St. | W, 37-14 | - | - | - | - | - | - | - | - | - |
Nov 5 | at Salisbury | W, 44-27 | - | - | - | - | - | - | - | - | - |
Nov 12 | William Paterson | W, 59-14 | - | - | - | - | - | - | - | - | - |
Nov 19 | Stevenson | W, 38-17 | - | - | - | - | - | - | - | - | - |
Nov 26 | at John Carroll | L, 20-17 | - | - | - | - | - | - | - | - | - |
Date | Opponent | Score | rush | yds | y/a | lng | td | fum | lost |
---|---|---|---|---|---|---|---|---|---|
Sep 2 | Delaware Valley | L, 21-14 | - | - | - | - | - | - | - |
Sep 10 | Frostburg St. | W, 43-7 | - | - | - | - | - | - | - |
Sep 17 | at Christopher Newport | L, 42-28 | - | - | - | - | - | - | - |
Oct 1 | at Southern Virginia | W, 63-9 | - | - | - | - | - | - | - |
Oct 8 | TCNJ | W, 41-0 | - | - | - | - | - | - | - |
Oct 15 | at Kean | W, 48-17 | - | - | - | - | - | - | - |
Oct 22 | at Rowan | W, 24-17 | - | - | - | - | - | - | - |
Oct 29 | Montclair St. | W, 37-14 | - | - | - | - | - | - | - |
Nov 5 | at Salisbury | W, 44-27 | - | - | - | - | - | - | - |
Nov 12 | William Paterson | W, 59-14 | - | - | - | - | - | - | - |
Nov 19 | Stevenson | W, 38-17 | - | - | - | - | - | - | - |
Nov 26 | at John Carroll | L, 20-17 | - | - | - | - | - | - | - |
Date | Opponent | Score | rec | yds | y/r | lng | td | fum | lost |
---|---|---|---|---|---|---|---|---|---|
Sep 2 | Delaware Valley | L, 21-14 | - | - | - | - | - | - | - |
Sep 10 | Frostburg St. | W, 43-7 | - | - | - | - | - | - | - |
Sep 17 | at Christopher Newport | L, 42-28 | - | - | - | - | - | - | - |
Oct 1 | at Southern Virginia | W, 63-9 | - | - | - | - | - | - | - |
Oct 8 | TCNJ | W, 41-0 | - | - | - | - | - | - | - |
Oct 15 | at Kean | W, 48-17 | - | - | - | - | - | - | - |
Oct 22 | at Rowan | W, 24-17 | - | - | - | - | - | - | - |
Oct 29 | Montclair St. | W, 37-14 | - | - | - | - | - | - | - |
Nov 5 | at Salisbury | W, 44-27 | - | - | - | - | - | - | - |
Nov 12 | William Paterson | W, 59-14 | - | - | - | - | - | - | - |
Nov 19 | Stevenson | W, 38-17 | - | - | - | - | - | - | - |
Nov 26 | at John Carroll | L, 20-17 | - | - | - | - | - | - | - |
Date | Opponent | Score | fgm | fga | lng | xpm | xpa | pts |
---|---|---|---|---|---|---|---|---|
Sep 2 | Delaware Valley | L, 21-14 | - | - | - | - | - | 0 |
Sep 10 | Frostburg St. | W, 43-7 | - | - | - | - | - | 0 |
Sep 17 | at Christopher Newport | L, 42-28 | - | - | - | - | - | 0 |
Oct 1 | at Southern Virginia | W, 63-9 | - | - | - | - | - | 0 |
Oct 8 | TCNJ | W, 41-0 | - | - | - | - | - | 0 |
Oct 15 | at Kean | W, 48-17 | - | - | - | - | - | 0 |
Oct 22 | at Rowan | W, 24-17 | - | - | - | - | - | 0 |
Oct 29 | Montclair St. | W, 37-14 | - | - | - | - | - | 0 |
Nov 5 | at Salisbury | W, 44-27 | - | - | - | - | - | 0 |
Nov 12 | William Paterson | W, 59-14 | - | - | - | - | - | 0 |
Nov 19 | Stevenson | W, 38-17 | - | - | - | - | - | 0 |
Nov 26 | at John Carroll | L, 20-17 | - | - | - | - | - | 0 |
Date | Opponent | Score | punt | yds | avg | long | in20 | fc | tb | blk |
---|---|---|---|---|---|---|---|---|---|---|
Sep 2 | Delaware Valley | L, 21-14 | - | - | - | - | - | - | - | - |
Sep 10 | Frostburg St. | W, 43-7 | - | - | - | - | - | - | - | - |
Sep 17 | at Christopher Newport | L, 42-28 | - | - | - | - | - | - | - | - |
Oct 1 | at Southern Virginia | W, 63-9 | - | - | - | - | - | - | - | - |
Oct 8 | TCNJ | W, 41-0 | - | - | - | - | - | - | - | - |
Oct 15 | at Kean | W, 48-17 | - | - | - | - | - | - | - | - |
Oct 22 | at Rowan | W, 24-17 | - | - | - | - | - | - | - | - |
Oct 29 | Montclair St. | W, 37-14 | - | - | - | - | - | - | - | - |
Nov 5 | at Salisbury | W, 44-27 | - | - | - | - | - | - | - | - |
Nov 12 | William Paterson | W, 59-14 | - | - | - | - | - | - | - | - |
Nov 19 | Stevenson | W, 38-17 | - | - | - | - | - | - | - | - |
Nov 26 | at John Carroll | L, 20-17 | - | - | - | - | - | - | - | - |
Date | Opponent | Score | kr | yds | avg | lng | td | pr | yds | avg | lng | td |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Sep 2 | Delaware Valley | L, 21-14 | - | - | - | - | - | - | - | - | - | - |
Sep 10 | Frostburg St. | W, 43-7 | - | - | - | - | - | - | - | - | - | - |
Sep 17 | at Christopher Newport | L, 42-28 | - | - | - | - | - | - | - | - | - | - |
Oct 1 | at Southern Virginia | W, 63-9 | - | - | - | - | - | - | - | - | - | - |
Oct 8 | TCNJ | W, 41-0 | - | - | - | - | - | - | - | - | - | - |
Oct 15 | at Kean | W, 48-17 | - | - | - | - | - | - | - | - | - | - |
Oct 22 | at Rowan | W, 24-17 | - | - | - | - | - | - | - | - | - | - |
Oct 29 | Montclair St. | W, 37-14 | - | - | - | - | - | - | - | - | - | - |
Nov 5 | at Salisbury | W, 44-27 | - | - | - | - | - | - | - | - | - | - |
Nov 12 | William Paterson | W, 59-14 | - | - | - | - | - | - | - | - | - | - |
Nov 19 | Stevenson | W, 38-17 | - | - | - | - | - | - | - | - | - | - |
Nov 26 | at John Carroll | L, 20-17 | - | - | - | - | - | - | - | - | - | - |
Date | Opponent | Score | gp | rush | rcv | pr | kr | yds |
---|---|---|---|---|---|---|---|---|
Sep 2 | Delaware Valley | L, 21-14 | 1 | - | - | - | - | 0 |
Sep 10 | Frostburg St. | W, 43-7 | 1 | - | - | - | - | 0 |
Sep 17 | at Christopher Newport | L, 42-28 | 1 | - | - | - | - | 0 |
Oct 1 | at Southern Virginia | W, 63-9 | 1 | - | - | - | - | 0 |
Oct 8 | TCNJ | W, 41-0 | 1 | - | - | - | - | 0 |
Oct 15 | at Kean | W, 48-17 | 1 | - | - | - | - | 0 |
Oct 22 | at Rowan | W, 24-17 | 1 | - | - | - | - | 0 |
Oct 29 | Montclair St. | W, 37-14 | 1 | - | - | - | - | 0 |
Nov 5 | at Salisbury | W, 44-27 | 1 | - | - | - | - | 0 |
Nov 12 | William Paterson | W, 59-14 | 1 | - | - | - | - | 0 |
Nov 19 | Stevenson | W, 38-17 | 1 | - | - | - | - | 0 |
Nov 26 | at John Carroll | L, 20-17 | 1 | - | - | - | - | 0 |
Date | Opponent | Score | pts | rush | rec | kr | pr | int | fum | xpm | fgm | saf | misc | 2pt |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Sep 2 | Delaware Valley | L, 21-14 | 0 | - | - | - | - | - | - | - | - | - | 0 | - |
Sep 10 | Frostburg St. | W, 43-7 | 0 | - | - | - | - | - | - | - | - | - | 0 | - |
Sep 17 | at Christopher Newport | L, 42-28 | 0 | - | - | - | - | - | - | - | - | - | 0 | - |
Oct 1 | at Southern Virginia | W, 63-9 | 0 | - | - | - | - | - | - | - | - | - | 0 | - |
Oct 8 | TCNJ | W, 41-0 | 0 | - | - | - | - | - | - | - | - | - | 0 | - |
Oct 15 | at Kean | W, 48-17 | 0 | - | - | - | - | - | - | - | - | - | 0 | - |
Oct 22 | at Rowan | W, 24-17 | 0 | - | - | - | - | - | - | - | - | - | 0 | - |
Oct 29 | Montclair St. | W, 37-14 | 0 | - | - | - | - | - | - | - | - | - | 0 | - |
Nov 5 | at Salisbury | W, 44-27 | 0 | - | - | - | - | - | - | - | - | - | 0 | - |
Nov 12 | William Paterson | W, 59-14 | 0 | - | - | - | - | - | - | - | - | - | 0 | - |
Nov 19 | Stevenson | W, 38-17 | 0 | - | - | - | - | - | - | - | - | - | 0 | - |
Nov 26 | at John Carroll | L, 20-17 | 0 | - | - | - | - | 0 | - | - | - | - | 0 | - |
Date | Opponent | Score | tack | ast | tot | sack | lost | tfl | yds | ff | fr | td | int | yds | td | brup | blk | saf |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Sep 2 | Delaware Valley | L, 21-14 | 4 | 5 | 9.0 | 0.5 | 0 | 0.5 | 0 | - | - | - | - | - | - | - | - | - |
Sep 10 | Frostburg St. | W, 43-7 | 3 | 4 | 7.0 | 1 | 4 | 1 | 4 | - | - | - | - | - | - | - | - | - |
Sep 17 | at Christopher Newport | L, 42-28 | 5 | 1 | 6.0 | - | - | 0 | - | - | - | - | - | - | - | - | - | - |
Oct 1 | at Southern Virginia | W, 63-9 | 2 | 2 | 4.0 | - | - | 1 | 6 | - | - | - | - | - | - | - | - | - |
Oct 8 | TCNJ | W, 41-0 | 0 | 5 | 5.0 | 0.5 | 4 | 0.5 | 4 | 1 | 1 | - | - | - | - | - | - | - |
Oct 15 | at Kean | W, 48-17 | 4 | 0 | 4.0 | - | - | 0 | - | - | - | - | - | - | - | - | - | - |
Oct 22 | at Rowan | W, 24-17 | 1 | 1 | 2.0 | - | - | 1 | 1 | - | - | - | - | - | - | - | - | - |
Oct 29 | Montclair St. | W, 37-14 | 3 | 6 | 9.0 | - | - | 0 | - | - | - | - | - | - | - | 1 | - | - |
Nov 5 | at Salisbury | W, 44-27 | 2 | 3 | 5.0 | 1 | 12 | 1 | 12 | 2 | 2 | - | - | - | - | - | - | - |
Nov 12 | William Paterson | W, 59-14 | 2 | 2 | 4.0 | - | - | 1 | 4 | - | - | - | - | - | - | - | - | - |
Nov 19 | Stevenson | W, 38-17 | 6 | 2 | 8.0 | 4 | 37 | 5 | 39 | 2 | - | - | - | - | - | - | - | - |
Nov 26 | at John Carroll | L, 20-17 | 5 | 2 | 7.0 | 1 | 7 | 3 | 14 | 1 | - | - | 1 | 1 | 0 | - | - | - |
gp | tkl | ast | tot | tkl/g | sck | yds | tfl | yds | ff | fr | yds | int | yds | brup | blk | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2013-14 | 11 | 4 | 6 | 10.0 | .9 | 4 | 23 | 4 | 23 | - | - | - | - | - | - | 1 |
2014-15 | 14 | 20 | 31 | 51.0 | 3.6 | 8.5 | 68 | 11 | 74 | 2 | 2 | 0 | - | - | 2 | 1 |
2015-16 | 13 | 28 | 40 | 68.0 | 5.2 | 5.5 | 30 | 11.5 | 45 | - | 1 | 0 | - | - | 1 | - |
2016-17 | 12 | 37 | 33 | 70.0 | 5.8 | 8 | 64 | 14 | 84 | 6 | 3 | 0 | 1 | 1 | 1 | - |
Total | 50 | 89 | 110 | 199.0 | 4.0 | 26 | 185 | 40.5 | 226 | 8 | 6 | 0 | 1 | 1 | 4 | 2 |
gp | comp | att | pct | yds | y/g | y/a | td | int | lg | effic | |
---|---|---|---|---|---|---|---|---|---|---|---|
Total | 12 | - | - | - | - | - | - | - | - | - | 0.0 |
Conference | 9 | - | - | - | - | - | - | - | - | - | 0.0 |
Exhibition | - | - | - | - | - | - | - | - | - | - | 0.0 |
- | |||||||||||
Home | 6 | - | - | - | - | - | - | - | - | - | 0.0 |
Away | 6 | - | - | - | - | - | - | - | - | - | 0.0 |
Neutral | - | - | - | - | - | - | - | - | - | - | 0.0 |
- | |||||||||||
Wins | 9 | - | - | - | - | - | - | - | - | - | 0.0 |
Losses | 3 | - | - | - | - | - | - | - | - | - | 0.0 |
- | |||||||||||
September | 3 | - | - | - | - | - | - | - | - | - | 0.0 |
October | 5 | - | - | - | - | - | - | - | - | - | 0.0 |
November | 4 | - | - | - | - | - | - | - | - | - | 0.0 |
gp | rush | yds | y/g | avg | td | lg | fum | lost | |
---|---|---|---|---|---|---|---|---|---|
Total | 12 | - | - | - | - | - | - | - | - |
Conference | 9 | - | - | - | - | - | - | - | - |
Exhibition | - | - | - | - | - | - | - | - | - |
- | |||||||||
Home | 6 | - | - | - | - | - | - | - | - |
Away | 6 | - | - | - | - | - | - | - | - |
Neutral | - | - | - | - | - | - | - | - | - |
- | |||||||||
Wins | 9 | - | - | - | - | - | - | - | - |
Losses | 3 | - | - | - | - | - | - | - | - |
- | |||||||||
September | 3 | - | - | - | - | - | - | - | - |
October | 5 | - | - | - | - | - | - | - | - |
November | 4 | - | - | - | - | - | - | - | - |
gp | rec | rec/g | yds | y/g | avg | td | lg | |
---|---|---|---|---|---|---|---|---|
Total | 12 | - | - | - | - | - | - | - |
Conference | 9 | - | - | - | - | - | - | - |
Exhibition | - | - | - | - | - | - | - | - |
- | ||||||||
Home | 6 | - | - | - | - | - | - | - |
Away | 6 | - | - | - | - | - | - | - |
Neutral | - | - | - | - | - | - | - | - |
- | ||||||||
Wins | 9 | - | - | - | - | - | - | - |
Losses | 3 | - | - | - | - | - | - | - |
- | ||||||||
September | 3 | - | - | - | - | - | - | - |
October | 5 | - | - | - | - | - | - | - |
November | 4 | - | - | - | - | - | - | - |
gp | fgm | fga | pct | lg | xpm | xpa | pct | pts | |
---|---|---|---|---|---|---|---|---|---|
Total | 12 | - | - | - | - | - | - | - | 0 |
Conference | 9 | - | - | - | - | - | - | - | 0 |
Exhibition | - | - | - | - | - | - | - | - | 0 |
- | |||||||||
Home | 6 | - | - | - | - | - | - | - | 0 |
Away | 6 | - | - | - | - | - | - | - | 0 |
Neutral | - | - | - | - | - | - | - | - | 0 |
- | |||||||||
Wins | 9 | - | - | - | - | - | - | - | 0 |
Losses | 3 | - | - | - | - | - | - | - | 0 |
- | |||||||||
September | 3 | - | - | - | - | - | - | - | 0 |
October | 5 | - | - | - | - | - | - | - | 0 |
November | 4 | - | - | - | - | - | - | - | 0 |
gp | punt | yds | avg | lg | in20 | fc | tb | blk | |
---|---|---|---|---|---|---|---|---|---|
Total | 12 | - | - | - | - | - | - | - | - |
Conference | 9 | - | - | - | - | - | - | - | - |
Exhibition | - | - | - | - | - | - | - | - | - |
- | |||||||||
Home | 6 | - | - | - | - | - | - | - | - |
There was a problem with a Velocity script | |
Page | bio-template |
Error | VM #split: too few arguments to macro. Wanted 5 got 3 at bio-template[line 300, 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 #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" data-player-photo-count="$playerPhotos.size()"> 616: <div class="slider" data-module="slick-slider-init" data-slick-settings="$slickSettings"> 617: #set ($playerPhotos = $tool.sorter.sort($playerPhotos, "lastUpdated:desc")) 618: #foreach ($photo in $playerPhotos) 619: #if ($velocityCount <= $actionShotsLimit) 620: #set ($imgAlt = "Action shot for ${page.title} image ${velocityCount}") 621: #if ($photo.altText.length() > 0) 622: #set ($imgAlt = $photo.altText) 623: #elseif( $photo.title.length() > 0 ) 624: #set ($imgAlt = $photo.title) 625: #end 626: <div class="image"> 627: <img data-lazy="$photo.url" alt="$imgAlt" data-lastupdated="$photo.lastUpdated"/> 628: </div> 629: #end 630: #end 631: </div> 632: </div> 633: #end 634: #end ## macro printActionShots 635: 636: #macro (printHighlights) 637: #if ($highlights && $showHighlights) 638: <div class="highlights #if ($enhancedLayout) highlights-bio-enhanced #else highlights-bio #end clearfix"> 639: #foreach ($highlight in $highlights.keySet()) 640: #set ($value = "-") 641: #set ($value = $formatter.formatNumber($stats.get($highlight), $formats.get($highlight))) 642: <div class="stat clearfix"> 643: <span class="stat-title">$!highlights.get($highlight)</span> 644: <span class="stat-value">$value</span> 645: </div> 646: #end 647: </div> 648: #end 649: #end ## macro printHighlights 650: #macro (printRoster) 651: #if ($enhancedLayout) 652: $website.includeAgain("${page.url}?tmpl=roster-switcher-template&id=roster-list") 653: #else 654: #if ($page.contentType == "loki/bio") 655: #set ($headlinesFeaturedSize = 0) 656: #foreach ($featuredPage in $page.headlinesFeatured) 657: #if ($featuredPage.contentType == "loki/headlines") 658: #set ($headlinesFeaturedSize = $headlinesFeaturedSize + 1) 659: #end 660: #end 661: #if ($headlinesFeaturedSize > 0) 662: <select class="roster-select-list" aria-label="Select a player to view its full bio from the list of options below."> 663: <option selected="selected">Related Bios</option> 664: #foreach ($featuredPage in $page.headlinesFeatured) 665: #if ($featuredPage.contentType == "loki/headlines") 666: $website.includeAgain("${featuredPage.url}?tmpl=roster-list-template¤t_url=${page.url}") 667: #end 668: #end 669: </select> 670: #end 671: #elseif ($page.contentType == "loki/bio-network") 672: #set ($relatedPlayers = $page.sectionPage.children) 673: #set ($teamNames = {}) 674: #foreach ($relatedPlayer in $relatedPlayers) 675: #if ($relatedPlayer.contentType == "loki/bio-network") 676: #set ($relatedPlayerObj = $relatedPlayer.getDataAsObject().getAttributes()) 677: #set ($teamName = $relatedPlayerObj.get("team")) 678: #if ($teamName.length() > 0) 679: #if (!$teamNames.containsValue($teamName)) 680: $!teamNames.put($tool.math.add($teamNames.size(), 1), $teamName) 681: #end 682: #end 683: #end 684: #end 685: 686: <select class="roster-select-list" aria-label="Select a player to view its full bio from the list of options below."> 687: #foreach ($i in [1..$teamNames.size()]) 688: #if ($teamNames.size() > 1) 689: <optgroup label="$teamNames.get($i)"> 690: #end 691: 692: #foreach ($relatedPlayer in $relatedPlayers) 693: #if ($relatedPlayer.contentType == "loki/bio-network") 694: #set ($relatedPlayerObj = $relatedPlayer.getDataAsObject().getAttributes()) 695: #set ($teamName = $relatedPlayerObj.get("team")) 696: #if ($teamName.length() > 0 && $teamName == $teamNames.get($i)) 697: #set ($playerFirstName = $relatedPlayerObj.get("first_name")) 698: #set ($playerLastName = $relatedPlayerObj.get("last_name")) 699: #if ($page.url == $relatedPlayer.url) 700: <option value="$relatedPlayer.url" selected="selected">${playerFirstName} ${playerLastName}</option> 701: #else 702: <option value="$relatedPlayer.url">${playerFirstName} ${playerLastName}</option> 703: #end 704: #end 705: #end 706: #end 707: 708: #if ($teamNames.size() > 1) 709: </optgroup> 710: #end 711: #end 712: </select> 713: #end 714: #end ## enhancedLayout check 715: #end ## macro printRoster 716: 717: ################################################## END MACROS ############################################################# 718: 719: #if ($attributes.get("full_name").length() > 0) 720: #set ($fullName = $attributes.get("full_name")) 721: #else 722: #set ($firstName = $!attributes.get("first_name")) 723: #set ($lastName = $!attributes.get("last_name")) 724: #set ($fullName = "${firstName} ${lastName}") 725: #end 726: 727: #set ($actionShots = false) 728: #if ($enhancedLayout && $playerPhotos.size() > 0) 729: #set ($actionShots = true) 730: #end 731: 732: #if ($enhancedLayout) 733: #set ($rootClass = "bio-enhanced") 734: #if ($actionShots && $showActionShots) 735: #set ($rootClass = "${rootClass} action") 736: #else 737: #set ($rootClass = "${rootClass} plain") 738: #end 739: #else 740: #set ($rootClass = "bio-wrap") 741: #end 742: 743: ## FULL ROSTER 744: <div class="${rootClass} #if ($highlights) bio-wrap-has-highlights #end clearfix" data-module="stats/responsive-container"> 745: 746: ## RELATED BIOS 747: #if ($showRoster) 748: <div class="related-bios clearfix">#printRoster</div> 749: #end 750: 751: #if ($actionShots) 752: #printActionShots 753: #end 754: 755: <div class="head clearfix"> 756: <div class="clearfix"> 757: 758: <div class="player-about clearfix"> 759: <div class="player-headshot">#printHeadshot</div> 760: <div class="player-info">#printBioInfo</div> 761: </div> 762: 763: #printHighlights 764: 765: </div> 766: </div> ## head 767: 768: #if ($view.length() > 0) 769: <div class="body clearfix"> 770: 771: <div class="tab-container primary clearfix" data-module="stats/tabs" data-type="primary"> 772: <div class="tab-nav" data-module="jscroll" data-momentum="false"> 773: <div> 774: <ul class="clearfix"> 775: #if ($hasSynopsis || $hasBioBrief) 776: <li #if ($view == "bio") class="active" #end><a href="${page.url}?view=bio">Bio</a></li> 777: #end 778: 779: #if ($statsURL.length() > 0) 780: <li #if ($view == "profile") class="active" #end><a href="${page.url}?view=profile">Player Profile</a></li> 781: <li #if ($view == "gamelog") class="active" #end><a href="${page.url}?view=gamelog">Game Log</a></li> 782: #if ($showCareer) 783: <li #if ($view == "career") class="active" #end><a href="${page.url}?view=career">Career Stats</a></li> 784: #end 785: <li #if ($view == "splits") class="active" #end><a href="${page.url}?view=splits">Split Stats</a></li> 786: #end 787: 788: #if ($hasHTMLStats) 789: <li #if ($view == "htmlstats") class="active" #end><a href="${page.url}?view=htmlstats">HTML Stats</a></li> 790: #end 791: 792: #if ($releases.size() > 0) 793: <li #if ($view == "news") class="active" #end><a href="${page.url}?view=news">News</a></li> 794: #end 795: 796: #if ($playerPhotos.size() > 0) 797: <li #if ($view == "photos") class="active" #end><a href="${page.url}?view=photos">Photos</a></li> 798: #end 799: 800: #if ($playerVideos.size() > 0) 801: <li #if ($view == "videos") class="active" #end><a href="${page.url}?view=videos">Videos</a></li> 802: #end 803: </ul> 804: </div> 805: </div> ## tab-nav 806: 807: <div class="tab-panels clearfix"> 808: 809: ## BIO 810: #if ($hasSynopsis || $hasBioBrief) 811: 812: #set ($class = "tab-panel clearfix") 813: #if ($view == "bio") 814: #set ($class = "tab-panel active clearfix") 815: #end 816: <div class="${class}"> 817: 818: <div class="synopsis clearfix"> 819: #if ($hasSynopsis) 820: $synopsis 821: #elseif ($hasBioBrief) 822: $website.include("$bioBriefURL") 823: #end 824: </div> 825: 826: </div> ## tab-panel 827: #end 828: ## BIO 829: 830: ## STATS 831: #if ($statsURL.length() > 0) 832: 833: ## PROFILE 834: #set ($class = "tab-panel clearfix") 835: #if ($view == "profile") 836: #set ($class = "tab-panel active clearfix") 837: #end 838: <div class="${class}"> 839: <div class="stats-wrap clearfix"> 840: 841: ## LAST SIX GAMES 842: <div class="stats-box half"> 843: #printRecentGames() 844: </div> 845: 846: ## RANKING 847: <div class="stats-box half"> 848: #if ($statPos.length() > 0) 849: $website.include("players?tmpl=stats-bios-rank-template&rank=${playerId}&pos=${statPos}") 850: #end 851: </div> 852: 853: </div> ## stats-wrap 854: </div> ## tab-content 855: ## PROFILE 856: 857: ## GAMELOG 858: #set ($class = "tab-panel clearfix") 859: #if ($view == "gamelog") 860: #set ($class = "tab-panel active clearfix") 861: #end 862: 863: #set ($activePos = $statPos) 864: #if ($view == "gamelog" && $paramPos.length() > 0) 865: #if ($positions.get($paramPos).length() > 0) 866: #set ($activePos = $positions.get($paramPos)) 867: #end 868: #end 869: 870: <div class="${class}"> 871: 872: #if ($gamelogsCategoriesLabels) 873: <div class="tab-container clearfix secondary" data-module="stats/tabs" data-type="secondary"> 874: <div class="tab-nav" data-module="jscroll" data-momentum="false"> 875: <div> 876: <ul class="clearfix"> 877: #foreach($gamelogsCatLabel in $gamelogsCategoriesLabels.entrySet()) 878: #set($gamelogsCatLabelVal = $gamelogsCatLabel.value) 879: 880: #if ($locale == "en_gb" && $gamelogsCatLabelVal == "Defense") 881: #set($gamelogsCatLabelVal = "Defence") 882: #end 883: 884: <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> 885: #end 886: </ul> 887: </div> 888: </div> 889: <div class="tab-panels"> 890: #foreach($gamelogsCatLabel in $gamelogsCategoriesLabels.entrySet()) 891: #set ($class = "tab-panel clearfix") 892: #if ($gamelogsCatLabel.key == $activePos) 893: #set ($class = "tab-panel active clearfix") 894: #end 895: <div class="${class}"> 896: <div class="stats-wrap clearfix">#gamelogData($gamelogsCatLabel.key)</div> 897: </div> 898: #end 899: </div> 900: </div> 901: #else 902: <div class="stats-wrap clearfix">#gamelogData($pos)</div> 903: #end 904: 905: </div> ## tab-panel 906: ## GAMELOG 907: 908: 909: ## CAREER 910: #if ($showCareer) 911: 912: #set ($activePos = $statPos) 913: #if ($view == "career" && $paramPos.length() > 0) 914: #if ($positions.get($paramPos).length() > 0) 915: #set ($activePos = $positions.get($paramPos)) 916: #end 917: #end 918: 919: #set ($class = "tab-panel clearfix") 920: #if ($view == "career") 921: #set ($class = "tab-panel active clearfix") 922: #end 923: 924: <div class="${class}"> 925: 926: #if ($briefsCategoriesLabels) 927: #printCategories($briefsCategoriesLabels "career" "Career Stats") 928: #else 929: <div class="stats-wrap clearfix">#careerData($activePos)</div> 930: #end 931: 932: </div> ## tab-panel 933: #end 934: ## CAREER 935: 936: ## SPLITS 937: #set ($class = "tab-panel clearfix") 938: #if ($view == "splits") 939: #set ($class = "tab-panel active clearfix") 940: #end 941: 942: #set ($activePos = $statPos) 943: #if ($view == "splits" && $paramPos.length() > 0) 944: #if ($positions.get($paramPos).length() > 0) 945: #set ($activePos = $positions.get($paramPos)) 946: #end 947: #end 948: 949: <div class="${class}"> 950: 951: #if ($briefsCategoriesLabels) 952: #printCategories($briefsCategoriesLabels "splits" "Splits Stats") 953: #else 954: <div class="stats-wrap clearfix">#splitsData($pos)</div> 955: #end 956: 957: </div> ## tab-panel 958: ## SPLITS 959: 960: #end 961: ## STATS 962: 963: ## HTML STATS 964: #if ($hasHTMLStats) 965: 966: #set ($class = "tab-panel clearfix") 967: #if ($view == "htmlstats") 968: #set ($class = "tab-panel active clearfix") 969: #end 970: <div class="${class}"> 971: <a href="${htmlStatsURL}" class="bio-htmlstats-identifier">Click to view HTML Stats</a> 972: </div> 973: 974: #end 975: ## HTML STATS 976: 977: ## NEWS 978: #if ($releases.size() > 0) 979: #set ($class = "tab-panel clearfix") 980: #if ($view == "news") 981: #set ($class = "tab-panel active clearfix") 982: #end 983: <div class="${class}"> 984: #printGrid($releases, "article") 985: </div> ## tab-content 986: #end 987: ## NEWS 988: 989: ## PHOTOS 990: #if ($playerPhotos.size() > 0) 991: #set ($class = "tab-panel clearfix") 992: #if ($view == "photos") 993: #set ($class = "tab-panel active clearfix") 994: #end 995: <div class="${class}"> 996: $website.includeAgain("${page.url}?tmpl=bio-photos-template") 997: </div> ## tab-content 998: #end 999: ## PHOTOS 1000: 1001: ## VIDEOS 1002: #if ($playerVideos.size() > 0) 1003: #set ($class = "tab-panel clearfix") 1004: #if ($view == "videos") 1005: #set ($class = "tab-panel active clearfix") 1006: #end 1007: <div class="${class}"> 1008: #printGrid($playerVideos, "video") 1009: </div> ## tab-content 1010: #end 1011: ## VIDEOS 1012: 1013: </div> ## tab-panels 1014: </div> ## tab-container 1015: </div> ## body 1016: #end 1017: 1018: $wiki 1019: </div> ## ends bio-wrap 1020: 1021: ## GLOBAL ADS SERVER 1022: #if ($website.ads.isAdvertisingEnabled('BIOS')) 1023: $website.includeAgain("global-adserver-slots?adSlot=bios") 1024: #end |