There was a problem with a Velocity script
Page/bio-template
ErrorInvocation of method 'exists' in class com.prestosports.render.ContentEngineInvoker threw exception java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 237,328 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago. at sxe5ltt8yzuobgtg/bio-template[line 75, column 32]
Page source:
1: ## https://prestosports.jira.com/browse/FED-11158
2: 
3: <script src="${website.cdn("/info/klass.min.js")}"></script>
4: 
5: ## PICK UP OPTIONS
6: $website.include("options")
7: #set ($options = $request.getAttribute("options"))
8: #set ($locale = "en_us")
9: #set ($locale = $options.get("locale"))
10: 
11: ## HACK TO GET STATS URL FROM RENDERER... NEEDS SERVER CHANGE
12: #set ($bioObject = $page.getDataAsObject())
13: #set ($statsURL = $bioObject.statsURL)
14: 
15: #if ($statsURL.length() > 0)
16:   $website.includeAgain("${statsURL}?tmpl=bio-stats-template")
17:   ## various settings to get the variables set
18:   #set ($events = $request.getAttribute("bio_events"))
19:   #set ($seasons = $request.getAttribute("bio_seasons"))
20:   #set ($career = $request.getAttribute("bio_career"))
21:   #set ($labels = $request.getAttribute("bio_labels"))
22:   #set ($briefs = $request.getAttribute("bio_briefs"))
23:   #set ($gamelogs = $request.getAttribute("bio_gamelogs"))
24:   #set ($splits = $request.getAttribute("bio_splits"))
25:   #set ($statPosition = $request.getAttribute("bio_position"))
26:   #set ($positions = $request.getAttribute("bio_positions"))
27:   #set ($playerId = $request.getAttribute("bio_player_id"))
28:   #set ($highlights = $request.getAttribute("bio_highlights"))
29:   #set ($formats = $request.getAttribute("bio_formats"))
30:   #set ($gamelogsCategoriesLabels = $request.getAttribute("bio_gamelogs_labels"))
31:   #set ($briefsCategoriesLabels = $request.getAttribute("bio_briefs_labels"))
32:   #set ($gamesResults = $request.getAttribute("bio_games_results"))
33:   #set ($monthsPlayed = $request.getAttribute("bio_months_played"))
34: #end
35: 
36: #set ($pos = "")
37: #set ($pos = $attributes.get("position"))
38: #set ($pos = $statPosition)
39: #set ($posVec = $pos.split("/"))
40: #set ($pos = $posVec[0])
41: #set ($pos = $pos.toLowerCase())
42: #set ($statPos = $positions.get($pos))
43: #set ($paramPos = $request.getParameter("pos"))
44: 
45: #set ($playerId = $attributes.get("playerId"))
46: #set ($stats = $splits.overall)
47: #set ($highlights = $highlights.get($statPos))
48: 
49: #set ($showHighlights = true)
50: #if ($options.get("bio_show_highlights") && $options.get("bio_show_highlights") == false)
51: 	#set ($showHighlights = false)
52: #end
53: 
54: #set ($enhancedLayout = false)
55: #if (($options.get("bio_enhanced_layout") == "yes") || ($request.getParameter("bio_enhanced_layout") == true))
56: 	#set ($enhancedLayout = true)
57: #end
58: 
59: #set ($showActionShots = true)
60: #if ($options.get("bio_show_action_shots") && $options.get("bio_show_action_shots") == false)
61: 	#set ($showActionShots = false)
62: #end
63: 
64: #set ($actionShotsLimit = 5)
65: #set ($actionShotsLimit = $tool.math.toInteger($options.get("bio_action_shots_limit")))
66: 
67: #set ($showCareer = $wiki.valid() && $seasons)
68: #if ("yes" == $options.get("stats_show_career") && $seasons)
69:   #set ($showCareer = true)
70: #end
71: 
72: #set ($hasEvents = $events.size() > 0)
73: #set ($hasSynopsis = $synopsis.trim().length() > 0)
74: #set ($htmlStatsURL = "${page.url}-stats")
75: #set ($hasHTMLStats = $website.exists($htmlStatsURL))
76: #set ($bioBriefURL = "${page.url}-brief")
77: #set ($hasBioBrief = $website.exists("$bioBriefURL"))
78: #set ($showRoster = ($page.contentType == "loki/bio" && $page.headlinesFeatured.size() > 0) || ($page.contentType == "loki/bio-network" && $page.sectionPage.children.size() > 1))
79: #if ($options.get("bio_hide_roster") == true)
80:   #set ($showRoster = false)
81: #end
82: 
83: #set ($view = "")
84: #if ($hasSynopsis || $hasBioBrief)
85:   #set ($view = "bio")
86: #elseif ($statsURL.length() > 0)
87:   #set ($view = "profile")
88: #elseif ($hasHTMLStats)
89:   #set ($view = "htmlstats")
90: #elseif ($releases.size() > 0)
91:   #set ($view = "news")
92: #elseif ($playerPhotos.size() > 0)
93:   #set ($view = "photos")
94: #elseif ($playerVideos.size() > 0)
95:   #set ($view = "videos")
96: #end
97: 
98: #if ($options.get("bio_default_view").length() > 0)
99:     #set ($checkView = $options.get("bio_default_view"))
100: #else
101:     ## THIS ESTABLISHES A DEFAULT TAB FOR NEW BOOTSTRAP THEMES
102:     #if ($hasSynopsis || $hasBioBrief)
103:         #set ($checkView = "bio")
104:     #elseif ($statsURL.length() > 0)
105:         #set ($checkView = "profile")
106:     #elseif ($releases.size() > 0)
107:         #set ($checkView = "news")
108:     #end
109: #end
110: 
111: #if ($request.getParameter("view"))
112:   #set ($checkView = $request.getParameter("view"))
113: #end
114: 
115: #if ($checkView == "profile" && $statsURL.length() > 0)
116:   #set ($view = "profile")
117: #elseif ($checkView == "bio" && ($hasSynopsis || $hasBioBrief))
118:   #set ($view = "bio")
119: #elseif ($checkView == "gamelog" && $statsURL.length() > 0)
120:   #set ($view = "gamelog")
121: #elseif ($checkView == "career" && $showCareer)
122:   #set ($view = "career")
123: #elseif ($checkView == "splits" && $statsURL.length() > 0)
124:   #set ($view = "splits")
125: #elseif ($checkView == "htmlstats" && $hasHTMLStats)
126:   #set ($view = "htmlstats")
127: #elseif ($checkView == "news" && $releases.size() > 0)
128:   #set ($view = "news")
129: #elseif ($checkView == "photos" && $playerPhotos.size() > 0)
130:   #set ($view = "photos")
131: #elseif ($checkView == "videos" && $playerVideos.size() > 0)
132:     #set ($view = "videos")
133: #end
134: 
135: #macro (printResultAriaLabel $event)
136:     #set ($ariaLabel = "${event.sport} event: ${formatter.formatDate($event.date, 'MMMM d hh:mm a:')}")
137:     #if ($event.neutralSite.length() > 0 || $event.home)
138:     	#set ($ariaLabel = "${ariaLabel} vs.")
139:     #else
140:     	#set ($ariaLabel = "${ariaLabel} at")
141:     #end
142:     #set ($ariaLabel = "${ariaLabel} ${event.opponent.name}:")
143:     #if ($event.neutralSite.length() > 0)
144:     	#set ($ariaLabel = "${ariaLabel} @ ${event.neutralSite}:")
145:     #end
146:     #set ($ariaLabel = "${ariaLabel} Box Score")
147:     aria-label="$ariaLabel"
148: #end
149: 
150: #macro (printGrid $items $type)
151:     <div class="bio-news-mentions">
152:         <div class="card-columns">
153:             #foreach ($item in $items)
154:                 #if ($item.title.length() > 0)
155:                     <div class="card ${type}">
156:                         <a href="$item.url">
157:                             #if ($item.thumbnailURL)
158:                                 <img src="${item.thumbnailURL}?max_width=510" alt="$item.thumbnailAlt" class="card-img-top img-fluid" />
159:                             #elseif ($item.contentType == "loki/youtube")
160:                                 <img src="http://img.youtube.com/vi/${item.dataAsString}/mqdefault.jpg" alt="$item.thumbnailAlt" class="card-img-top img-fluid" />
161:                             #else
162:                                 #if ($website.exists("/images/setup/default-article-thumbnail.png"))
163:                                     <img src="/images/setup/default-article-thumbnail.png?max_width=510&max_height=287" class="card-img-top img-fluid" alt="$item.thumbnailAlt" />
164:                                 #else
165:                                     <img src="$website.cdn("/info/images/default-article-thumbnail.png?max_width=510&max_height=287")" class="card-img-top img-fluid" alt="$item.thumbnailAlt" />
166:                                 #end
167:                             #end
168:                         </a>
169:                         <div class="card-body">
170:                             <h5 class="card-title"><a href="$item.url">$item.title</a></h5>
171:                             #if ($item.leadIn.length() > 0)
172:                                 <p class="card-text">$formatter.limitLen(146, $item.leadIn)</p>
173:                             #end
174:                             #if ($item.date)
175:                                 <p class="card-text"><small class="text-muted">$formatter.formatLongDate($item.date)</small></p>
176:                             #end
177:                         </div>
178:                     </div>
179:                 #end
180:             #end ## foreach
181:         </div>
182:     </div>
183: #end ## ends macro
184: 
185: #macro (gamelogData $p)
186: 
187: #set ($p = $positions.get($p))
188: #set ($gamelogs = $gamelogs.get($p))
189: 
190: #if ($hasEvents)
191: <div class="stats-box full clearfix">
192:     <div class="table-responsive">
193:         <table class="table table-hover table-sm">
194:             <thead class="thead-dark">
195:                 <tr>
196:                     <th scope="col">Date</th>
197:                     <th scope="col" class="pinned-col">Opponent</th>
198:                     <th scope="col">Score</th>
199:                     #foreach ($gamelog in $gamelogs)
200:                       <th scope="col">$gamelog</th>
201:                     #end
202:                 </tr>
203:             </thead>
204:             <tbody>
205:                 #foreach ($event in $events)
206:                   <tr>
207:                     <td scope="row">$formatter.formatDate($event.event.date, "MMM d")</td>
208:                     <td class="pinned-col">
209:                       #if ($event.event.neutralSite.length() > 0) vs. #elseif (!$event.event.home) at #end
210:                       $event.event.opponent.name
211:                     </td>
212:                     <td>
213:                     #if ($event.event.statusCode >= 0)
214:                       #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
215:                           <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
216:                       #else
217:                       ${event.event.APResult}
218:                       #end
219:                     #else &nbsp; #end
220:                     </td>
221:                     #foreach ($gamelog in $gamelogs.keySet())
222:                       #set ($value = "-")
223:                       #set ($value = $formatter.formatNumber($event.stats.get($gamelog), $formats.get($gamelog)))
224:                       <td>$value</td>
225:                     #end
226:                   </tr>
227:                 #end
228:             </tbody>
229:         </table>
230:     </div> ## table-responsive
231: </div> ## stats-box
232: #end
233: 
234: #end ## macro gamelogData
235: 
236: #macro (splitWithLabels $statPosBriefs $label $stats $rowSpan $rowSpanLabel)
237:     <tr>
238:         #if ($tool.math.toInteger($rowSpan) > 0)
239:             <th rowspan="$rowSpan" scope="rowgroup">$rowSpanLabel</th>
240:         #end
241:         <th scope="row" class="pinned-col">${label}</th>
242:         #foreach ($brief in $statPosBriefs.keySet())
243:             #set ($value = "-")
244:             #set ($value = $!formatter.formatNumber($stats.get($brief), $formats.get($brief)))
245:             <td>#if ($value.length() > 0) $value #else - #end</td>
246:         #end
247:     </tr>
248: #end
249: 
250: #macro (careerData $p)
251: #set ($p = $positions.get($p))
252: #set ($statPosBriefs = $briefs.get($p))
253: 
254: <div class="stats-box full clearfix">
255:     <div class="table-responsive">
256:         <table class="table table-hover table-sm">
257:             <thead class="thead-dark">
258:                 <tr>
259:                     <th scope="col" class="pinned-col">&nbsp;</th>
260:                     #foreach ($brief in $statPosBriefs)
261:                         <th scope="col">$brief</th>
262:                     #end
263:                 </tr>
264:             </thead>
265:             <tbody>
266:                 #set ($careerTotals = $request.getAttribute("careerTotals"))
267:                 #set ($careerMap = $request.getAttribute("careerMap"))
268:                 #foreach ($season in $seasons)
269:                     ## Check if we did not get stats for this season
270:                     #if ($careerMap.get($season.seasonName))
271:                         #set ($label = "<a href='${season.path}?view=profile'>$season.seasonName</a>")
272:                         #splitWithLabels($statPosBriefs, $label, $careerMap[$season.seasonName], "", "")
273:                     #elseif ($wiki.valid())
274:                         <tr>
275:                             <td scope="row" class="text">${season.seasonName}</td>
276:                             <td colspan="${statPosBriefs.size()}">We could not find the "players" page in the ${season.seasonName} section.</td>
277:                         </tr>
278:                     #end
279:                 #end
280:                 #splitWithLabels($statPosBriefs, "Total", $request.getAttribute("careerTotals").overall, "", "")
281:             </tbody>
282:         </table>
283:     </div> ## table-responsive
284: </div> ## stats-box
285: 
286: #end ## macro careerData
287: 
288: #macro (splitsData $p)
289: 
290: #set ($p = $positions.get($p))
291: #set ($statPosBriefs = $briefs.get($p))
292: #set ($colspan = $tool.math.add($statPosBriefs.size(), 1))
293: 
294: #if ($statPosBriefs.size() > 0)
295: <div class="stats-box full clearfix">
296:     <div class="table-responsive">
297:         <table class="table table-hover table-sm">
298:             <thead class="thead-dark">
299:                 <tr>
300:                     <th scope="col" class="pinned-col">&nbsp;</th>
301:                     <th scope="col" class="pinned-col">&nbsp;</th>
302:                     #foreach ($brief in $statPosBriefs)
303:                         <th scope="col">$brief</th>
304:                     #end
305:                 </tr>
306:             </thead>
307:                 
308:             <tbody>
309:                 #splitWithLabels($statPosBriefs, "Total", $splits.overall, "3", "Event")
310:                 #splitWithLabels($statPosBriefs, "Conference", $splits.conference, "", "")
311:                 #splitWithLabels($statPosBriefs, "Exhibition", $splits.exhibition, "", "")
312:             </tbody>
313: 
314:             <tbody>
315:                 #splitWithLabels($statPosBriefs, "Home", $splits.home, "3", "Location")
316:                 #splitWithLabels($statPosBriefs, "Away", $splits.away, "", "")
317:                 #splitWithLabels($statPosBriefs, "Neutral", $splits.neutral, "", "")
318:             </tbody>
319: 
320:             <tbody>
321:                 #set ($rowSpan = $gamesResults.entrySet().size()) 
322:                 #set ($rowSpanLabel = "Result") 
323: 
324:                 #foreach($gameResult in $gamesResults.entrySet())
325:                     #if ($gameResult.key == "wins")
326:                       #set ($splitGameResult = $splits.inWins)
327:                     #elseif ($gameResult.key == "losses")
328:                       #set ($splitGameResult = $splits.inLosses)
329:                     #elseif ($gameResult.key == "ties")
330:                       #set ($splitGameResult = $splits.inTies)
331:                     #end
332: 
333:                     #splitWithLabels($statPosBriefs, $gameResult.value, $splitGameResult, $rowSpan, $rowSpanLabel)
334: 
335:                     #set ($rowSpan = "") 
336:                 #end
337:             </tbody>
338: 
339:             #if ($monthsPlayed and $monthsPlayed.size() > 0)
340:                 <tbody>
341:                     #set ($rowSpan = $monthsPlayed.size()) 
342:                     #set ($rowSpanLabel = "Month") 
343: 
344:                     #foreach($month in $monthsPlayed)
345:                         #if ($month == 'January')
346:                           #set ($splitMonth = $splits.january)
347:                         #elseif ($month == 'February')
348:                           #set ($splitMonth = $splits.february)
349:                         #elseif ($month == 'March')
350:                           #set($splitMonth = $splits.march)
351:                         #elseif ($month == 'April')
352:                           #set($splitMonth = $splits.april)
353:                         #elseif ($month == 'May')
354:                           #set ($splitMonth = $splits.may)
355:                         #elseif ($month == 'June')
356:                           #set ($splitMonth = $splits.june)
357:                         #elseif ($month == 'July')
358:                           #set($splitMonth = $splits.july)
359:                         #elseif ($month == 'August')
360:                           #set ($splitMonth = $splits.august)
361:                         #elseif ($month == 'September')
362:                           #set($splitMonth = $splits.september)
363:                         #elseif ($month == 'October')
364:                           #set($splitMonth = $splits.october)
365:                         #elseif ($month == 'November')
366:                           #set ($splitMonth = $splits.november)
367:                         #elseif ($month == 'December')
368:                           #set($splitMonth = $splits.december)
369:                         #end
370: 
371:                         #splitWithLabels($statPosBriefs, $month, $splitMonth, $rowSpan, $rowSpanLabel)
372: 
373:                         #set ($rowSpan = "") 
374: 
375:                     #end ## foreach
376:                 </tbody>
377:             #end
378:         </table>
379:     </div> ## table-responsive
380: </div> ## stats-box
381: #end
382: 
383: #end ## macro splitsData
384: 
385: #macro (printRecentGames)
386: #if ($hasEvents)
387:     <div class="table-responsive">
388:         <table class="table table-hover table-sm">
389:             <thead class="thead-dark">
390:                 <tr><th colspan="3" scope="col">Recent Games</th></tr>
391:             </thead>
392:             <tbody>
393:                 #set ($eventEnd = -1)
394:                 #foreach ($event in $events)
395:                   #if ($event.event.result.resolved)
396:                     #set ($eventEnd = $velocityCount)
397:                   #end
398:                 #end
399: 
400:                 #set ($eventStart = $eventEnd - 5)
401:                 #if ($eventStart < 0) #set ($eventStart = 0) #end
402: 
403:                 #foreach ($event in $events)
404:                     #if ($velocityCount >= $eventStart and $velocityCount <= $eventEnd)
405:                         <tr>
406:                             <td scope="row">$formatter.formatDate($event.event.date, "MMM d")</td>
407:                             <td>
408:                                 #if ($event.event.neutralSite.length() > 0) vs.
409:                                 #elseif (!$event.event.home) at
410:                                 #else ## nothing for a home game
411:                                 #end
412:                                 $event.event.opponent.name
413:                             </td>
414:                             <td>
415:                                 #if ($event.event.statusCode >= 0)
416:                                     #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
417:                                         <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
418:                                     #else
419:                                         ${event.event.APResult}
420:                                     #end
421:                                 #end
422:                             </td>
423:                         </tr>
424:                     #end ## if
425:                 #end
426:             </tbody>
427:         </table>
428:     </div>
429: #end
430: #end ## macro printRecentGames
431: 
432: #macro (printCategories $briefCategoryLabels $v $ariaLabel)
433:     <div class="$classTabPaneContent has-child-tabs">
434:         <div class="$classBioTabChildrenWrapper" data-momentum="false">
435:             <div class="jscroll-inner">
436:                 <ul class="$classBioTabChildren" id="bio-tabs-$v" role="tablist">
437:                     #foreach($briefCat in $briefCategoryLabels.entrySet())
438:                         #set ($briefCatLabel = $briefCat.value)
439:                         #set ($briefCatKey = $briefCat.key)
440:                         #if ($locale == "en_gb" && $briefCatLabel == "Defense")
441:                             #set ($briefCatLabel = "Defence")
442:                         #end
443:                         <li class="nav-item">
444:                             <a data-toggle="tab" id="${v}-tab-pos-${briefCatKey}" class="nav-link#if ($activePos == $briefCatKey) active#end" data-target="#${v}-tab-pos-${briefCatKey}-content" href="${page.url}?view=${v}&pos=${briefCatKey}" aria-label="${ariaLabel}: ${briefCatLabel}">${briefCatLabel}</a>
445:                         </li>
446:                     #end
447:                 </ul>
448:             </div>
449:         </div>
450:         <div class="tab-content" id="${v}-tab-content">
451:             #foreach ($briefCat in $briefCategoryLabels.entrySet())
452:                 #set ($briefCatLabel = $briefCat.value)
453:                 #set ($briefCatKey = $briefCat.key)
454:                 #set ($class = "tab-panel")
455:                 #if ($briefCat.key == $activePos)
456:                    #set ($class = "tab-panel active show")
457:                 #end
458:                 <div class="tab-pane fade ${class}" id="${v}-tab-pos-${briefCatKey}-content" role="tabpanel" aria-labelledby="${v}-tab-pos-${briefCatKey}">
459:                     <div class="stats-wrap $classTabPaneContent">
460:                         <h4 class="bio-tabbed-content-heading">$ariaLabel - <small class="text-muted"> $briefCatLabel</small></h4>
461:                         #if ($v == "splits")
462:                             #splitsData($briefCat.key)
463:                         #elseif ($v == "career")
464:                             #careerData($briefCat.key)
465:                         #end
466:                     </div>
467:                 </div>
468:             #end
469:         </div>
470:     </div>
471: #end ## macro printCategories
472: 
473: #macro (printHeadshot)
474:         #if ($enhancedLayout)
475:             #set ($classPlayerPhoto = "img-fluid img-thumbnail")
476:         #else
477:             #set ($classPlayerPhoto = "img-fluid")
478:         #end
479:     
480:         #if ($headshot.url)
481:                 #set ($src = $headshot.url)
482:         #elseif ($website.exists("/images/setup/default-headshot.png"))
483:                 #set ($src = "/images/setup/default-headshot.png")
484:         #elseif ($website.exists("/images/setup/headshot_default.jpg"))
485:                 #set ($src = "/images/setup/headshot_default.jpg")
486:         #else
487:                 #set ($src = "/info/images/default-headshot.png")
488:         #end
489:         
490:         #if ($src.trim().length() > 0)
491:             <img src="$src?max_width=510&max_height=600" class="$classPlayerPhoto" alt="$fullName" />
492:         #end
493: #end ## macro printHeadshot
494: 
495: #macro (printBioInfo)
496: #if ($enhancedLayout)
497:     #set ($classListItems = "col-md-6 px-2")
498:     #set ($definitionListItems = "d-flex border-bottom m-0 p-2")
499: #else
500:     #set ($classListItems = "col-md-12 px-2")
501:     #set ($definitionListItems = "d-flex flex-column border-bottom m-0 p-2")
502: #end
503: 
504: #if ($enhancedLayout)
505:     <div class="player-heading h3 bg-primary d-flex align-content-stretch text-white position-relative z-index-1">
506:       #if ($!attributes.get("number").length() > 0)<span class="number bg-secondary inline-block text-white p-3">$!attributes.get("number")</span>#end
507:       <span class="name inline-block p-3">$fullName</span>
508:     </div>
509: #end
510: 
511: <div class="roster-player-fields">
512:     <ul class="d-flex flex-row flex-wrap justify-content-between list-unstyled">
513:         #foreach ($i in [1..10])
514:             #set ($stickyKey = "bio_custom${i}_sticky")
515:             #if ($options.get($stickyKey).length() > 0 && $attributes.get("custom${i}").length() > 0)
516:                 <li class="$classListItems bio-field-custom-sticky">
517:                     <dl class="${definitionListItems}">
518:                         <dt class="label p-0 mr-2">$options.get($stickyKey): </dt>
519:                         <dd class="value p-0 m-0">$!attributes.get("custom${i}")</dd>
520:                     </dl>
521:                 </li>
522:             #end
523:         #end
524: 
525:         #foreach ($field in $fields)
526:             #if (!$field.key.startsWith("custom"))
527:                 #if ($attributes.get($field.key).length() > 0 && ($field.key != "first_name" && $field.key != "last_name" && $field.key != "number" && $field.key != "full_name"))
528:                     #if ($field.key == "phone1" || $field.key == "phone2")
529:                         <li class="$classListItems bio-field-standard">
530:                             <dl class="${definitionListItems}">
531:                                 <dt class="label p-0 mr-2">Phone: </dt>
532:                                 <dd class="value p-0 m-0">$!attributes.get($field.key)</dd>
533:                             </dl>
534:                         </li>
535:                     #elseif ($field.key == "email_address")
536:                         <li class="$classListItems bio-field-standard">
537:                             <dl class="${definitionListItems}">
538:                                 #set ($emailAdd = $attributes.get($field.key))
539:                                 <dt class="label p-0 mr-2">Email: </dt>
540:                                 <dd class="value p-0 m-0 text-truncate"><a href="mailto:${emailAdd}">$emailAdd</a></dd>
541:                             </dl>
542:                         </li>
543:                     #elseif ($field.key == "weight_class")
544:                         <li class="$classListItems bio-field-standard">
545:                             <dl class="${definitionListItems}">
546:                                 <dt class="label p-0 mr-2">Class: </dt>
547:                                 <dd class="value p-0 m-0">$!attributes.get($field.key)</dd>
548:                             </dl>
549:                         </li>
550:                     #elseif ($field.key != "position_abbr")
551:                         <li class="$classListItems bio-field-standard">
552:                             <dl class="${definitionListItems}">
553:                                 <dt class="label p-0 mr-2">$field.value: </dt>
554:                                 <dd class="value p-0 m-0">$!attributes.get($field.key)</dd>
555:                             </dl>
556:                         </li>
557:                     #end
558:                 #end
559:             #end
560:         #end
561: 
562:         #foreach ($i in [1..10])
563:           #set ($customKey = "bio_custom${i}")
564:           #if ($options.get($customKey).length() > 0 && $attributes.get("custom${i}"))
565:             <li class="$classListItems bio-field-custom">
566:                 <dl class="${definitionListItems}">
567:                     <dt class="label p-0 mr-2">$options.get($customKey): </dt>
568:                     <dd class="value p-0 m-0">$!attributes.get("custom${i}")</dd>
569:                 </dl>
570:             </li>
571:           #end
572:         #end
573:     </ul>
574: </div>
575: #end ## macro printBioInfo
576: 
577: #macro (printActionShots)
578: #if ($showActionShots)
579:     ## FILTERS OUT THE NUMBER OF ACTION PHOTOS 
580:     #set ($totalPhotoAvaiable = $playerPhotos.size())
581:     #set ($playerPhotosFiltered = $playerPhotos)
582:     #if ($actionShotsLimit < $totalPhotoAvaiable)
583:         #set ($playerPhotosFiltered = $playerPhotos.subList(0, $actionShotsLimit))
584:     #end
585:     #set ($playerPhotosFiltered = $tool.sorter.sort($playerPhotosFiltered, "lastUpdated:desc"))
586:     <div class="action-shots clearfix mb-md-n5 d-none d-sm-none d-md-block">
587:         <div id="action-shots-carousel" class="carousel slide carousel-fade" data-interval="12000" data-ride="carousel">
588:             <ol class="carousel-indicators pb-sm-3 mb-sm-5">
589:                 #foreach($photo in $playerPhotosFiltered)
590:                     <li data-target="#action-shots-carousel" data-slide-to="$foreach.index" class="#if ($foreach.index == 0)active#end"></li>
591:                 #end
592:             </ol>
593:             <div class="carousel-inner">
594:                 #foreach($photo in $playerPhotosFiltered)                    
595:                     #set ($imgAlt = "Large featured action photo of $fullName - Image $foreach.count")
596:                     #if ($photo.altText.length() > 0)
597:                         #set ($imgAlt = $photo.altText)
598:                     #elseif( $photo.title.length() > 0 )
599:                         #set ($imgAlt = $photo.title)
600:                     #end
601:                     <div class="carousel-item#if ($foreach.index == 0) active#end">
602:                         <img src="${photo.url}?max_width=1200" alt="$imgAlt" class="d-block w-100" data-lastupdated="$photo.lastUpdated" />
603:                     </div>
604:                 #end
605:             </div>
606:         </div>
607:     </div>
608: #end
609: #end ## macro printActionShots
610: 
611: #macro (printHighlights)
612: #if ($highlights && $showHighlights)
613:     <div class="roster-bio-highlights mt-3 bg-white text-dark">
614:         <ul class="d-flex flex-row flex-wrap justify-content-between list-unstyled m-0">
615:             #foreach ($highlight in $highlights.keySet())
616:                 #set ($value = "-")
617:                 #set ($value = $formatter.formatNumber($stats.get($highlight), $formats.get($highlight)))
618:                 <li class="flex-fill px-2 text-center border border-white bg-primary text-white">
619:                     <dl class="stat d-block m-0 p-2">
620:                         <dt class="d-block label p-0 m-0 text-uppercase">$!highlights.get($highlight)</dt>
621:                         <dd class="d-block value p-0 m-0">$value</dd>
622:                     </dl>
623:                 </li>
624:             #end
625:         </ul>
626:     </div>
627: #end
628: #end ## macro printHighlights
629: 
630: #macro (printRoster)
631: #if ($enhancedLayout)
632:     $website.includeAgain("${page.url}?tmpl=roster-switcher-template&id=roster-list")
633: #else
634:     #set ($id = "roster-switcher")
635:     #if ($request.getParameter("id").length() > 0)
636:         #set ($id = $request.getParameter("id"))
637:     #end
638: 
639:     #if ($page.contentType == "loki/bio")
640:         #set ($headlinesFeaturedSize = 0)
641:         #foreach ($featuredPage in $page.headlinesFeatured)
642:             #if ($featuredPage.contentType == "loki/headlines")
643:                 #set ($headlinesFeaturedSize = $headlinesFeaturedSize + 1)
644:             #end
645:         #end
646:         #if ($headlinesFeaturedSize > 0)
647:             <div id="$id" class="float-sm-right roster-switcher-template">
648:                 <div class="input-group mb-3">
649:                     <div class="input-group-prepend">
650:                         <label class="input-group-text" for="$id-options">Related Bios</label>
651:                     </div>
652:                     <select class="custom-select" id="$id-options" onchange="location=this.value;">
653:                         #foreach ($featuredPage in $page.headlinesFeatured)
654:                             #if ($featuredPage.contentType == "loki/headlines")
655:                                 $website.includeAgain("${featuredPage.url}?tmpl=roster-list-template&current_url=${page.url}")
656:                             #end
657:                         #end
658:                     </select>
659:                 </div>
660:             </div>
661:         #end
662:     #elseif ($page.contentType == "loki/bio-network")
663:         #set ($relatedPlayers = $page.sectionPage.children)
664:         #set ($teamNames = {})
665:         #foreach ($relatedPlayer in $relatedPlayers)
666:             #if ($relatedPlayer.contentType == "loki/bio-network")
667:                 #set ($relatedPlayerObj = $relatedPlayer.getDataAsObject().getAttributes())
668:                 #set ($teamName = $relatedPlayerObj.get("team"))
669:                 #if ($teamName.length() > 0)
670:                     #if (!$teamNames.containsValue($teamName))
671:                         $!teamNames.put($tool.math.add($teamNames.size(), 1), $teamName)
672:                     #end
673:                 #end
674:             #end
675:         #end
676:         <div id="$id" class="float-sm-right roster-switcher-template">
677:             <div class="input-group mb-3">
678:                 <div class="input-group-prepend">
679:                     <label class="input-group-text" for="$id-options">Related Bios</label>
680:                 </div>
681:                 <select class="custom-select" id="$id-options" onchange="location=this.value;">
682:                     #foreach ($i in [1..$teamNames.size()])
683:                         #if ($teamNames.size() > 1)
684:                             <optgroup label="$teamNames.get($i)">
685:                         #end
686: 
687:                         #foreach ($relatedPlayer in $relatedPlayers)
688:                             #if ($relatedPlayer.contentType == "loki/bio-network")
689:                                 #set ($relatedPlayerObj = $relatedPlayer.getDataAsObject().getAttributes())
690:                                 #set ($teamName = $relatedPlayerObj.get("team"))
691:                                 #if ($teamName.length() > 0 && $teamName == $teamNames.get($i))
692:                                     #set ($playerFirstName = $relatedPlayerObj.get("first_name"))
693:                                     #set ($playerLastName = $relatedPlayerObj.get("last_name"))
694:                                     <option value="$relatedPlayer.url" #if ($page.url == $relatedPlayer.url)selected#end>${playerFirstName} ${playerLastName}</option>
695:                                 #end
696:                             #end
697:                         #end
698: 
699:                         #if ($teamNames.size() > 1)
700:                             </optgroup>
701:                         #end
702:                     #end
703:                 </select>
704:             </div>
705:         </div>
706:     #end
707: #end ## enhancedLayout check
708: #end ## macro printRoster
709: 
710: ################################################## END MACROS  #############################################################
711: 
712: #if ($attributes.get("full_name").length() > 0)
713:   #set ($fullName = $attributes.get("full_name"))
714: #else
715:   #set ($firstName = $!attributes.get("first_name"))
716:   #set ($lastName = $!attributes.get("last_name"))
717:   #set ($fullName = "${firstName} ${lastName}")
718: #end
719: 
720: #set ($pageTitle = "")
721: #if($request.getAttribute("pageTitle").length() > 0)
722:         #set ($pageTitle = $request.getAttribute("pageTitle"))
723: #end
724: #if ($page.title.length() > 0)
725:         #set ($pageTitle = $!page.title)
726: #end
727: $!request.setAttribute("pageTitle", "${pageTitle}")
728: 
729: #set ($actionShots = false)
730: #if ($enhancedLayout && $playerPhotos.size() > 0)
731:   #set ($actionShots = true)
732: #end
733: 
734: #if ($enhancedLayout)
735:     #set ($classRoot = "bio-enhanced")
736:     #if ($actionShots && $showActionShots)
737:           #set ($classRoot = "${classRoot} action")
738:     #else
739:           #set ($classRoot = "${classRoot} plain")
740:     #end
741:     #set ($classCard = "mb-5 bg-light p-3 col-sm-12 pt-md-0")
742:     #set ($classBody = "col-sm-12")
743:     #set ($classBioTabParentsWrapper = "nav-tabs-wrapper position-relative py-3 border-top border-bottom")
744:     #set ($classBioTabParents = "nav nav-pills nav-tabs-responsive d-flex flex-row text-nowrap justify-content-center")
745:     #set ($classBioTabChildrenWrapper = "nav-tabs-wrapper position-relative py-3 border-bottom")
746:     #set ($classBioTabChildren = "nav nav-pills nav-tabs-responsive d-flex flex-row text-nowrap justify-content-center")
747:     #set ($classTabPaneContent = "tab-pane-contents py-3")
748: #else
749:     #set ($classRoot = "bio-wrap")
750:     #set ($classCard = "mb-5 p-3 col-lg-4 col-xl-3 bg-light")
751:     #set ($classBody = "col-lg-8 col-xl-9")
752:     #set ($classBioTabParentsWrapper = "nav-tabs-wrapper position-relative")
753:     #set ($classBioTabParents = "nav nav-tabs nav-tabs-responsive d-flex flex-row text-center justify-content-start")
754:     #set ($classBioTabChildrenWrapper = "nav-tabs-wrapper position-relative")
755:     #set ($classBioTabChildren = "nav nav-tabs nav-tabs-responsive d-flex flex-row text-center justify-content-start")
756:     #set ($classTabPaneContent = "tab-pane-contents p-3")
757:     
758: #end
759: 
760: ## FULL ROSTER
761: <div class="${classRoot} #if ($highlights) bio-wrap-has-highlights #end clearfix">
762: 
763: ## RELATED BIOS
764: #if ($showRoster)
765:   <div class="related-bios clearfix">#printRoster</div>
766: #end
767: 
768: #if ($actionShots)
769:   #printActionShots
770: #end
771: #if ($enhancedLayout)
772: #else
773:     <div class="player-heading h3 d-flex align-content-stretch position-relative z-index-1 mb-3 bg-primary text-white border">
774:         #if ($!attributes.get("number").length() > 0)<span class="number bg-secondary inline-block text-white p-3">$!attributes.get("number")</span>#end
775:         <span class="name inline-block p-3">$fullName</span>
776:     </div>
777: #end
778: 
779: <div class="container">
780:     <div class="row">
781:         <div class="bio-card ${classCard}">
782:             <div class="player-about clearfix">
783:                 #if ($enhancedLayout)
784:                     <div class="row no-gutters">
785:                         <div class="col-md-4 col-lg-3">
786:                             <div class="player-headshot text-center position-relative z-index-1 mt-md-n5">#printHeadshot</div>
787:                         </div>
788:                         <div class="col-md-8 col-lg-9">
789:                             <div class="player-info">#printBioInfo</div>
790:                         </div>
791:                     </div>
792:                 #else
793:                     <div class="row">
794:                         <div class="col-md-4 col-lg-12">
795:                             <div class="player-headshot text-center position-relative z-index-1 mb-3">#printHeadshot</div>
796:                         </div>
797:                         <div class="col-md-8 col-lg-12">
798:                             <div class="player-info mb-3">#printBioInfo</div>
799:                         </div>
800:                     </div>
801:                 #end
802:             </div>
803:             #printHighlights
804:         </div> ## bio-card
805: 
806:         #if ($view.length() > 0)
807:             $request.setAttribute("icl-responsive-tabs-script", true)
808:             
809:             <div class="bio-body ${classBody}">
810:                 <div class="tab-container">
811:                 #if ($statsURL.length() > 0 || $hasHTMLStats || $releases.size() > 0|| $playerPhotos.size() > 0 || $playerVideos.size() > 0)
812:                     <div class="$classBioTabParentsWrapper" data-momentum="false">
813:                         <div class="jscroll-inner">
814:                             <ul class="$classBioTabParents" id="bio-tabs-parents" role="tablist">
815:                                 #if ($hasSynopsis || $hasBioBrief)
816:                                     <li class="nav-item">
817:                                         <a data-toggle="tab" id="bio-tab" class="nav-link #if ($view == "bio") active#end" data-target="#bio" href="${page.url}?view=bio">Bio</a>
818:                                     </li>
819:                                 #end
820: 
821:                                 #if ($statsURL.length() > 0)
822:                                     <li class="nav-item">
823:                                         <a data-toggle="tab" id="profile-tab" class="nav-link#if ($view == "profile") active#end" data-target="#profile" href="${page.url}?view=profile">Player Profile</a>
824:                                     </li>
825:                                     <li class="nav-item">
826:                                         <a data-toggle="tab" id="gamelog-tab" class="nav-link#if ($view == "gamelog") active#end" data-target="#gamelog" href="${page.url}?view=gamelog">Game Log</a>
827:                                     </li>
828:                                     #if ($showCareer)
829:                                         <li class="nav-item">
830:                                             <a data-toggle="tab" id="career-tab" class="nav-link#if ($view == "career") active#end" data-target="#career" href="${page.url}?view=career">Career Stats</a>
831:                                         </li>
832:                                     #end
833:                                     <li class="nav-item">
834:                                         <a data-toggle="tab" id="splits-tab" class="nav-link#if ($view == "splits") active#end" data-target="#splits" href="${page.url}?view=splits">Split Stats</a>
835:                                     </li>
836:                                 #end
837: 
838:                                 #if ($hasHTMLStats)
839:                                     <li class="nav-item">
840:                                         <a data-toggle="tab" id="htmlstats-tab" class="nav-link#if ($view == "htmlstats") active#end" data-target="#htmlstats" href="${page.url}?view=htmlstats">HTML Stats</a>
841:                                     </li>
842:                                 #end
843: 
844:                                 #if ($releases.size() > 0)
845:                                     <li class="nav-item">
846:                                         <a data-toggle="tab" id="news-tab" class="nav-link#if ($view == "news") active#end" data-target="#news" href="${page.url}?view=news">News</a>
847:                                     </li>
848:                                 #end
849: 
850:                                 #if ($playerPhotos.size() > 0)
851:                                     <li class="nav-item">
852:                                         <a data-toggle="tab" id="photos-tab" class="nav-link#if ($view == "photos") active#end" data-target="#photos" href="${page.url}?view=photos">Photos</a>
853:                                     </li>
854:                                 #end
855: 
856:                                 #if ($playerVideos.size() > 0)
857:                                     <li class="nav-item">
858:                                         <a data-toggle="tab" id="videos-tab" class="nav-link#if ($view == "videos") active#end" data-target="#videos" href="${page.url}?view=videos">Videos</a>
859:                                     </li>
860:                                 #end
861:                             </ul>   
862:                         </div>
863:                     </div>
864:                 #end
865:                     <div class="tab-content" id="roster-tab-content">
866:                         ## BIO
867:                         #if ($hasSynopsis || $hasBioBrief)
868:                             #set ($class = "tab-panel")
869:                             #if ($view == "bio")
870:                                #set ($class = "tab-panel active show")
871:                             #end
872: 
873:                             <div class="tab-pane fade ${class}" id="bio" role="tabpanel" aria-labelledby="bio-tab">
874:                                 <div class="$classTabPaneContent synopsis">
875:                                     <h4 class="bio-tabbed-content-heading">Bio</h4>
876:                                     #if ($hasSynopsis)
877:                                       $synopsis
878:                                     #elseif ($hasBioBrief)
879:                                       $website.include("$bioBriefURL")
880:                                     #end
881:                                 </div>
882:                             </div> ## tab-panel
883:                         #end
884: 
885:                         ## STATS
886:                         #if ($statsURL.length() > 0)
887: 
888:                             ## PROFILE
889:                             #set ($class = "tab-panel")
890:                             #if ($view == "profile")
891:                                #set ($class = "tab-panel active show")
892:                             #end
893: 
894:                             <div class="tab-pane fade ${class}" id="profile" role="tabpanel" aria-labelledby="profile-tab">
895:                                 <div class="$classTabPaneContent stats-wrap">
896:                                     <h4 class="bio-tabbed-content-heading">Player Profile</h4>
897:                                     ## LAST SIX GAMES
898:                                     <div class="row">
899:                                         <div class="stats-box col-12">
900:                                             #printRecentGames()
901:                                         </div>
902: 
903:                                         ## RANKING
904:                                         <div class="stats-box col-12">
905:                                             #if ($statPos.length() > 0)
906:                                                 $website.include("players?tmpl=stats-bios-rank-template&rank=${playerId}&pos=${statPos}")
907:                                             #end
908:                                         </div>
909:                                     </div>
910:                                 </div> ## stats-wrap
911:                             </div> ## tab-content
912: 
913:                             ## GAMELOG
914:                             #set ($class = "tab-panel")
915:                             #if ($view == "gamelog")
916:                                #set ($class = "tab-panel active show")
917:                             #end
918: 
919:                             #set ($activePos = $statPos)
920:                             #if ($view == "gamelog" && $paramPos.length() > 0)
921:                                 #if ($positions.get($paramPos).length() > 0)
922:                                     #set ($activePos = $positions.get($paramPos))
923:                                 #end
924:                             #end
925: 
926:                             <div class="tab-pane fade ${class}" id="gamelog" role="tabpanel" aria-labelledby="gamelog-tab">
927:                                 #if ($gamelogsCategoriesLabels)
928:                                     <div class="$classTabPaneContent has-child-tabs">
929:                                         <div class="$classBioTabChildrenWrapper" data-momentum="false">
930:                                             <div class="jscroll-inner">
931:                                                 <ul class="$classBioTabChildren" id="bio-tabs-gamelog" role="tablist">
932:                                                     #foreach($gamelogsCatLabel in $gamelogsCategoriesLabels.entrySet())
933:                                                         #set($gamelogsCatLabelVal = $gamelogsCatLabel.value)
934:                                                         #if ($locale == "en_gb" && $gamelogsCatLabelVal == "Defense")
935:                                                             #set($gamelogsCatLabelVal = "Defence")
936:                                                         #end
937:                                                         <li class="nav-item">
938:                                                             <a data-toggle="tab" id="gamelog-tab-pos-${gamelogsCatLabel.key}" class="nav-link#if ($activePos == $gamelogsCatLabel.key) active#end" data-target="#gamelog-tab-pos-${gamelogsCatLabel.key}-content" href="${page.url}?view=gamelog&pos=${gamelogsCatLabel.key}" aria-label="Game Log: ${gamelogsCatLabelVal}">$gamelogsCatLabelVal</a>
939:                                                         </li>
940:                                                     #end
941:                                                 </ul>
942:                                             </div>
943:                                         </div>
944:                                         <div class="tab-content" id="gamelog-tab-content">
945:                                             #foreach($gamelogsCatLabel in $gamelogsCategoriesLabels.entrySet())
946:                                                 #set ($class = "tab-panel")
947:                                                 #if ($gamelogsCatLabel.key == $activePos)
948:                                                    #set ($class = "tab-panel active show")
949:                                                 #end
950:                                                 <div class="tab-pane fade ${class}" id="gamelog-tab-pos-${gamelogsCatLabel.key}-content" role="tabpanel" aria-labelledby="gamelog-tab-pos-${gamelogsCatLabel.key}">
951:                                                     <div class="stats-wrap $classTabPaneContent">
952:                                                          <h4 class="bio-tabbed-content-heading">Game Log - <small class="text-muted"> $gamelogsCatLabel.value</small></h4></h4>
953:                                                         #gamelogData($gamelogsCatLabel.key)
954:                                                     </div>
955:                                                 </div>
956:                                             #end
957:                                         </div>
958:                                     </div>
959:                                 #else
960:                                     <div class="stats-wrap $classTabPaneContent">#gamelogData($pos)</div>
961:                                 #end
962: 
963:                             </div> ## tab-panel
964: 
965:                             ## CAREER
966:                             #if ($showCareer)
967: 
968:                                 #set ($activePos = $statPos)
969:                                 #if ($view == "career" && $paramPos.length() > 0)
970:                                     #if ($positions.get($paramPos).length() > 0)
971:                                         #set ($activePos = $positions.get($paramPos))
972:                                     #end
973:                                 #end
974: 
975:                                 #set ($class = "tab-panel")
976:                                 #if ($view == "career")
977:                                    #set ($class = "tab-panel active show")
978:                                 #end
979: 
980:                                 <div class="tab-pane fade ${class}" id="career" role="tabpanel" aria-labelledby="career-tab">
981:                                     #if ($briefsCategoriesLabels)
982:                                         #printCategories($briefsCategoriesLabels "career" "Career Stats")
983:                                     #else
984:                                         <div class="stats-wrap $classTabPaneContent">#careerData($activePos)</div>
985:                                     #end
986:                                 </div>
987:                             #end
988: 
989:                             ## SPLITS
990:                             #set ($class = "tab-panel clearfix")
991:                             #if ($view == "splits")
992:                                #set ($class = "tab-panel active show")
993:                             #end
994: 
995:                             #set ($activePos = $statPos)
996:                             #if ($view == "splits" && $paramPos.length() > 0)
997:                                 #if ($positions.get($paramPos).length() > 0)
998:                                     #set ($activePos = $positions.get($paramPos))
999:                                 #end
1000:                             #end
1001: 
1002:                             <div class="tab-pane fade ${class}" id="splits" role="tabpanel" aria-labelledby="splits-tab">
1003:                                 #if ($briefsCategoriesLabels)
1004:                                     #printCategories($briefsCategoriesLabels "splits" "Splits Stats")
1005:                                 #else
1006:                                     <div class="stats-wrap $classTabPaneContent">#splitsData($pos)</div>
1007:                                 #end
1008:                             </div>
1009:                         #end
1010: 
1011:                         ## HTML STATS
1012:                         #if ($hasHTMLStats)
1013:                             #set ($class = "tab-panel clearfix")
1014:                             #if ($view == "htmlstats")
1015:                                #set ($class = "tab-panel active show")
1016:                             #end
1017:                             <div class="tab-pane fade ${class}" id="htmlstats" role="tabpanel" aria-labelledby="htmlstats-tab">
1018:                                 <div class="$classTabPaneContent">
1019:                                     <h4 class="bio-tabbed-content-heading">Other Stats</h4>
1020:                                     <a href="${htmlStatsURL}" class="bio-htmlstats-identifier">Click to view HTML Stats</a>
1021:                                 </div>
1022:                             </div>
1023:                         #end
1024: 
1025:                         ## NEWS
1026:                         #if ($releases.size() > 0)
1027:                             #set ($class = "tab-panel clearfix")
1028:                             #if ($view == "news")
1029:                                #set ($class = "tab-panel active show")
1030:                             #end
1031:                             <div class="tab-pane fade ${class}" id="news" role="tabpanel" aria-labelledby="news-tab">
1032:                                 <div class="$classTabPaneContent">
1033:                                     <h4 class="bio-tabbed-content-heading">News Mentions</h4>
1034:                                     #printGrid($releases, "article")
1035:                                 </div>
1036:                             </div>
1037:                         #end
1038: 
1039:                         ## PHOTOS
1040:                         #if ($playerPhotos.size() > 0)
1041:                             #set ($class = "tab-panel clearfix")
1042:                             #if ($view == "photos")
1043:                                 #set ($class = "tab-panel active clearfix")
1044:                             #end
1045:                             <div class="tab-pane fade ${class}" id="photos" role="tabpanel" aria-labelledby="photos-tab">
1046:                                 <div class="$classTabPaneContent">
1047:                                     <h4 class="bio-tabbed-content-heading">Photos</h4>
1048:                                     $website.includeAgain("${page.url}?tmpl=bio-photos-template")
1049:                                 </div>
1050:                             </div>
1051:                         #end
1052: 
1053:                         ## VIDEOS
1054:                         #if ($playerVideos.size() > 0)
1055:                             #set ($class = "tab-panel clearfix")
1056:                             #if ($view == "videos")
1057:                                 #set ($class = "tab-panel active clearfix")
1058:                             #end
1059:                             <div class="tab-pane fade ${class}" id="videos" role="tabpanel" aria-labelledby="videos-tab">
1060:                                 <div class="$classTabPaneContent">
1061:                                     <h4 class="bio-tabbed-content-heading">Videos</h4>
1062:                                     #printGrid($playerVideos, "video")
1063:                                 </div>
1064:                             </div>
1065:                         #end
1066: 
1067:                     </div> ## tab-panels
1068:                 </div> ## tab-container
1069:             </div> ## body
1070:         #end
1071:     </div>
1072: </div>
1073: 
1074: $wiki
1075: </div> ## ends bio-wrap
1076: 
1077: ## GLOBAL ADS SERVER
1078: #if ($website.ads.isAdvertisingEnabled('BIOS'))
1079:         $website.includeAgain("global-adserver-slots?adSlot=bios")
1080: #end