College of the Canyons Track and Field

There was a problem with a Velocity script
Pagesports/track/2014-15/schedule-template
ErrorVM #printTable: too many arguments to macro. Wanted 1 got 2 at i8yq5qkafcnldf4asports/track/2014-15/schedule-template[line 1408, column 17]
Page source:
1: #********************************************************************
2: DO NOT MODIFY THIS FILE DIRECTLY - DEVIN SMITH
3: 
4: This file is a direct duplicate of the schedule-networked-template
5: Any changes required should be made tot he other file and then
6: duplicated manually to this file.
7: ********************************************************************#
8: 
9: ## PICK UP OPTIONS
10: $website.include("options")
11: #set ($options = $request.getAttribute("options"))
12: 
13: #* BEGIN TABLE STYLE OPTIONS ***************#
14: #set($tableHelperClass = "")
15: #if ($options.get("table_bordered") != false)	#set($tableHelperClass = "$tableHelperClass table-bordered") #end
16: #if ($options.get("table_head_dark") == true)	#set($tableHelperClass = "$tableHelperClass thead-dark") #end
17: #if ($options.get("table_hover") != false)		#set($tableHelperClass = "$tableHelperClass table-hover") #end
18: #* END TABLE STYLES OPTIONS ****************#
19: 
20: ## CONFERENCE TEAM LINKING
21: #set ($confmemberIDs = $page.teamIDs)
22: 
23: #set ($isPrinterFriendly = false)
24: #if ($request.getParameter("dec") == "printer-decorator")
25: 	#set ($isPrinterFriendly = true)
26: #end
27: 
28: ## NEXT EVENT COUNTDOWN
29: #set ($showEventCountdown = true)
30: #if ($options.get("schedule_show_eventcountdown") == "false")
31: 	#set ($showEventCountdown = false)
32: #end
33: 
34: #set ($showLeaders = true)
35: #if ($options.get("schedule_show_leaders") == "no")
36: 	#set ($showLeaders = false)
37: #end
38: #if ($request.getParameter("showLeaders") == true)
39: 	#set ($showLeaders = true)
40: #elseif ($request.getParameter("showLeaders") == false)
41: 	#set ($showLeaders =  false)
42: #end
43: 
44: #set ($showTeamLeadersCarousel = false)
45: #if ($options.get("schedule_show_team_leader_carousel") == "yes")
46: 	#set ($showTeamLeadersCarousel = true)
47: #end
48: 
49: #set ($showRelatedArticles = false)
50: #if ($options.get("schedule_network_articles") == "yes")
51: 	#set ($showRelatedArticles = true)
52: #end
53: 
54: #set ($leaderSportsMapped = ["basketball","soccer","volleyball","baseball","softball","hockey","lacrosse","waterpolo","football"])
55: 
56: #if ($showLeaders)
57: 	$website.include("${page.sectionPage.url}/roster?tmpl=roster-headshots-template")
58: 	#set ($rosterHeadshots = $!request.getAttribute("roster_headshots"))
59: #end
60: 
61: #set ($isTeamSchedule = false)
62: #if ($schedule.team.length() > 0) ## ?teamId=
63: 	#set ($isTeamSchedule = true)
64: #end
65: 
66: #set ($isSharedMeet = false)
67: #if ($schedule.team.length() == 0 && !$schedule.numericResults && !$page.contentType.equals('loki/schedule'))
68: 	#set ($isSharedMeet = true)
69: #end
70: 
71: #set ($linksAbbreviations = { "Preview": "PR", "Box Score": "BX", "Results": "RE", "Recap": "RC", "Live stats": "LS", "Video": "V", "Audio": "A", "Photos": "PH", "Tickets": "T", "Directions": "DR" })
72: #set ($linksOrder = ["LS", "VI", "BS", "RC", "RE", "GA", "AU", "DI", "TI", "PR", "LI"])
73: #set ($excludeLinksWhenEventIsFinished = ["LS", "DI", "TI", "PR"])
74: #set ($excludeLinksWhenEventIsLive = ["DI", "TI", "PR"])
75: 
76: #set ($restrictLinks = true)
77: #if ($options.get("schedule_restrict_links") == false)
78: 	#set ($restrictLinks = false)
79: #end
80: 
81: #set ($showLinkIcons = true)
82: #if ($request.getParameter("showLinkIcons") == false)
83: 	#set ($showLinkIcons = false)
84: #end
85: 
86: #set ($abbreviatedLinks = false)
87: #if ($request.getParameter("abbreviatedLinks") == true)
88: 	#set ($abbreviatedLinks = true)
89: #end
90: 
91: #set ($showVsAt = true)
92: #if ($options.get("schedule_hide_vs_at") == true)
93: 	#set ($showVsAt = false)
94: #end
95: 
96: #set ($showTeamStats = true)
97: #if ($options.get("schedule_hide_team_stats") == true)
98: 	#set ($showTeamStats = false)
99: #end
100: 
101: #set ($showExhibitionGames = true)
102: #if ($options.get("schedule_hide_exhibition_events") == true)
103: 	#set ($showExhibitionGames = false)
104: #end
105: 
106: #set ($showSpotOnAddToCal = false)
107: #if ($options.get("schedule_show_spoton_add_to_cal") == "show")
108: 	#if ($options.get('stanza_code').length() > 0)
109: 		#set ($showSpotOnAddToCal = true)
110: 		#set ($stanzaCode = $options.get('stanza_code').toLowerCase())
111: 	#end
112: #end
113: 
114: #set ($showTeamLogo = false)
115: #if ($options.get("schedule_show_team_logo") == "show" && !$isPrinterFriendly)
116: 	#set ($showTeamLogo = true)
117: #end
118: 
119: #set ($includeTimeZone = true)
120: #if ($options.get('calendarIncludeTimeZone').length() > 0)
121: 	#set ($includeTimeZone = $options.get('calendarIncludeTimeZone').toLowerCase())
122: #end
123: 
124: #set ($enhancedLayout 	= false)
125: #set ($scheduleLayout 	= "standard")
126: #set ($scheduleView 	= "list")
127: #if ($options.get("schedule_enhanced_layout") == "yes" && !$isPrinterFriendly)
128: 	#set ($enhancedLayout 	= true)
129: 	#set ($scheduleLayout 	= "enhanced")
130: 	#set ($scheduleView 	= "cards")
131: #end
132: 
133: #set ($resultFormat = "AP1")
134: #if ($options.get("schedule_result_format").equals("L, 1-2")) ## whether to show $event.APResult or $event.AP2Result
135: 	#set ($resultFormat = "AP2")
136: #end
137: 
138: #set ($scheduleNextEventScroll = false)
139: #if ($options.get("schedule_next_event_scroll") && $options.get("schedule_next_event_scroll") == true)
140: 	#set ($scheduleNextEventScroll = true)
141: #end
142: 
143: #set($groupMonths 			= true)
144: #set($groupDates 			= false)
145: #set($currentMonthFirst 	= false)
146: 
147: #* Defines if schedules events should be grouped by dates into callapsible panels *#
148: #if(!$isTeamSchedule) ## Conference
149: 	#set($groupDates = true)
150: #end
151: 
152: #if ($options.get("schedule_group_by_months") == false)
153: 	#set($groupMonths = false)
154: #end
155: #if ($options.get("schedule_group_by_dates") == false)
156: 	#set($groupDates = false)
157: #end
158: 
159: #if ($options.get("schedule_current_month_first") == true)
160: 	#set($currentMonthFirst = true)
161: #end
162: 
163: $request.setAttribute("scheduleNextEvent", false)
164: $request.setAttribute("scheduleLastEvent", $event.id)
165: 
166: #set ($dateFormat = "EEE. d")
167: 
168: #if ($options.get("schedule_date_format").equals("Thu. 3"))
169: 	#set ($dateFormat = "EEE. d")
170: #elseif ($options.get("schedule_date_format").equals("Mar. 15"))
171: 	#set ($dateFormat = "MMM dd")
172: #elseif ($options.get("schedule_date_format").equals("Mar. 15, 2013"))
173: 	#set ($dateFormat = "MMM dd, yyyy")
174: #elseif ($options.get("schedule_date_format").equals("March 15, 2013"))
175: 	#set ($dateFormat = "MMMM dd, yyyy")
176: #elseif ($options.get("schedule_date_format").equals("March 15"))
177: 	#set ($dateFormat = "MMMM dd")
178: #elseif ($options.get("schedule_date_format").equals("03/15/2013"))
179: 	#set ($dateFormat = "MM/dd/yyyy")
180: #elseif ($options.get("schedule_date_format").equals("03/15"))
181: 	#set ($dateFormat = "MM/dd")
182: #elseif ($options.get("schedule_date_format").equals("Thursday, March 15, 2013"))
183: 	#set ($dateFormat = "EEEE, MMMM dd, yyyy")
184: #elseif ($options.get("schedule_date_format").equals("Thursday, Mar. 15, 2013"))
185: 	#set ($dateFormat = "EEEE, MMM dd, yyyy")
186: #elseif ($options.get("schedule_date_format").equals("Thursday, March 15"))
187: 	#set ($dateFormat = "EEEE, MMMM dd")
188: #elseif ($options.get("schedule_date_format").equals("Thursday, Mar. 15"))
189: 	#set ($dateFormat = "EEEE, MMM dd")
190: #elseif ($options.get("schedule_date_format").equals("Thu., March 15"))
191: 	#set ($dateFormat = "EEE., MMMM dd")
192: #elseif ($options.get("schedule_date_format").equals("Thu., Mar. 15"))
193: 	#set ($dateFormat = "EEE., MMM dd")
194: #end
195: 
196: #set ($confNotation = "*")
197: #set ($divisionNotation = "^")
198: #set ($exhibitionNotation = "#")
199: #set ($postseasonNotation = "%")
200: #set ($multipleLeadersNotation = "+")
201: 
202: #if (!$enhancedLayout)
203: 	#set ($scheduleLayout = 1)
204: 	#if ($tool.math.toInteger($options.get("schedule_default_layout")) > 1)
205: 		#set ($scheduleLayout = $tool.math.toInteger($options.get("schedule_default_layout")))
206: 	#end
207: 
208: 	## SET DEFAULT LABELS AND FIELDS FOR NUMERIC vs. NON-NUMERIC SCHEDULES
209: 	#if ($isTeamSchedule)
210: 		#if ($schedule.numericResults) ## team h2h
211: 			#if ($scheduleLayout == 1)
212: 				#set ($scheduleFields = ["date", "opponent+neutralsite", "result", "status", "notes", "links"])
213: 				#set ($scheduleLabels = ["Date", "Opponent", "Result", "Status", "Notes", "Links"])
214: 			#elseif ($scheduleLayout == 2)
215: 				#set ($scheduleFields = ["date", "opponent+neutralsite", "result", "status", "notes", "links"])
216: 				#set ($scheduleLabels = ["Date", "Opponent", "Result", "Status", "Notes", "Links"])
217: 			#elseif ($scheduleLayout == 3)
218: 				#set ($scheduleFields = ["date", "opponent", "result", "status", "notes+neutralsite", "links"])
219: 				#set ($scheduleLabels = ["Date", "Opponent", "Result", "Status", "Notes", "Links"])
220: 			#end
221: 		#else
222: 			#if ($scheduleLayout == 1)
223: 				#set ($scheduleFields = ["date", "opponent+neutralsite", "status", "team_away_result", "notes", "links"])
224: 				#set ($scheduleLabels = ["Date", "Event", "Status", "Result", "Notes", "Links"])
225: 			#elseif ($scheduleLayout == 2)
226: 				#set ($scheduleFields = ["date", "opponent", "status", "team_away_result", "notes+neutralsite", "links"])
227: 				#set ($scheduleLabels = ["Date", "Event", "Status", "Result", "Notes", "Links"])
228: 			#elseif ($scheduleLayout == 3)
229: 				#set ($scheduleFields = ["date", "opponent+neutralsite","status", "team_away_result", "notes", "links"])
230: 				#set ($scheduleLabels = ["Date", "Event", "Status", "Result", "Notes", "Links"])
231: 			#end
232: 		#end
233: 	#else ## CONFERENCE VIEW
234: 		#if($schedule.numericResults) ## conf h2h
235: 			#set ($scheduleFields = ["date", "team_away+team_away_result", "team_home+team_home_result", "notes+neutralsite", "status", "links"])
236: 			#set ($scheduleLabels = ["Date", "Away", "Home", "Notes", "Status", "Links"])
237: 		#else
238: 			#set ($scheduleFields = ["date", "team_away+team_away_result", "neutralsite", "notes", "links"])
239: 			#set ($scheduleLabels = ["Date", "Team", "Event", "Notes", "Links"])
240: 		#end
241: 	#end
242: 
243: 	## Remove dates from the array is they are present and groupDates is true.
244: 	#if ($groupDates)
245: 		#set ($filteredFields = "")
246: 		#foreach ($field in $scheduleFields)
247: 			#if ($field != "date")
248: 				#set ($filteredFields = "$filteredFields$field,")
249: 			#end
250: 		#end
251: 		#set ($scheduleFields = [])
252: 		#foreach ($f in $filteredFields.split(","))
253: 			#set ($temp = $scheduleFields.add($f))
254: 		#end
255: 
256: 		#set ($filteredLabels = "")
257: 		#foreach ($label in $scheduleLabels)
258: 			#if ($label != "Date")
259: 				#set ($filteredLabels = "$filteredLabels$label,")
260: 			#end
261: 		#end
262: 		#set ($scheduleLabels = [])
263: 		#foreach ($l in $filteredLabels.split(","))
264: 			#set ($temp = $scheduleLabels.add($l))
265: 		#end
266: 	#end
267: 	## End date removal
268: 
269: 	## SET FIELDS AND LABELS FROM OPTIONS IF AVAILABLE AND SANITIZE THEM
270: 	#if (!$options.get("schedule_fields").isEmpty() && !$options.get("schedule_labels").isEmpty())
271: 		#set ($optionFields = $options.get("schedule_fields"))
272: 		#set ($optionFields = $optionFields.split(","))
273: 		#foreach ($field in $optionFields)
274: 			#set ($field = $field.trim())
275: 			$tool.list.set($optionFields, $tool.math.sub($velocityCount, 1), $field)
276: 		#end
277: 
278: 		#set ($optionLabels = $options.get("schedule_labels"))
279: 		#set ($optionLabels = $optionLabels.split(","))
280: 		#foreach ($label in $optionLabels)
281: 			#set ($label = $label.trim())
282: 			#if ($label.equals("-"))
283: 				#set ($label = " ")
284: 			#end
285: 			$tool.list.set($optionLabels, $tool.math.sub($velocityCount, 1), $label)
286: 		#end
287: 
288: 		#if ($tool.list.size($optionFields) == $tool.list.size($optionLabels))
289: 			#set ($scheduleFields = $optionFields)
290: 			#set ($scheduleLabels = $optionLabels)
291: 		#end
292: 	#end
293: #end
294: 
295: ## MACROS
296: #macro (printPageTitle)
297: 	#if ($page.title.length() > 0)
298: 		#if ($schedule.team.length() > 0 && $page.teams.size() > 1)
299: 			#set ($pageTitle = "${page.title} - ${schedule.team}")
300: 		#else
301: 			#set ($pageTitle = $page.title)
302: 		#end
303: 	<h1>$pageTitle</h1>
304: 		$!request.setAttribute("pageTitle", "${pageTitle}")
305: 	#end
306: 	$!request.setAttribute("pageDescription", "${pageTitle} - Record: $schedule.Record")
307: 
308: #end ## printPageTitle
309: 
310: #macro (printEventTypesFilter)
311: 	#if ($eventTypes.size() > 1)
312: 		#set ($id = "filter-by-type")
313: 	<div class="schedule-filter flex-grow-1">
314: 		<div class="input-group">
315: 			<span class="input-group-text" id="${id}-group-text">Type</span>
316: 			<select class="form-control type-filter form-select" aria-describedby="${id}-group-text" id="$id" data-filter="true" aria-label="Filter events by selecting an event type from the list">
317: 				<option value="all">All</option>
318: 				#if ($eventTypes.contains("conference"))
319: 					<option value="conf">Conference</option>
320: 				#end
321: 				#if ($eventTypes.contains("division"))
322: 					<option value="division">Division</option>
323: 				#end
324: 				#if ($eventTypes.contains("exhibition"))
325: 					<option value="exhibition">Exhibition</option>
326: 				#end
327: 				#if ($eventTypes.contains("postseason"))
328: 					<option value="postseason">Post Season</option>
329: 				#end
330: 			</select>
331: 		</div>
332: 	</div>
333: 	#end
334: #end ## printEventTypesFilter
335: 
336: #macro (printVenueFilter)
337: 	#if (($isSharedMeet || $isTeamSchedule) && $eventVenues.size() > 1)
338: 		#set ($id = "filter-by-venue")
339: 		<div class="schedule-filter flex-grow-1">
340: 			<div class="input-group">
341: 				<span class="input-group-text" id="${id}-group-text">Venue</span>
342: 				<select class="form-control venue-filter form-select" aria-describedby="${id}-group-text" id="$id" data-filter="true" aria-label="Filter events by selecting a venue from the list">
343: 					<option value="all">All</option>
344: 					#if ($eventVenues.contains("home"))
345: 						<option value="home">Home Games</option>
346: 					#end
347: 					#if ($eventVenues.contains("away"))
348: 						<option value="away">Away Games</option>
349: 					#end
350: 					#if ($eventVenues.contains("neutral"))
351: 						<option value="neutral">Neutral Games</option>
352: 					#end
353: 				</select>
354: 			</div>
355: 		</div>
356: 	#end
357: #end ## printVenueFilter
358: 
359: #macro (printArchiveFilter)
360: 	$!request.setAttribute("pageObj", $page)
361: 	## INCLUDE NAVBAR FOR SEASON ARCHIVES
362: 	#set ($legacyArchiveFilter = false)
363: 	#set ($legacyArchiveFilter = $options.get("legacy_archive_filter") == true)
364: 
365: 	## legacy archive filter uses a navbar to power the season switcher
366: 	#if ($legacyArchiveFilter)
367: 		$website.include("navbar-schedule-archive?tmpl=schedule-archive-list-template")
368: 		#set ($archiveEntries = $request.getAttribute("schedule_archives"))
369: 		#if ($archiveEntries.size() > 0)
370: 		<div class="schedule-filter col-12 col-sm-6 col-md-auto flex-grow-1">
371: 			<div class="input-group">
372: 				<span class="input-group-text" id="filter-by-season-group-text">Season</span>
373: 				<select class="form-control season-filter form-select" onchange="location=this.value" aria-describedby="filter-by-season-group-text" id="filter-by-season" aria-label="Change the season by selecting an option from the list">
374: 					#foreach ($entry in $archiveEntries)
375: 						#if ($entry.label.length() > 0 && $entry.targetURL.length() > 0)
376: 							<option value="$entry.targetURL" #if ($entry.targetURL.equals($page.url)) selected="selected" #end>$entry.label</option>
377: 						#end
378: 					#end
379: 				</select>
380: 			</div>
381: 		</div>
382: 		#end
383: 	#else
384: 		$website.include("conf-season-filter-template")
385: 	#end
386: #end ## printArchiveFilter
387: 
388: #macro (printFilters)
389: <div class="page-filters schedule-filters d-print-none">
390: 	<div class="btn-toolbar d-flex justify-content-between gap-3" role="toolbar" aria-label="Schedule tool bar">
391: 		<div class="m-0" role="group" aria-label="Print friendly version">
392: 			<a href="${page.url}?dec=printer-decorator" class="btn btn-link border text-decoration-none text-nowrap"><span class="fa fa-print"></span> Print</a>
393: 			#if ($showSpotOnAddToCal)
394: 				<div class="d-inline-block spoton-add-to-cal"><a class="spoton-it btn btn-link border text-decoration-none" data-size="medium" href="https://stanza.co/schedules"><span class="far fa-calendar-alt"></span> Add to calendar</a></div>
395: 			#end
396: 		</div>
397: 		#printArchiveFilter()
398: 		#printEventTypesFilter()
399: 		#printVenueFilter()
400: 
401: 	</div>
402: </div>
403: #end ## printFilters
404: 
405: #macro (printSubscribeLinks)
406: 	#if($schedule.events.size() > 0)
407: 		<div class="subscribe-links p-3 my-3 border">
408: 			<div class="btn-group me-auto">
409: 				<a class="btn btn-sm btn-outline-primary" href="$icalURL"><span class="far fa-calendar-alt"></span> <strong>iCalendar</strong></a> ## iCalendar
410: 				<a class="btn btn-sm btn-outline-primary" href="$rssURL"><span class="fas fa-rss"></span> <strong>RSS Feed</strong></a> ## RSS
411: 			</div>
412: 		</div>
413: 	#end
414: #end
415: 
416: #macro (printPostSchedule)
417: 	#set ($schedulePostURL = "${page.url}-post")
418: 	#if ($website.exists($schedulePostURL))
419: 	<div class="schedule-post">$website.include($schedulePostURL)</div>
420: 	#end
421: #end
422: 
423: #macro (printLegends)
424: <div class="notations d-flex flex-column flex-md-row align-items-center justify-content-center align-items-md-start justify-content-md-start gap-3 flex-wrap my-3 small text-muted">
425: 	#if($enhancedLayout)
426: 		<div class="event-legend-venue p-2 px-3 border rounded">
427: 			<div class="d-flex align-items-center justify-content-center align-items-md-start justify-content-md-start flex-wrap gap-3">
428: 				#if ($eventVenues.contains("home"))
429: 					<div class="card-venue-icon home home-color-indicator">
430: 						<span class="fa-solid fa-circle fa-sm" aria-hidden="true"></span>
431: 						Home
432: 					</div>
433: 				#end
434: 				#if ($eventVenues.contains("away"))
435: 					<div class="card-venue-icon away away-color-indicator">
436: 						<span class="fa-solid fa-circle fa-sm" aria-hidden="true"></span>
437: 						Away
438: 					</div>
439: 				#end
440: 				#if ($eventVenues.contains("neutral"))
441: 					<div class="card-venue-icon neutral neutral-color-indicator">
442: 						<span class="fa-solid fa-circle fa-sm" aria-hidden="true"></span>
443: 						Neutral
444: 					</div>
445: 				#end
446: 			</div>
447: 		</div>
448: 	#end
449: 
450: 	<div class="event-legend-type p-2 px-3 rounded">
451: 		<div class="d-flex align-items-center justify-content-center align-items-md-start justify-content-md-start flex-wrap gap-3">
452: 			#if ($eventTypes.contains("exhibition"))
453: 				<div class="exhibition"><strong>$exhibitionNotation</strong> <span>Exhibition</span></div>
454: 			#end
455: 			#if ($eventTypes.contains("conference"))
456: 				<div class="conf"><strong>$confNotation</strong> <span>Conference</span></div>
457: 			#end
458: 			#if ($eventTypes.contains("division"))
459: 				<div class="division"><strong>$divisionNotation</strong> <span>Division</span></div>
460: 			#end
461: 			#if ($eventTypes.contains("postseason"))
462: 				<div class="postseason"><strong>$postseasonNotation</strong> <span>Postseason</span></div>
463: 			#end
464: 			#if ($eventVenues.contains("home") && $isTeamSchedule)
465: 				<div class="home"><strong><span>Home events in bold</span></strong></div>
466: 			#end
467: 		</div>
468: 	</div>
469: 
470: </div>
471: #end ## printLegends
472: 
473: #macro (printLinkAriaLabel $event $link $linkTypeCounter)
474: 	#set ($ariaLabel = "${event.sport} event: ${formatter.formatDate($event.date, 'MMMM d hh:mm a:')}")
475: 	#if ($event.neutralSite.length() > 0 || $event.home)
476: 		#set ($vsOrAt = "vs.")
477: 	#else
478: 		#set ($vsOrAt = "at")
479: 	#end
480: 	#if ($event.teams.size() > 1)
481: 		#set ($ariaLabel = "${ariaLabel} ${event.teams.get(0).name} ${vsOrAt} ${event.teams.get(1).name}:")
482: 	#elseif ($event.teams.size() == 1)
483: 		#set ($ariaLabel = "${ariaLabel} ${event.teams.get(0).name}:")
484: 	#end
485: 	#if ($event.neutralSite.length() > 0)
486: 		#set ($ariaLabel = "${ariaLabel} @ ${event.neutralSite}:")
487: 	#end
488: 	#set ($ariaLabel = "${ariaLabel} ${link.name}")
489: 	#if ($linkTypeCounter > 1)
490: 		#set ($ariaLabel = "${ariaLabel} link ${linkTypeCounter}")
491: 	#end
492: aria-label="$ariaLabel"
493: #end
494: 
495: #macro (printEventLink $link $class)
496: 	#set ($linkText = $link.name)
497: 	#if ($abbreviatedLinks)
498: 		#if ($link.mapType == "LI" || "$!link.siteCustomSettings.abbreviatedTitle" != "")
499: 			#set ($linkText = "LI")
500: 			#if("$!link.siteCustomSettings.abbreviatedTitle" != "")
501: 				#set ($linkText = $link.siteCustomSettings.abbreviatedTitle)
502: 			#end
503: 		#else
504: 			#foreach ($l in $linksAbbreviations.entrySet())
505: 				#if ($link.name.equalsIgnoreCase($l.key))
506: 					#set ($linkText = $l.value)
507: 				#end
508: 			#end
509: 		#end
510: 	#end
511: 
512: <a #printLinkAriaLabel($event, $link, $linkTypeCounter) href="$link.url" #if ($website.isExternalLink($link.url)) target="_blank" #end class="${class} d-print-none">
513: 	#if ($showLinkIcons)
514: 		#if ($link.mapType == "GA") ##gallery
515: 			<span class="far fa-sm fa-images"></span>
516: 		#elseif ($link.mapType == "TI") ##tickets
517: 			<span class="fas fa-sm fa-ticket-alt"></span>
518: 		#elseif($link.mapType == "RC") ##recap
519: 			<span class="fa fa-sm fa-share"></span>
520: 		#elseif($link.mapType == "PR") ##preview
521: 			<span class="far fa-sm fa-eye"></span>
522: 		#elseif($link.mapType == "LS") ##live stats
523: 			<span class="fas fa-sm fa fa-eye"></span>
524: 		#elseif($link.mapType == "VI") ##video
525: 			<span class="fa fa-sm fa-video-camera"></span>
526: 		#elseif($link.mapType == "AU") ## audio
527: 			<span class="fas fa-sm fa-headphones-alt"></span>
528: 		#elseif($link.mapType == "DI") ##directions
529: 			<span class="fas fa-sm fa-directions"></span>
530: 		#elseif($link.mapType == "BS") ##box scores
531: 			<span class="far fa-sm fa-chart-bar"></span>
532: 		#elseif($link.mapType == "RE") ##results
533: 			<span class="fa fa-sm fa-calculator"></span>
534: 		#elseif($link.mapType == "LI") ##custom link
535: 			<span class="fa fa-sm fa-external-link"></span>
536: 		#end
537: 		<span class="text d-md-none d-lg-inline-block">$linkText</span>
538: 	#else
539: 		<span class="text">$linkText</span>
540: 	#end
541: </a>
542: #end
543: 
544: #macro (printEventLinks $event $class)
545: 	#set ($eventLinks = $event.links)
546: 
547: 	#set ($isFinished = false)
548: 	#if ($event.statusCode >= 0 || ($event.statusCode == -3 && $now.time >= ($event.date.time + (1000*60*60*24)))) ## -3 is reported for event sports
549: 		#set ($isFinished = true)
550: 	#end
551: 
552: 	#if ($restrictLinks && ($event.inProgress || $isFinished))
553: 		#set ($eventLinks = [])
554: 		#foreach ($link in $event.links)
555: 			#if ($event.inProgress && !$excludeLinksWhenEventIsLive.contains($link.mapType))
556: 				#set ($ignoreme = $eventLinks.add($link))
557: 			#elseif ($isFinished && !$excludeLinksWhenEventIsFinished.contains($link.mapType))
558: 				#set ($ignoreme = $eventLinks.add($link))
559: 			#end
560: 		#end
561: 	#end
562: 
563: 	#foreach ($mapType in $linksOrder)
564: 		#foreach ($link in $eventLinks)
565: 			#if ($mapType == $link.mapType)
566: 				#printEventLink($link, "link $class")
567: 			#end
568: 		#end
569: 	#end
570: 
571: #end ## printEventLinks
572: 
573: #macro (printEventButtons $event)
574: 	#set ($eventLinks = $event.links)
575: 
576: 	#set ($isFinished = false)
577: 	#if ($event.statusCode >= 0 || ($event.statusCode == -3 && $now.time >= ($event.date.time + (1000*60*60*24)))) ## -3 is reported for event sports
578: 		#set ($isFinished = true)
579: 	#end
580: 
581: 	#if ($restrictLinks && ($event.inProgress || $isFinished))
582: 		#set ($eventLinks = [])
583: 		#foreach ($link in $event.links)
584: 			#if ($event.inProgress && !$excludeLinksWhenEventIsLive.contains($link.mapType))
585: 				#set ($ignoreme = $eventLinks.add($link))
586: 			#elseif ($isFinished && !$excludeLinksWhenEventIsFinished.contains($link.mapType))
587: 				#set ($ignoreme = $eventLinks.add($link))
588: 			#end
589: 		#end
590: 	#end
591: 
592: 	#set ($linksCounter = 0)
593: <div class="list-group list-group-horizontal-md w-100">
594: 	#foreach ($mapType in $linksOrder)
595: 			#set ($linkTypeCounter = 0)
596: 
597: 			#foreach ($link in $eventLinks)
598: 		#if ($mapType == $link.mapType)
599: 			#printEventLink($link, "link text-nowrap")
600: 		#end
601: 	#end
602: 
603: 		#end
604: </div>
605: #end ## printEventButtons
606: 
607: #macro (printEventCardLinks $event)
608: 
609: 	#set ($isFinished = false)
610: 	#if ($event.statusCode >= 0 || ($event.statusCode == -3 && $now.time >= ($event.date.time + (1000*60*60*24)))) ## -3 is reported for event sports
611: 		#set ($isFinished = true)
612: 	#end
613: 
614: 	#if ($restrictLinks && ($event.inProgress || $isFinished))
615: 		#set ($eventLinks = [])
616: 		#foreach ($link in $event.links)
617: 			#if ($event.inProgress && !$excludeLinksWhenEventIsLive.contains($link.mapType))
618: 				#set ($ignoreme = $eventLinks.add($link))
619: 			#elseif ($isFinished && !$excludeLinksWhenEventIsFinished.contains($link.mapType))
620: 				#set ($ignoreme = $eventLinks.add($link))
621: 			#end
622: 		#end
623: 	#else
624: 		#set ($eventLinks = $event.links)
625: 	#end
626: 
627: 	#set ($linksCounter = 0)
628: 	#foreach ($mapType in $linksOrder)
629: 		#set ($linkTypeCounter = 0)
630: 		#foreach ($link in $eventLinks)
631: 			#if ($mapType == $link.mapType)
632: 				#printEventLink($link, "link list-inline-item text-decoration-none")
633: 			#end
634: 		#end
635: 
636: 	#end
637: #end ## printEventCardLinks
638: 
639: #macro(neCounter $event)
640: <div class="events-countdown d-flex flex-column justify-content-center w-100">
641: 	<div class="counter-details">
642: 		<div class="counter-details-inner">
643: 			#set ($countdownDateServer = $tool.timeZone.shift($event.date, $event.localTimeZone, $tool.timeZone.systemTimeZone))
644: 			#set ($countdownDate = $formatter.formatDate($countdownDateServer, "yyyy-MM-dd+HH:mm:ss+z"))
645: 			$website.includeAgain("component-countdown-digits-template?date=${countdownDate}")
646: 		</div>
647: 	</div>
648: </div>
649: #end
650: 
651: #macro (printNotation $title $notation)
652: <span class="notation small text-muted" title="$title">$notation</span>
653: #end
654: 
655: #macro (printNotations $event)
656: 	#if ($event.conference) #printNotation("Conference", $confNotation) #end
657: 	#if ($event.division) #printNotation("Division", $divisionNotation) #end
658: 	#if (!$event.overall) #printNotation("Do not count in overall record", $exhibitionNotation) #end
659: 	#if ($event.postseason) #printNotation("Post season", $postseasonNotation) #end
660: #end
661: 
662: #macro (printTeamLogoSetWidth $team $width)
663: 	#if ($showTeamLogo && $team.teamId.length() > 0)
664: 	<span class="event-logo logo-placeholder">
665: 			<img src="${website.teamLogo($team.teamId)}" alt="$team.name team logo" style="max-width:${width}px; max-height:${width}px" class="#if ($enhancedLayout)img-thumbnail border-0#end" />
666: 		</span>
667: 	#end
668: #end
669: 
670: #macro (printTeamName $team)
671: 	#if ($team.name.length() > 0)
672: 		#if ($confmemberIDs.contains($team.teamId) && $page.teams.size() > 1 && !$isTeamSchedule)
673: 			<a href="${page.url}?teamId=${team.teamId}" class="text-decoration-none $page.teams.size()" title="${team.name}">
674: 				<span class="team-name">$team.name</span>
675: 			</a>
676: 		#else
677: 		<span class="team-name" title="${team.name}">$team.name</span>
678: 		#end
679: 	#end
680: #end
681: 
682: #macro (printAPResult $event)
683: 	#if ($resultFormat.equals("AP1"))
684: 		#set ($APResult = $event.APResult)
685: 	#elseif ($resultFormat.equals("AP2"))
686: 		#set ($APResult = $event.AP2Result)
687: 	#end
688: 
689: 	#if (!$event.inProgress && $APResult.length() > 0)
690: 		#if ($APResult.startsWith("W, "))
691: 			$APResult.replace("W, ", '<span class="text-success" data-context="result">W</span><span class="fw-normal">,</span> ')
692: 		#elseif ($APResult.startsWith("L, "))
693: 			$APResult.replace("L, ", '<span class="text-danger" data-context="result">L</span><span class="fw-normal">,</span> ')
694: 		#else
695: 			$APResult
696: 		#end
697: 	#else
698: 		$event.result
699: 	#end
700: #end
701: 
702: #macro (printEventStatus $event)
703: 	#if ($includeTimeZone)
704: 		#if ($includeTimeZone.contains('local'))
705: 			$formatter.formatStatus($event).setTimeFormat("h:mm a z").useEventTimeZone()
706: 		#else
707: 			$formatter.formatStatus($event).setTimeFormat("h:mm a z")
708: 		#end
709: 	#else
710: 		$formatter.formatStatus($event)
711: 	#end
712: #end
713: 
714: #macro (printEventNeutralSite $event)
715: 	#if ($event.neutralSite.length() > 0)
716: 	@ $event.neutralSite
717: 	#end
718: #end
719: 
720: #macro (printEventNotes $event)
721: 	#if ($event.notes.length() > 0)
722: 		$event.notes
723: 	#end
724: #end
725: 
726: #macro (printBoxscoreRecapUrl $event)
727: 	#set ($boxscoreURL = "")
728: 	#set ($recapURL = "")
729: 	#foreach ($link in $event.links)
730: 		#if ($boxscoreURL.length() == 0 && $link.url.endsWith(".xml") && $link.mapType == "BS" && !$website.isExternalLink($link.url))
731: 		data-boxscore="$link.url"
732: 		#elseif ($link.mapType == "RC" && $recapURL.length() == 0 && !$website.isExternalLink($link.url))
733: 		data-recap="$link.url"
734: 		#end
735: 	#end
736: #end
737: 
738: #macro (printTeamListImage $src $alt $class)
739: 	#set ($src = "${src}?max_height=576&max_width=576&crop=1")
740: 	<div class="ratio ratio-1x1">
741: 		<span class="align-content-center">
742: 			<img src="${src}" alt="${alt}" class="${class}" />
743: 		</span>
744: 	</div>
745: #end
746: 
747: #macro (printImage $src $alt $class)
748: 	#set ($src = "${src}?max_height=576&max_width=576&crop=1")
749: 	<div class="ratio ratio-1x1 rounded-circle overflow-hidden img-thumbnail">
750: 		<span class="align-content-center">
751: 			<img src="${src}" alt="${alt}" class="${class}" />
752: 		</span>
753: 	</div>
754: #end
755: 
756: #macro (printSharedMeet)
757: 	#set ($teams = $tool.sorter.sort($page.teams.entrySet(), "value"))
758: 	#set ($teamsThreshold = 20)
759: 
760: 	#if ($teams.size() > $teamsThreshold)
761: 		#set ($teamsByAlphabets = {})
762: 		#foreach ($team in $teams)
763: 			#set ($firstLetter = $team.value.charAt(0))
764: 			#set ($arr = [])
765: 			#if ($teamsByAlphabets.containsKey($firstLetter))
766: 				#set ($arr = $teamsByAlphabets.get($firstLetter))
767: 			#end
768: 			#set ($bool = $arr.add($team))
769: 			#set ($val = $teamsByAlphabets.put($firstLetter, $arr))
770: 		#end
771: 
772: 		<ul class="team-alphabets">
773: 			#foreach ($alphabet in $teamsByAlphabets.entrySet())
774: 				<li><a href="#${alphabet.key}">$alphabet.key</a></li>
775: 			#end
776: 		</ul>
777: 
778: 		<div class="team-list clearfix">
779: 			<div class="col">
780: 				#foreach ($obj in $teamsByAlphabets.entrySet())
781: 					#if ($velocityCount == 8 || $velocityCount == 15)
782: 					</div><div class="col">
783: 					#end
784: 					#set ($teamList = $obj.value)
785: 					<ul>
786: 						<li class="title" id="${obj.key}">$obj.key</li>
787: 						#foreach ($team in $teamList)
788: 							<li><a href="${page.url}?teamId=${team.key}">$team.value</a></li>
789: 						#end
790: 					</ul>
791: 				#end
792: 			</div>
793: 		</div>
794: 	#else ## less than threshold
795: 		#if ($teams.size() == 0)
796: 		<div class="alert alert-secondary" role="alert">
797: 			There are no teams that match this criteria. Please check back soon!
798: 		</div>
799: 		#else
800: 		<div class="team-list p-3 p-lg-5 border">
801: 			<div class="fs-5 text-center mb-3">Available Team Schedules</div>
802: 			<div class="btn-toolbar d-flex justify-content-center align-items-center gap-2 mb-3">
803: 				#foreach ($team in $teams)
804: 					<div>
805: 						<a href="${page.url}?teamId=${team.key}" class="btn btn-link border-0 text-decoration-none">
806: 							<span class="d-flex justify-content-start align-items-center gap-2">
807: 								<span class="img-mw-3" style="width:3rem;">
808: 									#printTeamListImage($website.teamLogo($!{team.key}), ${team.value}, "img-fluid")
809: 								</span>
810: 							</span>
811: 						</a>
812: 					</div>
813: 				#end
814: 			</div>
815: 			<div class="btn-toolbar d-flex justify-content-center align-items-center gap-2">
816: 				#foreach ($team in $teams)
817: 					<a href="${page.url}?teamId=${team.key}" class="btn btn-link border text-decoration-none">
818: 						$team.value
819: 					</a>
820: 				#end
821: 			</div>
822: 		</div>
823: 			#*
824: 		<div class="team-list">
825: 			<div class="row row-cols-2 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 row-cols-xl-6 g-3">
826: 				#foreach ($team in $teams)
827: 					<div class="cards col">
828: 						<div class="card position-relative">
829: 							<div class="card-body d-flex flex-column gap-2">
830: 								<div class="card-team-logo text-center w-100">
831: 									<div class="d-flex flex-column align-items-center justify-content-center">
832: 										<div style="width:5rem;">
833: 											#printTeamListImage($website.teamLogo($!{team.key}), ${team.value}, "img-fluid")
834: 										</div>
835: 									</div>
836: 								</div>
837: 								<div class="card-title entry-title fw-bold mb-0 text-center">
838: 									<a href="${page.url}?teamId=${team.key}" class="stretched-link">$team.value</a>
839: 								</div>
840: 							</div>
841: 						</div>
842: 					</div>
843: 				#end
844: 			</div>
845: 		</div>
846: 
847: 			 *#
848: 		#end
849: 	#end ## teams threshold
850: #end ## printSharedMeet
851: 
852: #set($statClass = "flex-fill text-center border-bottom border-end p-2 p-lg-3 col-4 col-sm-3 col-md-4 col-lg-auto")
853: 
854: #macro (printStat $label $val)
855: <li class="$statClass">
856: 	<div class="d-flex flex-column justify-content-center align-items-center h-100">
857: 		<div class="small text-uppercase text-muted">$label</div>
858: 		<div class="fs-5 lh-1 text-nowrap fw-bold">$val</div>
859: 	</div>
860: </li>
861: #end
862: 
863: #macro (printStatGraph $label $val)
864: <li class="$statClass">
865: 	<div class="d-flex flex-column justify-content-center align-items-center h-100 proj-progress-card">
866: 		<div class="small text-uppercase fw-normal">$label</div>
867: 		<div class="fs-5 lh-1 text-nowrap fw-bold">$formatter.formatNumber($val, "#.000")</div>
868: 
869: 		#set ($percent = $tool.math.mul($val, 100))
870: 		<div class="progress mt-2 w-75">
871: 			<div class="progress-bar bg-primary" role="progressbar" style="width: $formatter.formatNumber($percent, 1)%;" aria-valuenow="$formatter.formatNumber($percent, 1)" aria-valuemin="0" aria-valuemax="100"></div>
872: 		</div>
873: 	</div>
874: </li>
875: #end
876: 
877: #macro (printEventCountdown)
878: 	## NEXT EVENT COUNTDOWN
879: 	#if ($showEventCountdown)
880: 
881: 
882: 		#set ($currentDate = $now)
883: 		#set ($dateFormat = "MMM dd")
884: 		#set ($dayFormat = "EEEE")
885: 
886: 		#set ($eventList = [])
887: 
888: 		## filter out exhibition events and count the number of previous and upcoming events
889: 		#foreach ($event in $schedule.events)
890: 			#if ($event.date && ($event.overall || !$hideExhibition) && !$event.cancelled && !$event.postponed)
891: 				#set ($eventServerDate = $tool.timeZone.shift($event.date, $event.localTimeZone, $tool.timeZone.systemTimeZone))
892: 				#if (!$eventServerDate.before($currentDate))
893: 					#set ($val = $eventList.add($event))
894: 				#end
895: 			#end
896: 		#end
897: 
898: 		#if ($eventList.size() > 0)
899: 			#printNextEventList($eventList)
900: 			$request.setAttribute("scheduleNextEvent", false) ## resetting this to false ensures the schedule will feature a next event if present.
901: 		#end
902: 	#end
903: #end
904: 
905: #macro(eventDate $event)
906: 	## conversion of a date into string and back to date sets the time to 00:00
907: 	#set ($today = $formatter.formatDate($now, "MMMM dd yyyy"))
908: 	#set ($today = $tool.date.format("MMMM dd yyyy", $today))
909: 	#set ($date = $tool.date.format("MMMM dd yyyy", $event.date))
910: 	#if($date.equals($today))
911: 	Today
912: 	#else
913: 		$formatter.formatDate($event.date, "${dateFormat}")
914: 	#end
915: #end
916: 
917: #macro (printTeamStats)
918: 	#if ($schedule.numericResults && $isTeamSchedule)
919: 		#set ($number = $schedule.Record.winPercentage)
920: 		#set ($confnumber = $schedule.conferenceRecord.winPercentage)
921: 
922: 	<ul class="team-stats list-unstyled d-flex flex-wrap justify-content-center align-items-stretch border-top border-start">
923: 		#printStat("Overall", $schedule.Record)
924: 		#printStatGraph("PCT", $number)
925: 		#printStat("Conf", $schedule.ConferenceRecord)
926: 		#printStatGraph("C.PCT", $confnumber)
927: 		#set ($streak = $schedule.streak.toString().replace('Lost ', '<span data-context="result">L</span>').replace('Won ', '<span data-context="result">W</span>'))
928: 		#printStat("Streak", $streak)
929: 		#printStat("Home", $schedule.homeRecord)
930: 		#printStat("Away", $schedule.awayRecord)
931: 		#printStat("Neutral", $schedule.neutralRecord)
932: 	</ul> ## team-stats
933: 	#end
934: #end ## printTeamStats
935: 
936: #macro (liveEventIndicator)
937: <div class="next-event-header fw-bold d-flex align-items-center justify-content-start gap-2">
938: 	<span class="fa fa-circle fa-sm fa-beat-fade text-primary" aria-hidden="true"></span>
939: 	<span>#printEventStatus($event)</span>
940: </div>
941: #end
942: 
943: #macro (nextEventIndicator)
944: <div class="next-event-header fw-bold d-flex align-items-center justify-content-start gap-2">
945: 	<span class="fa-regular fa-bell"></span>
946: 	<span class="text">Next Event</span>
947: </div>
948: #end
949: 
950: #macro (printTeamEventForNextEvent $event)
951: <div class="card-header">
952: 	<div class="next-event-header fw-bold d-flex align-items-center justify-content-center gap-2">
953: 		<span class="text">Next Event</span>
954: 	</div>
955: </div>
956: <div class="card-body">
957: 	<div class="d-flex flex-column justify-content-center align-items-center gap-2">
958: 		<div class="d-flex flex-column flex-md-row justify-content-center align-items-center gap-3 w-100">
959: 			<div class="text-start flex-grow-1 flex-shrink-1 w-100">
960: 				<div class="d-flex flex-column flex-md-row justify-content-center align-items-center gap-2 gap-md-3">
961: 					#if ($showTeamLogo && $event.opponent.teamId.length() > 0)
962: 						<div class="logo-aside-container">
963: 							<div class="lac-placeholder bg-primary border rounded p-2">
964: 								#printTeamLogoSetWidth($event.opponent, 72)
965: 							</div>
966: 						</div>
967: 					#end
968: 					<div class="flex-grow-1">
969: 						<div class="d-flex flex-column align-items-center align-items-md-start justify-content-center gap-1">
970: 							<div class="event-opponent d-flex align-items-center justify-content-center gap-2 fs-5">
971: 								#printLocationIcon($event)
972: 								<span class="event-opponent-name mb-0 fw-bold align-middle">#printTeamName($event.opponent)</span>
973: 								#printNotations($event)
974: 							</div>
975: 							<div class="event-dateinfo">
976: 								<div class="d-flex align-items-center justify-content-start gap-3">
977: 									<div class="date d-flex align-items-center justify-content-center gap-1">
978: 										<span class="fa fa-calendar-o fa-sm text-muted" aria-hidden="true"></span>
979: 										<span>#eventDate($event)</span>
980: 									</div>
981: 									<div class="status d-flex align-items-center justify-content-center gap-1">
982: 										<span class="fa-regular fa-clock fa-sm text-muted" aria-hidden="true"></span>
983: 										<span>#printEventStatus($event)</span>
984: 									</div>
985: 								</div>
986: 							</div>
987: 							#if ($event.neutralSite.length() > 0)
988: 								<div class="event-neutralsite small text-muted text-center text-md-start">#printEventNeutralSite($event)</div>
989: 							#end
990: 						</div>
991: 					</div>
992: 				</div>
993: 			</div>
994: 			<div class="text-md-right flex-grow-1 flex-shrink-1 w-100">
995: 				<div class="d-flex flex-column flex-md-row align-items-center flex-nowrap justify-content-end gap-3">
996: 					#neCounter($event)
997: 				</div>
998: 			</div>
999: 		</div>
1000: 		<div class="details d-flex flex-wrap gap-3 align-items-center justify-content-center w-100">
1001: 			#if ($event.notes.length() > 0)
1002: 				<div class="event-notes small text-muted text-center">#printEventNotes($event)</div>
1003: 			#end
1004: 		</div>
1005: 	</div>
1006: </div>
1007: 	#if($event.links.size() > 0)
1008: 	<div class="card-footer small">
1009: 		<div class="event-controls d-flex flex-column flex-md-row align-items-md-center justify-content-center gap-3 ">
1010: 			<div class="event-links list-inline d-flex align-items-center justify-content-center gap-3 flex-wrap flex-grow-1">
1011: 				#printEventCardLinks($event)
1012: 			</div>
1013: 		</div>
1014: 	</div>
1015: 	#end
1016: #end ## printTeamEventForNextEvent
1017: 
1018: #macro (printConfEventForNextEvent $event)
1019: 	#set ($awayTeam = $event.teams.get(0))
1020: 	#set ($homeTeam = $event.teams.get(1))
1021: 
1022: 	#set ($awayClass = "away")
1023: 	#set ($homeClass = "home")
1024: 
1025: 	#if ($awayTeam.winner)
1026: 		#set ($awayClass = "${awayClass} winner")
1027: 		#set ($homeClass = "${homeClass} loser")
1028: 	#elseif ($homeTeam.winner)
1029: 		#set ($awayClass = "${awayClass} loser")
1030: 		#set ($homeClass = "${homeClass} winner")
1031: 	#end
1032: 
1033: <div class="card-header">
1034: 	<div class="next-event-header fw-bold d-flex align-items-center justify-content-center gap-2">
1035: 		<span class="text">Next Event</span>
1036: 	</div>
1037: </div>
1038: <div class="card-body">
1039: 	<div class="d-flex flex-column justify-content-center align-items-center gap-2">
1040: 		<div class="d-flex flex-column flex-md-row justify-content-center align-items-center gap-3 w-100">
1041: 			<div class="text-start flex-grow-1 w-100">
1042: 				<div class="d-flex flex-column flex-md-row justify-content-center align-items-center gap-2 gap-md-3">
1043: 					#if ($showTeamLogo && ($awayTeam.teamId.length() > 0 || $homeTeam.teamId.length() > 0))
1044: 						<div class="logo-aside-container conference-logo">
1045: 							<div class="d-flex flex-row flex-nowrap align-items-center justify-content-center gap-2">
1046: 								#if ($awayTeam.teamId.length() > 0)
1047: 									<div class="lac-placeholder bg-primary border rounded p-2">
1048: 										#printTeamLogoSetWidth($awayTeam, 84)
1049: 									</div>
1050: 								#end
1051: 								#if ($homeTeam.teamId.length() > 0)
1052: 									<div class="lac-placeholder bg-primary border rounded p-2">
1053: 										#printTeamLogoSetWidth($homeTeam, 84)
1054: 									</div>
1055: 								#end
1056: 							</div>
1057: 						</div>
1058: 					#end
1059: 
1060: 					<div class="flex-grow-1">
1061: 						<div class="d-flex flex-column align-items-center align-items-md-start justify-content-center gap-1">
1062: 							<div class="event-home-team d-flex flex-column align-items-center align-items-md-start justify-content-center justify-content-md-start gap-0 fs-5 w-100">
1063: 								<div class="event-team-name away-team d-flex align-items-center justify-content-center gap-2">
1064: 									<span class="event-opponent-name mb-0 fw-bold align-middle">#printTeamName($awayTeam)</span>
1065: 								</div>
1066: 								<div class="event-team-name home-team d-flex align-items-center justify-content-center justify-content-md-start gap-2">
1067: 									#printLocationIcon($event)
1068: 									<span class="event-opponent-name mb-0 fw-bold align-middle">#printTeamName($homeTeam)</span>
1069: 									#printNotations($event)
1070: 								</div>
1071: 							</div>
1072: 							<div class="event-dateinfo">
1073: 								<div class="d-flex align-items-center justify-content-start gap-3">
1074: 									<div class="date d-flex align-items-center justify-content-center gap-1">
1075: 										<span class="fa fa-calendar-o fa-sm text-muted" aria-hidden="true"></span>
1076: 										<span>#eventDate($event)</span>
1077: 									</div>
1078: 									<div class="status d-flex align-items-center justify-content-center gap-1">
1079: 										<span class="fa-regular fa-clock fa-sm text-muted" aria-hidden="true"></span>
1080: 										<span>#printEventStatus($event)</span>
1081: 									</div>
1082: 								</div>
1083: 							</div>
1084: 							#if ($event.neutralSite.length() > 0)
1085: 								<div class="event-neutralsite small text-muted text-center text-md-start">#printEventNeutralSite($event)</div>
1086: 							#end
1087: 						</div>
1088: 					</div>
1089: 				</div>
1090: 			</div>
1091: 			<div class="text-md-right flex-grow-1 flex-shrink-1 w-100">
1092: 				<div class="d-flex flex-column flex-md-row align-items-center flex-nowrap justify-content-end gap-3">
1093: 					#neCounter($event)
1094: 				</div>
1095: 			</div>
1096: 		</div>
1097: 		<div class="details d-flex flex-wrap gap-3 align-items-center justify-content-center w-100">
1098: 			#if ($event.notes.length() > 0)
1099: 				<div class="event-notes small text-muted text-center">#printEventNotes($event)</div>
1100: 			#end
1101: 		</div>
1102: 	</div>
1103: </div>
1104: 	#if($event.links.size() > 0 || $eventOverview)
1105: 	<div class="card-footer small">
1106: 		<div class="event-controls d-flex flex-column flex-md-row align-items-md-center justify-content-center gap-3 ">
1107: 			<div class="event-links list-inline d-flex align-items-center justify-content-center gap-3 flex-wrap flex-grow-1">
1108: 				#printEventCardLinks($event)
1109: 			</div>
1110: 		</div>
1111: 	</div>
1112: 	#end
1113: 
1114: #end ## printConferenceEventForNextEvent
1115: 
1116: #macro (printTeamEvent $event)
1117: 	#if ($eventClass.contains("schedule-next-event-indicator"))
1118: 	<div class="card-header">
1119: 		#nextEventIndicator()
1120: 	</div>
1121: 	#elseif ($eventClass.contains("in-progress"))
1122: 	<div class="card-header">
1123: 		#liveEventIndicator()
1124: 	</div>
1125: 	#end
1126: 	#if($eventClass.contains("has-recap"))
1127: 		#set ($eventOverview = true)
1128: 	#end
1129: <div class="card-body">
1130: 	<div class="d-flex flex-column flex-md-row justify-content-center align-items-center gap-3">
1131: 		<div class="text-start flex-grow-1 flex-shrink-1 w-100">
1132: 			<div class="d-flex flex-column flex-md-row justify-content-center align-items-center gap-2">
1133: 				#if ($showTeamLogo && $event.opponent.teamId.length() > 0)
1134: 					<div class="logo-aside-container">
1135: 						#printTeamLogoSetWidth($event.opponent, 72)
1136: 					</div>
1137: 				#end
1138: 				<div class="flex-grow-1">
1139: 					<div class="d-flex flex-column align-items-center align-items-md-start justify-content-center gap-2">
1140: 						<div class="event-opponent d-flex align-items-center justify-content-center gap-2 fs-5">
1141: 							#printLocationIcon($event)
1142: 							<span class="event-opponent-name mb-0 #if(($event.home && $event.neutralSite.length() == 0) && $isTeamSchedule)fw-bold#end align-middle">#printTeamName($event.opponent)</span>
1143: 							#printNotations($event)
1144: 						</div>
1145: 						<div class="event-dateinfo">
1146: 							<div class="d-flex align-items-center justify-content-start gap-3">
1147: 								<div class="date d-flex align-items-center justify-content-center gap-1">
1148: 									<span class="fa fa-calendar-o fa-sm text-muted" aria-hidden="true"></span>
1149: 									<span>#eventDate($event)</span>
1150: 								</div>
1151: 								<div class="status d-flex align-items-center justify-content-center gap-1">
1152: 									<span class="fa-regular fa-clock fa-sm text-muted" aria-hidden="true"></span>
1153: 									<span>#printEventStatus($event)</span>
1154: 								</div>
1155: 							</div>
1156: 						</div>
1157: 						#if ($event.neutralSite.length() > 0)
1158: 							<div class="event-neutralsite small text-muted text-center text-md-start">#printEventNeutralSite($event)</div>
1159: 						#end
1160: 					</div>
1161: 				</div>
1162: 			</div>
1163: 		</div>
1164: 		<div class="text-md-right flex-grow-1 flex-shrink-1 w-100">
1165: 			<div class="d-flex flex-column flex-md-row align-items-center flex-nowrap justify-content-end gap-3">
1166: 				## Link Processing
1167: 				#set($boxscoreURL = "")
1168: 				#foreach ($link in $event.links)
1169: 					#if ($link.url.endsWith(".xml") && $link.mapType == "BS" && !$website.isExternalLink($link.url))
1170: 						#set($boxscoreURL = $link.url)
1171: 					#end
1172: 				#end
1173: 				#if($leaderSportsMapped.contains($sport.replace("women's ", "").replace("men's ", "")))
1174: 					#if ($showLeaders && $rosterHeadshots.size() > 0 && ($boxscoreURL.length() > 0))
1175: 						<div class="text-md-center">
1176: 							<div class="game-leaders d-none d-md-flex align-items-center justify-content-start">
1177: 								$website.include("${boxscoreURL}?tmpl=schedule-game-leaders-template&teamId=${schedule.teamId}")
1178: 							</div>
1179: 						</div>
1180: 					#end
1181: 				#end
1182: 				<div class="text-md-center flex-grow-1">
1183: 					<div class="d-flex flex-column align-items-center align-items-md-end justify-content-center gap-1">
1184: 						<div class="event-result fw-bold text-nowrap fs-5">#printAPResult($event)</div>
1185: 						<div class="details d-flex flex-wrap gap-3 align-items-center justify-content-center justify-content-md-start">
1186: 							<div class="event-notes small text-muted text-center text-md-end">#printEventNotes($event)</div>
1187: 						</div>
1188: 					</div>
1189: 				</div>
1190: 			</div>
1191: 		</div>
1192: 	</div>
1193: </div>
1194: 	#if($event.links.size() > 0 || $eventOverview)
1195: 	<div class="card-footer small">
1196: 		<div class="event-controls d-flex flex-column flex-md-row align-items-md-center justify-content-center gap-3 ">
1197: 			<div class="event-links list-inline d-flex align-items-center justify-content-center justify-content-md-start gap-3 flex-wrap flex-grow-1">
1198: 				#printEventCardLinks($event)
1199: 			</div>
1200: 			#if($eventOverview)
1201: 				<div class="event-overview d-none d-md-flex overflow-hidden border-start me-n3 mt-n2 mb-n2">
1202: 					<a class="btn d-block btn-link event-overview-toggle w-100" aria-label="Event Overview"><span class="fa-regular fa-plus"></span></a>
1203: 				</div>
1204: 			#end
1205: 		</div>
1206: 	</div>
1207: 	#end
1208: 
1209: #end ## printTeamEvent
1210: 
1211: #macro (printConfEvent $event)
1212: 	#set ($awayTeam = $event.teams.get(0))
1213: 	#set ($homeTeam = $event.teams.get(1))
1214: 
1215: 	#set ($awayClass = "away")
1216: 	#set ($homeClass = "home")
1217: 
1218: 	#if ($awayTeam.winner)
1219: 		#set ($awayClass = "${awayClass} winner")
1220: 		#set ($homeClass = "${homeClass} loser")
1221: 	#elseif ($homeTeam.winner)
1222: 		#set ($awayClass = "${awayClass} loser")
1223: 		#set ($homeClass = "${homeClass} winner")
1224: 	#end
1225: 
1226: 	#if ($eventClass.contains("schedule-next-event-indicator"))
1227: 	<div class="card-header">
1228: 		#nextEventIndicator()
1229: 	</div>
1230: 	#elseif ($eventClass.contains("in-progress"))
1231: 	<div class="card-header">
1232: 		#liveEventIndicator()
1233: 	</div>
1234: 	#end
1235: 
1236: 	#if($eventClass.contains("has-recap"))
1237: 		#set ($eventOverview = true)
1238: 	#end
1239: 
1240: <div class="card-body">
1241: 	<div class="d-flex flex-column flex-md-row justify-content-center align-items-center gap-3">
1242: 		<div class="text-start flex-grow-1 w-100">
1243: 			<div class="d-flex flex-row justify-content-center align-items-center gap-2 #if($awayTeam.winner) fw-bold #end">
1244: 				#if ($showTeamLogo && $awayTeam.teamId.length() > 0)
1245: 					<div class="logo-aside-container">
1246: 						#printTeamLogoSetWidth($awayTeam, 40)
1247: 					</div>
1248: 				#end
1249: 				<div class="flex-grow-1 text-start">
1250: 					<div class="d-flex flex-column align-items-start justify-content-center gap-1">
1251: 						<div class="event-team-name away-team d-flex align-items-center justify-content-center gap-2">
1252: 							<span class="event-opponent-name mb-0 align-middle">#printTeamName($awayTeam)</span>
1253: 							#printNotations($event)
1254: 						</div>
1255: 					</div>
1256: 				</div>
1257: 				<div class="flex-shrink-1">
1258: 					#if($awayTeam.winner)<span class="fa-solid fa-sm fa-caret-right"></span>#end ${awayTeam.result}
1259: 				</div>
1260: 			</div>
1261: 			<div class="d-flex flex-row justify-content-center align-items-center gap-2 #if($homeTeam.winner) fw-bold #end">
1262: 				#if ($showTeamLogo && $homeTeam.teamId.length() > 0)
1263: 					<div class="logo-aside-container">
1264: 						#printTeamLogoSetWidth($homeTeam, 40)
1265: 					</div>
1266: 				#end
1267: 				<div class="flex-grow-1  text-start">
1268: 					<div class="d-flex flex-column align-items-start justify-content-centergap-1">
1269: 						<div class="event-team-name home-team d-flex align-items-center justify-content-center gap-2">
1270: 							<span class="event-opponent-name mb-0 align-middle">#printTeamName($homeTeam)</span>
1271: 							#printNotations($event)
1272: 						</div>
1273: 					</div>
1274: 				</div>
1275: 				<div class="flex-shrink-1">
1276: 					#if($homeTeam.winner)<span class="fa-solid fa-sm fa-caret-right"></span>#end ${homeTeam.result}
1277: 				</div>
1278: 			</div>
1279: 		</div>
1280: 		<div class="text-md-right flex-shrink-1 col-md-6 col-lg-4">
1281: 			<div class="d-flex flex-column align-items-center align-items-md-end justify-content-center gap-1 text-center text-md-end">
1282: 				<div class="event-dateinfo">
1283: 					<div class="d-flex flex-column align-items-center justify-content-start align-items-lg-end justify-content-lg-end gap-2">
1284: 						<div class="date d-flex align-items-center justify-content-center gap-1">
1285: 							<span class="fa fa-calendar-o fa-sm text-muted" aria-hidden="true"></span>
1286: 							<span>#eventDate($event)</span>
1287: 						</div>
1288: 						<div class="status d-flex align-items-center justify-content-center gap-1">
1289: 							<span class="fa-regular fa-clock fa-sm text-muted" aria-hidden="true"></span>
1290: 							<span>#printEventStatus($event)</span>
1291: 						</div>
1292: 					</div>
1293: 				</div>
1294: 				#if ($event.neutralSite.length() > 0)
1295: 					<div class="event-neutralsite small text-muted text-center text-md-end">#printEventNeutralSite($event)</div>
1296: 				#end
1297: 				<div class="details d-flex flex-wrap gap-3 align-items-center justify-content-center justify-content-md-start">
1298: 					<div class="event-notes small text-muted text-center text-md-end">#printEventNotes($event)</div>
1299: 				</div>
1300: 				#if($leaderSportsMapped.contains($sport.replace("women's ", "").replace("men's ", "")))
1301: 					#if ($showLeaders && $rosterHeadshots.size() > 0 && ($boxscoreURL.length() > 0))
1302: 						<div class="game-leaders d-none d-md-flex align-items-center justify-content-center justify-content-lg-end">
1303: 							$website.include("${boxscoreURL}?tmpl=schedule-game-leaders-template&teamId=${schedule.teamId}")
1304: 						</div>
1305: 					#end
1306: 				#end
1307: 			</div>
1308: 		</div>
1309: 	</div>
1310: </div>
1311: 	#if($event.links.size() > 0 || $eventOverview)
1312: 	<div class="card-footer small">
1313: 		<div class="event-controls d-flex flex-column flex-md-row align-items-md-center justify-content-center gap-3 ">
1314: 			<div class="event-links list-inline d-flex align-items-center justify-content-center justify-content-md-start gap-3 flex-wrap flex-grow-1">
1315: 				#printEventCardLinks($event)
1316: 			</div>
1317: 			#if($eventOverview)
1318: 				<div class="event-overview d-none d-md-flex overflow-hidden border-start me-n3 mt-n2 mb-n2">
1319: 					<a class="btn d-block btn-link event-overview-toggle w-100" aria-label="Event Overview"><span class="fa-regular fa-plus"></span></a>
1320: 				</div>
1321: 			#end
1322: 		</div>
1323: 	</div>
1324: 	#end
1325: 
1326: #end ## printConferenceEvent
1327: 
1328: #macro (printLocationIcon $event)
1329: 	#if ($event.neutralSite.length() > 0 || $event.home)
1330: 	<span class="event-location-badge m-0 align-middle text-muted small">vs</span>
1331: 	#else
1332: 	<span class="event-location-badge m-0 align-middle text-muted small">at</span>
1333: 	#end
1334: #end
1335: 
1336: #macro(buildEventClass $event)
1337: 	#set($class = "event-row")
1338: 
1339: 	## Location
1340: 	#if ($event.neutralSite.length() > 0)
1341: 		#set($class = "${class} neutral")
1342: 	#elseif ($event.home)
1343: 		#set($class = "${class} home")
1344: 	#else
1345: 		#set($class = "${class} away")
1346: 	#end
1347: 
1348: 	## Metadata Flags
1349: 	#if ($event.inProgress)
1350: 		#set($class = "${class} in-progress")
1351: 	#end
1352: 	#if ($event.conference)
1353: 		#set($class = "${class} conf")
1354: 	#end
1355: 	#if ($event.postseason)
1356: 		#set($class = "${class} postseason")
1357: 	#end
1358: 	#if ($event.division)
1359: 		#set($class = "${class} division")
1360: 	#end
1361: 	#if (!$event.overall)
1362: 		#set($class = "${class} exhibition")
1363: 	#end
1364: 
1365: 	## Schedule Status
1366: 	#if ($event.statusCode < 0 && !$event.inProgress)
1367: 		#if ($event.date && !$event.date.before($now))
1368: 			#if (!$request.getAttribute("scheduleNextEvent"))
1369: 				#set($class = "${class} upcoming schedule-next-event-indicator")
1370: 				$request.setAttribute("scheduleNextEvent", true)
1371: 			#else
1372: 				#set($class = "${class} upcoming")
1373: 			#end
1374: 		#end
1375: 	#else
1376: 		#set($class = "${class} result")
1377: 	#end
1378: 
1379: 	## Link Processing
1380: 	#set($boxscoreURL = "")
1381: 	#set($recapURL = "")
1382: 	#foreach ($link in $event.links)
1383: 		#if ($link.url.endsWith(".xml") && $link.mapType == "BS" && !$website.isExternalLink($link.url))
1384: 			#set($boxscoreURL = $link.url)
1385: 		#elseif ($link.mapType == "RC" && !$website.isExternalLink($link.url))
1386: 			#set($recapURL = $link.url)
1387: 		#end
1388: 	#end
1389: 
1390: 	#if (($boxscoreURL && $boxscoreURL.length() > 0) || ($recapURL && $recapURL.length() > 0))
1391: 		#set($class = "${class} has-recap")
1392: 	#end
1393: 
1394: 	#if ($recapURL && $recapURL.length() > 0)
1395: 		#set($class = "${class} has-links")
1396: 	#end
1397: 	$request.setAttribute("eventClass", $class)
1398: #end
1399: 
1400: #macro (printEvents $evt $border)
1401: 	#if(!$border)
1402: 		#set($border = false)
1403: 	#end
1404: 
1405: 	#if ($enhancedLayout)
1406: 		#printCards($evt, $border)
1407: 	#else
1408: 		#printTable($evt, $border)
1409: 	#end
1410: #end
1411: 
1412: #macro (printCollapsibleMonths $evts)
1413: 	#set ($lastDate = "")
1414: 	#set ($lastTournament = "")
1415: 	#set ($eventsByMonth = {})
1416: 
1417: 	## Group events by month
1418: 	#foreach($event in $evts)
1419: 		#set($monthKey = $formatter.formatDate($event.date, "MMMM"))
1420: 		#if (!$eventsByMonth.containsKey($monthKey))
1421: 			#set($discard = $eventsByMonth.put($monthKey, []))
1422: 		#end
1423: 		#set($discard = $eventsByMonth.get($monthKey).add($event))
1424: 	#end
1425: 
1426: 	## Sort months chronologically
1427: 	#set($monthOrder = [])
1428: 	#foreach($monthName in $eventsByMonth.keySet())
1429: 		#set($firstEventDate = $eventsByMonth.get($monthName).get(0).date)
1430: 		#set($eventYear = $formatter.formatDate($firstEventDate, "yyyy"))
1431: 		#set($dateString = "1 $monthName $eventYear")
1432: 		#set($monthDate = $dateTool.get($dateString))
1433: 		#set($discard = $monthOrder.add({"name": $monthName, "date": $monthDate}))
1434: 	#end
1435: 	#set($monthOrder = $tool.sorter.sort($monthOrder, "date"))
1436: 
1437: 	## Prepare output ordering
1438: 	#set($outputMonthOrder = [])
1439: 	#set($expandMonth = "")
1440: 	#set($currentMonthName = $formatter.formatDate($now, "MMMM"))
1441: 	#set($currentYear = $formatter.formatDate($now, "yyyy"))
1442: 	#set($currentMonthDate = $dateTool.get("1 $currentMonthName $currentYear"))
1443: 
1444: 	#if($currentMonthFirst)
1445: 		#set($mostRecent = {})
1446: 		#set($found = false)
1447: 		#foreach($m in $monthOrder)
1448: 			#if(!$found)
1449: 				#foreach($e in $eventsByMonth.get($m.name))
1450: 					#if($e.date.after($now) || $e.date.equals($now))
1451: 						#set($mostRecent = $m)
1452: 						#set($expandMonth = $m.name)
1453: 						#set($found = true)
1454: 						#break
1455: 					#end
1456: 				#end
1457: 			#end
1458: 		#end
1459: 
1460: 		## If no upcoming/current event found, fall back to last month safely
1461: 		#if(!$found)
1462: 			#set($mostRecent = {})
1463: 			#foreach($m in $monthOrder)
1464: 				#set($mostRecent = $m)
1465: 			#end
1466: 			#if($mostRecent.name)
1467: 				#set($expandMonth = $mostRecent.name)
1468: 			#end
1469: 		#end
1470: 
1471: 		## Add most recent month first
1472: 		#if($mostRecent.name)
1473: 			#set($discard = $outputMonthOrder.add($mostRecent))
1474: 		#end
1475: 
1476: 		## Add Completed Marker only before first past month
1477: 		#set($addedCompletedMarker = false)
1478: 		#foreach($m in $monthOrder)
1479: 			#if($m.name != $mostRecent.name)
1480: 				#set($monthEvents = $eventsByMonth.get($m.name))
1481: 				#set($monthStatus = "month-past")
1482: 				#foreach($e in $monthEvents)
1483: 					#if($e.date.after($now))
1484: 						#set($monthStatus = "month-upcoming")
1485: 						#break
1486: 					#elseif($e.date.equals($now))
1487: 						#set($monthStatus = "month-current")
1488: 						#break
1489: 					#end
1490: 				#end
1491: 				#if(!$addedCompletedMarker && $monthStatus == "month-past")
1492: 					#set($discard = $outputMonthOrder.add({"name": "COMPLETED_MARKER"}))
1493: 					#set($addedCompletedMarker = true)
1494: 				#end
1495: 				#set($discard = $outputMonthOrder.add($m))
1496: 			#end
1497: 		#end
1498: 	#else
1499: 		## Normal chronological list (currentMonthFirst = false)
1500: 		#set($addedCompletedMarker = false)
1501: 		#set($foundCurrentOrUpcoming = false)
1502: 		#foreach($m in $monthOrder)
1503: 			#set($monthEvents = $eventsByMonth.get($m.name))
1504: 			#set($monthStatus = "month-past")
1505: 			#foreach($e in $monthEvents)
1506: 				#if($e.date.after($now))
1507: 					#set($monthStatus = "month-upcoming")
1508: 					#set($foundCurrentOrUpcoming = true)
1509: 					#break
1510: 				#elseif($e.date.equals($now))
1511: 					#set($monthStatus = "month-current")
1512: 					#set($foundCurrentOrUpcoming = true)
1513: 					#break
1514: 				#end
1515: 			#end
1516: 			#if(!$addedCompletedMarker && $monthStatus == "month-past")
1517: 				#set($discard = $outputMonthOrder.add({"name": "COMPLETED_MARKER"}))
1518: 				#set($addedCompletedMarker = true)
1519: 			#end
1520: 			#set($discard = $outputMonthOrder.add($m))
1521: 		#end
1522: 
1523: 		## Decide which month to expand: first upcoming/current or fallback to last past
1524: 		#set($expandMonth = "")
1525: 		#set($foundExpand = false)
1526: 		#foreach($m in $monthOrder)
1527: 			#set($monthEvents = $eventsByMonth.get($m.name))
1528: 			#set($monthStatus = "month-past")
1529: 			#foreach($e in $monthEvents)
1530: 				#if($e.date.after($now))
1531: 					#set($monthStatus = "month-upcoming")
1532: 					#break
1533: 				#elseif($e.date.equals($now))
1534: 					#set($monthStatus = "month-current")
1535: 					#break
1536: 				#end
1537: 			#end
1538: 			#if(!$foundExpand && ($monthStatus == "month-current" || $monthStatus == "month-upcoming"))
1539: 				#set($expandMonth = $m.name)
1540: 				#set($foundExpand = true)
1541: 			#end
1542: 		#end
1543: 		## If none found (all past), expand last month
1544: 		#if(!$foundExpand && $monthOrder.size() > 0)
1545: 			#set($lastMonth = {})
1546: 			#foreach($m in $monthOrder)
1547: 				#set($lastMonth = $m)
1548: 			#end
1549: 			#if($lastMonth.name)
1550: 				#set($expandMonth = $lastMonth.name)
1551: 			#end
1552: 		#end
1553: 	#end
1554: 
1555: 	#foreach($m in $outputMonthOrder)
1556: 		#if($m.name == "COMPLETED_MARKER")
1557: 			#if($currentMonthFirst)
1558: 			<div class="completed-months-heading small text-muted rounded text-center">
1559: 				<span class="fa-solid fa-sm fa-dash"></span> Previous Months <span class="fa-solid fa-sm fa-dash"></span>
1560: 			</div>
1561: 			#end
1562: 		#else
1563: 			#set($month = $m.name)
1564: 			#set($monthEvents = $eventsByMonth.get($month))
1565: 			#set($eventCount = $monthEvents.size())
1566: 			#set($isExpanded = false)
1567: 			#if($month == $expandMonth || $isPrinterFriendly)
1568: 				#set($isExpanded = true)
1569: 			#end
1570: 
1571: 			#set($collapseClass = "")
1572: 			#set($ariaExpanded = "false")
1573: 			#if($isExpanded)
1574: 				#set($collapseClass = "show")
1575: 				#set($ariaExpanded = "true")
1576: 			#end
1577: 
1578: 			## Determine month status
1579: 			#set($monthStatus = "month-past")
1580: 			#foreach($e in $monthEvents)
1581: 				#if($e.date.after($now))
1582: 					#set($monthStatus = "month-upcoming")
1583: 					#break
1584: 				#elseif($e.date.equals($now))
1585: 					#set($monthStatus = "month-current")
1586: 					#break
1587: 				#end
1588: 			#end
1589: 
1590: 		<div class="section-event-month $month.toLowerCase() $monthStatus">
1591: 			<a class="toggle-month text-decoration-none" aria-label="Open/Close $month Calendar" data-bs-toggle="collapse" href="#$month.toLowerCase()-collapse" role="button" aria-expanded="$ariaExpanded" aria-controls="$month.toLowerCase()-collapse">
1592: 					<span class="d-block section-header rounded text-white bg-primary p-2 px-3 position-relative">
1593: 						<span class="d-flex flex-row justify-content-start justify-content-between gap-3">
1594: 							<span class="month-heading flex-grow-1 fw-bold">
1595: 								<span class="month-title">$month</span>
1596: 							</span>
1597: 							<span class="month-heading-control flex-shrink-1 small">
1598: 								<span class="month-count small">$eventCount event#if($eventCount > 1)s#end</span>
1599: 							</span>
1600: 							<span class="toggle-month-indicator opacity-3">
1601: 								<span class="fa fa-solid fa-sm fa-chevron-up"></span>
1602: 							</span>
1603: 						</span>
1604: 					</span>
1605: 			</a>
1606: 			<div class="collapse navbar-collapse $collapseClass" id="$month.toLowerCase()-collapse">
1607: 				<div class="event-month-list d-flex flex-column gap-3 mt-3">
1608: 					#if ($groupDates)
1609: 							#printCollapsibleDates($monthEvents, true)
1610: 						#else
1611: 						#printEvents($monthEvents, true)
1612: 					#end
1613: 				</div>
1614: 			</div>
1615: 		</div>
1616: 		#end
1617: 	#end
1618: 
1619: #end
1620: 
1621: 
1622: #macro (printCollapsibleDates $evt, $border)
1623: 	#if(!$border)
1624: 		#set($border = false)
1625: 	#end
1626: 	## GROUP EVENTS BY MONTH
1627: 	#set($eventsByDate = {})
1628: 	#foreach($event in $evt)
1629: 		#set($dateKey = $formatter.formatDate($event.date, "${dateFormat}"))
1630: 		#if (!$eventsByDate.containsKey($dateKey))
1631: 			#set($eval = $eventsByDate.put($dateKey, []))
1632: 		#end
1633: 		#set($eval = $eventsByDate.get($dateKey).add($event))
1634: 	#end
1635: 
1636: <div class="section-event-group-dates d-flex flex-column gap-3">
1637: 	#foreach($date in $eventsByDate.keySet())
1638: 		#set($dateEvents = $eventsByDate.get($date))
1639: 		#set($eventCount = $dateEvents.size())
1640: 
1641: 		<div class="card #if($groupDates)border-0 rounded-0#end section-event-date" data-date="$date">
1642: 			<div class="card-header px-2">
1643: 				<div class="d-flex flex-row justify-content-start justify-content-between">
1644: 					<div class="date-heading flex-grow-1">
1645: 						<div class="d-flex align-items-center justify-content-start gap-2">
1646: 							<span class="fa fa-calendar-o fa-sm text-muted" aria-hidden="true"></span>
1647: 							<span class="date-title fw-bold">$date</span>
1648: 						</div>
1649: 					</div>
1650: 					<div class="date-heading-control flex-shrink-1 small">
1651: 						<span class="date-count small opacity-75">$eventCount event#if($eventCount > 1)s#end</span>
1652: 					</div>
1653: 				</div>
1654: 			</div>
1655: 			<div class="card-body event-date-list #if($groupDates)px-0 rounded-0#end">
1656: 				<div class="d-flex align-items-center justify-content-center gap-3 flex-column">
1657: 					#printEvents($dateEvents, $border)
1658: 				</div>
1659: 			</div>
1660: 		</div>
1661: 	#end
1662: </div>
1663: #end
1664: 
1665: #macro (printTableDateCards $evt)
1666: 
1667: 	## GROUP EVENTS BY MONTH
1668: 	#set($eventsByDate = {})
1669: 	#foreach($event in $evt)
1670: 		#set($dateKey = $formatter.formatDate($event.date, "${dateFormat}"))
1671: 		#if (!$eventsByDate.containsKey($dateKey))
1672: 			#set($eval = $eventsByDate.put($dateKey, []))
1673: 		#end
1674: 		#set($eval = $eventsByDate.get($dateKey).add($event))
1675: 	#end
1676: 
1677: <div class="section-event-group-dates d-flex flex-column gap-3">
1678: 	#foreach($date in $eventsByDate.keySet())
1679: 		#set($dateEvents = $eventsByDate.get($date))
1680: 		#set($eventCount = $dateEvents.size())
1681: 
1682: 		<div class="card border section-event-date" data-date="$date">
1683: 			<div class="card-header px-2">
1684: 				<div class="d-flex flex-row justify-content-start justify-content-between">
1685: 					<div class="date-heading flex-grow-1">
1686: 						<div class="d-flex align-items-center justify-content-start gap-2">
1687: 							<span class="fa fa-calendar-o fa-sm text-muted" aria-hidden="true"></span>
1688: 							<span class="date-title fw-bold">$date</span>
1689: 						</div>
1690: 					</div>
1691: 					<div class="date-heading-control flex-shrink-1 small">
1692: 						<span class="date-count small opacity-75">$eventCount event#if($eventCount > 1)s#end</span>
1693: 					</div>
1694: 				</div>
1695: 			</div>
1696: 			<div class="card-body event-date-list">
1697: 				#printTable($dateEvents)
1698: 			</div>
1699: 		</div>
1700: 	#end
1701: </div>
1702: #end
1703: 
1704: #macro (printNextEventList $evt)
1705: 	#if ($evt.size() > 0)
1706: 		#set ($eventObject = {})
1707: 		#set ($eventList = $tool.sorter.sort($evt, "date"))
1708: 		#set ($val = $eventObject.put('nextevent', $evt.get(0)))
1709: 	<div class="nextevent-list d-flex flex-column gap-3 d-print-none">
1710: 		#foreach($event in $eventObject)
1711: 				#buildEventClass($event)
1712: 				#set($eventClass = $request.getAttribute("eventClass"))
1713: 
1714: 				#printNextEventCard($evt)
1715: 			#end
1716: 	</div>
1717: 	#end
1718: #end
1719: 
1720: #macro (printNextEventCard $evt)
1721: <div class="card w-100 ${eventClass} bg-primary text-white" #printBoxscoreRecapUrl($event)>
1722: 	#if ($isTeamSchedule || $event.teams.size() == 1)
1723: 			#printTeamEventForNextEvent($event)
1724: 		#elseif ($event.teams.size() == 2) ## conference schedule with head-to-head events
1725: 		#printConfEventForNextEvent($event)
1726: 	#end
1727: </div>
1728: #end
1729: 
1730: #macro (printCards $evt $border)
1731: 	#foreach($event in $evt)
1732: 
1733: 		#if ($isTeamSchedule)
1734: 			#set ($theDate = $formatter.formatDate($event.date, "MMMM"))
1735: 		#else
1736: 			#set ($theDate = $formatter.formatDate($event.date, "EEEE, MMMM dd, yyyy"))
1737: 		#end
1738: 
1739: 		#if (!$lastDate.equals($theDate))
1740: 			#set ($lastTournament = "") ## force clear of tournament name being held because the month/date needs to  be closed as well.
1741: 		#end
1742: 		#set ($lastDate = $theDate)
1743: 
1744: 		#if($schedule.includeTournamentLabels)
1745: 			#if($!schedule.tournamentEvent.get($event.eventId))
1746: 				#if($lastTournament.length() > 0 && $schedule.tournamentEvent.get($event.eventId) != $lastTournament)
1747: 				</div> ## CLEAR PREVIOUS TOURNAMENT IS THIS TOURNAMENT IS DIFFERENT
1748: 					#set ($lastTournament = "")
1749: 				#end
1750: 
1751: 				#if($lastTournament.length() == 0 || !$lastTournament.equals($schedule.tournamentEvent.get($event.eventId)))
1752: 				<div class="event-group-tournament d-flex flex-column gap-3 pb-3 border-5 border-secondary">
1753: 				#end
1754: 
1755: 				#if(!$lastTournament.equals($schedule.tournamentEvent.get($event.eventId)))
1756: 					<div class="event-tournament section-tournament-header rounded text-white bg-secondary p-2 px-3">$schedule.tournamentEvent.get($event.eventId)</div>
1757: 				#end
1758: 
1759: 				#set ($lastTournament = $schedule.tournamentEvent.get($event.eventId))
1760: 			#else
1761: 				#if($lastTournament.length() > 0)
1762: 				</div> ## must close all open tournament div if next event is not part of a tournament
1763: 					#set ($lastTournament = "")
1764: 				#end
1765: 			#end
1766: 		#end
1767: 
1768: 		#buildEventClass($event)
1769: 		#set($eventClass = $request.getAttribute("eventClass"))
1770: 
1771: 		#set ($sport = $event.sport.toLowerCase())
1772: 		#if ($showLeaders && $rosterHeadshots.size() > 0 && $leaderSportsMapped.contains($sport.replace("women's ", "").replace("men's ", "")))
1773: 			#set ($eventClass = "${eventClass} has-leaders")
1774: 		#else
1775: 			#set ($eventClass = "${eventClass} no-leaders")
1776: 		#end
1777: 
1778: 	<div class="card w-100 ${eventClass}" #printBoxscoreRecapUrl($event)>
1779: 		#if ($isTeamSchedule || $event.teams.size() == 1)
1780: 				#printTeamEvent($event)
1781: 			#elseif ($event.teams.size() == 2) ## conference schedule with head-to-head events
1782: 			#printConfEvent($event)
1783: 		#end
1784: 	</div>
1785: 
1786: 		#if($schedule.includeTournamentLabels)
1787: 			#if($foreach.last && $lastTournament.length() > 0) </div> #end
1788: 		#end
1789: 	#end
1790: #end
1791: 
1792: 
1793: #macro (printTable $evt)
1794: 	$request.setAttribute("icl-dataTables-script", true)
1795: 
1796: <div class="table-responsive table-responsive-via-datatables mb-3 w-100">
1797: 	<table class="table ${tableHelperClass} small w-100">
1798: 		<thead>
1799: 		<tr>
1800: 			#set ($colCount = 0)
1801: 			#foreach ($label in $scheduleLabels)
1802: 				#set ($class = "")
1803: 				#if($label.toLowerCase().contains("date"))
1804: 					#set ($class = "${class} table-active")
1805: 				#elseif($label.toLowerCase().contains("away") || $label.toLowerCase().contains("home"))
1806: 					#set ($class = "${class} col-12 col-md-4 col-lg-3 w-25")
1807: 				#elseif($label.toLowerCase().contains("opponent") || $label.toLowerCase().contains("opponent+neutralsite"))
1808: 					#set ($class = "${class} col-12 col-md-4 col-lg-3 w-25")
1809: 				#elseif($label.toLowerCase().contains("links"))
1810: 					#set ($class = "${class} col-12 col-md-4 col-lg-3 w-25")
1811: 				#elseif($label.toLowerCase().contains("notes"))
1812: 					#set ($class = "${class} col-12 col-md-4 col-lg-3 w-25")
1813: 				#elseif($label.toLowerCase().contains("status"))
1814: 					#set ($class = "${class} w-1")
1815: 				#end
1816: 				#if (!$tool.list.get($scheduleFields, $tool.math.sub($velocityCount, 1)).startsWith("_"))
1817: 					<th class="${class}" data-field-name="${label.toLowerCase()}">$label</th>
1818: 					#set ($colCount = $colCount + 1)
1819: 				#end
1820: 			#end
1821: 		</tr>
1822: 		</thead>
1823: 		#set ($lastdate = "")
1824: 		#set ($lastMonth = "")
1825: 		#set ($counter = 0)
1826: 		<tbody class="event-group">
1827: 			#foreach ($event in $evt)
1828: 				#set ($formattedDate = $formatter.formatDate($event.date, $dateFormat))
1829: 				#set ($theDate = $formatter.formatDate($event.date, "MMMM dd yyyy"))
1830: 				#set ($theMonth = $formatter.formatDate($event.date, "MMMM"))
1831: 
1832: 				#set ($counter = $counter + 1)
1833: 
1834: 				#buildEventClass($event)
1835: 				#set($eventClass = $request.getAttribute("eventClass"))
1836: 
1837: 				#if ($scheduleFields.contains("_date") && !$lastDate.equals($theDate))
1838: 				<tr class="${eventClass} date-title"><td colspan="${colCount}">$formattedDate</td></tr>
1839: 
1840: 					## EVENTS ARE GROUPED WHEN HERE SO RESET COUNTER BACK TO 0
1841: 					#set ($counter = 0)
1842: 				#end
1843: 
1844: 
1845: 			<tr class="${eventClass}" #if ($event.inProgress) title="In Progress" #end>
1846: 				#foreach ($field in $scheduleFields)
1847: 
1848: 					## DATE
1849: 					#if ($field.equals("date"))
1850: 						<td class="date w-1 table-active align-middle #if ($event.home) fw-bold #end">
1851: 							<div class="nowrap d-block">
1852: 								#if (!$lastDate.equals($theDate)) $formattedDate #else &nbsp; #end
1853: 							</div>
1854: 						</td>
1855: 					#end
1856: 
1857: 					## OPPONENT
1858: 					#if ($field.equals("opponent") || $field.equals("opponent+neutralsite"))
1859: 						<td class="team opponent align-middle text-center text-lg-start">
1860: 							<div class="team-opponent-wrapper d-flex flex-column align-items-center justify-content-center align-items-lg-start justify-content-lg-start gap-0">
1861: 								<div class="w-100 d-flex flex-column flex-lg-row align-items-center align-items-lg-center justify-content-center justify-content-lg-start gap-1">
1862: 									#printTeamLogoSetWidth($event.opponent, 32)
1863: 									<div class="flex-grow-1">
1864: 										#if ($showVsAt)
1865: 											#printLocationIcon($event)
1866: 										#end
1867: 										<span class="#if ($event.home) fw-bold #end">#printTeamName($event.opponent)</span>
1868: 									</div>
1869: 								</div>
1870: 								#if ($field.equals("opponent+neutralsite") && $event.neutralSite.length() > 0)
1871: 									<span class="neutralsite text-muted small">@ $event.neutralSite</span>
1872: 								#end
1873: 
1874: 								#if ($eventClass.contains("next") && $groupMonths.equals(true))
1875: 									<span class="event-location-badge badge bg-dark m-0 me-1 align-middle nowrap small">
1876: 										<span class="fa-solid fa-bullhorn fw-normal" aria-hidden="true"></span> <span class="fw-normal">Next Event</span>
1877: 									</span>
1878: 								#end
1879: 							</div>
1880: 						</td>
1881: 					#end
1882: 
1883: 					## RESULT
1884: 					#if ($field.equals("result") || $field.equals("result+status"))
1885: 						<td class="result align-middle #if($event.home) fw-bold #end">
1886: 							<div class="d-flex align-items-center justify-content-center justify-content-lg-between gap-2 flex-nowrap w-100">
1887: 								<span class="text-nowrap">#printAPResult($event)</span>
1888: 								#if ($field.equals("result+status"))
1889: 									#if ($eventClass.contains("in-progress"))
1890: 										<span class="fa fa-circle fa-sm fa-beat-fade text-primary" aria-hidden="true"></span>
1891: 									#end
1892: 									<span class="text-nowrap #if ($event.home) fw-bold #end">#printEventStatus($event)</span>
1893: 								#end
1894: 							</div>
1895: 						</td>
1896: 					#end
1897: 
1898: 					## TEAM AWAY
1899: 					#if ($field.equals("team_away") || $field.equals("team_away+team_away_result"))
1900: 						#set ($class = "team awayteam align-middle ")
1901: 						#if ($field.equals("team_away+team_away_result"))
1902: 							#set ($class = "${class} teamresult")
1903: 						#end
1904: 						<td class="$class">
1905: 							#if ($event.teams.size() > 0)
1906: 								#set ($awayTeam = $event.teams.get(0))
1907: 								<div class="d-flex align-items-center justify-content-center justify-content-md-start gap-2 flex-nowrap #if ($awayTeam.winner) fw-bold #end">
1908: 									#printTeamLogoSetWidth($awayTeam, 32)
1909: 									<span class="flex-grow-1">#printTeamName($awayTeam)</span>
1910: 
1911: 									#if ($field.equals("team_away+team_away_result") && $awayTeam.result.length() > 0)
1912: 										#if ($awayTeam.winner)
1913: 											<span class="result winner"><span class="fa-solid fa-sm fa-caret-right" aria-hidden="true"></span> $awayTeam.result</span>
1914: 										#else
1915: 											<span class="result">$awayTeam.result</span>
1916: 										#end
1917: 									#end
1918: 								</div>
1919: 							#else
1920: 								&nbsp;
1921: 							#end
1922: 						</td>
1923: 					#end
1924: 
1925: 					## TEAM AWAY RESULT
1926: 					#if ($field.equals("team_away_result"))
1927: 						#set ($class = "e_result align-middle  e_awayresult")
1928: 						#if ($event.teams.size() > 0 && $event.teams.get(0).winner)
1929: 							#set ($class = "${class} winner")
1930: 						#end
1931: 						<td class="${class}">
1932: 							#if ($event.teams.size() > 0 && $event.teams.get(0).result.length() > 0)
1933: 								<span class="text-nowrap #if ($event.teams.get(0).winner) fw-bold #end">
1934: 										#if ($event.teams.get(0).winner) <span class="fa-solid fa-sm fa-caret-right" aria-hidden="true"></span> #end
1935: 									$event.teams.get(0).result
1936: 									</span>
1937: 							#else
1938: 							#end
1939: 						</td>
1940: 					#end
1941: 
1942: 					## TEAM HOME
1943: 					#if ($field.equals("team_home") || $field.equals("team_home+team_home_result"))
1944: 						#set ($class = "team align-middle hometeam")
1945: 						#if ($field.equals("team_home+team_home_result"))
1946: 							#set ($class = "${class} teamresult")
1947: 						#end
1948: 						<td class="$class">
1949: 							#if ($event.teams.size() > 1)
1950: 								#set ($homeTeam = $event.teams.get(1))
1951: 								<div class="d-flex align-items-center justify-content-center justify-content-md-start gap-2 flex-nowrap #if ($homeTeam.winner) fw-bold #end">
1952: 									#printTeamLogoSetWidth($homeTeam, 32)
1953: 									<span class="flex-grow-1">#printTeamName($homeTeam)</span>
1954: 
1955: 									#if ($field.equals("team_home+team_home_result") && $homeTeam.result.length() > 0)
1956: 										#if ($homeTeam.winner)
1957: 											<span class="result winner"><span class="fa-solid fa-sm fa-caret-right" aria-hidden="true"></span> $homeTeam.result</span>
1958: 										#else
1959: 											<span class="result">$homeTeam.result</span>
1960: 										#end
1961: 									#end
1962: 								</div>
1963: 							#else
1964: 								&nbsp;
1965: 							#end
1966: 						</td>
1967: 					#end
1968: 
1969: 					## TEAM HOME RESULT
1970: 					#if ($field.equals("team_home_result"))
1971: 						#set ($class = "result align-middle homeresult")
1972: 						#if ($event.teams.size() > 1 && $event.teams.get(1).winner)
1973: 							#set ($class = "${class} winner")
1974: 						#end
1975: 						<td class="$class">
1976: 							#if ($event.teams.size() > 1 && $event.teams.get(1).result.length() > 0)
1977: 								<span class="text-nowrap #if ($event.teams.get(1).winner) fw-bold #end">
1978: 										#if ($event.teams.get(1).winner) <span class="fa-solid fa-sm fa-caret-right" aria-hidden="true"></span> #end
1979: 									$event.teams.get(1).result
1980: 									</span>
1981: 							#else
1982: 							#end
1983: 						</td>
1984: 					#end
1985: 
1986: 					## BOTH TEAMS AND THEIR RESULT
1987: 					#if ($field.equals("teams+result"))
1988: 						<td class="e_teams_result align-middle">
1989: 							#foreach ($team in $event.teams)
1990: 								#if ($velocityCount == 1)
1991: 									#printNotations($event)
1992: 								#end
1993: 
1994: 								#if ($velocityCount > 1) &nbsp;&nbsp; #end
1995: 
1996: 								#printTeamLogoSetWidth($team, 32)
1997: 								#printTeamName($team)
1998: 
1999: 								#if ($team.result.length() > 0) <span class="text-nowrap">$team.result</span> #end
2000: 							#end
2001: 						</td>
2002: 					#end
2003: 
2004: 					## STATUS
2005: 					#if ($field.equals("status"))
2006: 						<td class="status align-middle">
2007: 							<div class="d-flex align-items-center justify-content-center justify-content-lg-between gap-2 flex-nowrap w-100">
2008: 								#if ($eventClass.contains("in-progress"))
2009: 									<span class="fa fa-circle fa-sm fa-beat-fade text-primary" aria-hidden="true"></span>
2010: 								#end
2011: 								<span class="text-nowrap #if ($event.home) fw-bold #end">#printEventStatus($event)</span>
2012: 								#printNotations($event)
2013: 							</div>
2014: 						</td>
2015: 					#end
2016: 
2017: 					## LINKS (SAME ROW)
2018: 					#if ($field.equals("links"))
2019: 						<td class="links align-middle">
2020: 							<div class="list-inline d-flex align-items-center justify-content-start flex-wrap gap-2">
2021: 								#printEventLinks($event, "list-inline-item text-decoration-none m-0 text-nowrap")
2022: 									$wiki.event($event)
2023: 							</div>
2024: 						</td>
2025: 					#end
2026: 					## NOTES (SAME ROW)
2027: 					#if ($field.equals("notes") || $field.equals("notes+neutralsite"))
2028: 						<td class="notes text-muted small align-middle">
2029: 							<div class="d-flex align-items-center justify-content-center justify-content-lg-start gap-2">
2030: 								$!event.notes #if ($field.equals("notes+neutralsite") && $event.neutralSite.length() > 0) @ $event.neutralSite #end
2031: 							</div>
2032: 						</td>
2033: 					#end
2034: 
2035: 					## NEUTRALSITE
2036: 					#if ($field.equals("neutralsite"))
2037: 						<td class="e_neutralsite align-middle">
2038: 							#if ($event.neutralSite.length() > 0)
2039: 								## DISPLAY THE @ CHARACTER ONLY FOR HEAD-TO-HEAD SCHEDULES (non numeric schedules sometimes use neutralSite field for event name)
2040: 								#if ($schedule.numericResults) @ #end $event.neutralSite
2041: 							#else
2042: 								&nbsp;
2043: 							#end
2044: 						</td>
2045: 					#end
2046: 
2047: 					## VENUE+LOCATION
2048: 					#if ($field.equals("venue+location"))
2049: 						<td class="e_venue">
2050: 							#if ($event.venue.length() > 0)
2051: 								<div class="">$event.venue</div>
2052: 							#end
2053: 							#if ($event.address.length() > 0)
2054: 								<div class="address-formatted">
2055: 									#if($event.address.length() > 0 && $event.city.length() > 0 && $event.stateCountry.length() > 0 && $event.zipCode.length() > 0)
2056: 										<a target="_blank" href="http://maps.google.com/maps?q=$!event.address.replace(' ','+'),+$!event.city.replace(' ','+'),+$!event.stateCountry+$!event.zipCode">
2057: 											$!event.address, $!event.city, $!event.stateCountry $!event.zipCode
2058: 										</a>
2059: 									#else
2060: 										$!event.address, $!event.city, $!event.stateCountry $!event.zipCode
2061: 									#end
2062: 								</div>
2063: 							#end
2064: 						</td>
2065: 					#end
2066: 
2067: 					## VENUE
2068: 					#if ($field.equals("venue"))
2069: 						<td class="e_venue align-middle">
2070: 							#if ($event.venue.length() > 0)
2071: 									$event.venue
2072: 								#end
2073: 						</td>
2074: 					#end
2075: 
2076: 					## VENUE
2077: 					#if ($field.equals("location"))
2078: 						<td class="e_location align-middle">
2079: 							#if ($event.address.length() > 0)
2080: 								<div class="address-formatted">
2081: 									#if($event.address.length() > 0 && $event.city.length() > 0 && $event.stateCountry.length() > 0 && $event.zipCode.length() > 0)
2082: 										<a target="_blank" href="http://maps.google.com/maps?q=$!event.address.replace(' ','+'),+$!event.city.replace(' ','+'),+$!event.stateCountry+$!event.zipCode">
2083: 											$!event.address, $!event.city, $!event.stateCountry $!event.zipCode
2084: 										</a>
2085: 									#else
2086: 										$!event.address, $!event.city, $!event.stateCountry $!event.zipCode
2087: 									#end
2088: 								</div>
2089: 							#end
2090: 						</td>
2091: 					#end
2092: 
2093: 				#end ## fields loop
2094: 			</tr>
2095: 
2096: 				#foreach ($field in $scheduleFields)
2097: 					## NOTES (NEW ROW)
2098: 					#if (($field.equals("_notes") && $event.notes.length() > 0) || ($field.equals("_notes+neutralsite") && ($event.notes.length() > 0 || $event.neutralSite.length() > 0)))
2099: 					<tr class="${eventClass}" #if ($event.inProgress) title="In Progress" #end>
2100: 						<td class="py-1 align-middle">&nbsp;</td>
2101: 						<td colspan="${tool.math.sub($colCount, 1)}" class="notes py-1 text-muted small align-middle">$!event.notes #if ($field.equals("_notes+neutralsite") && $event.neutralSite.length() > 0) @ $event.neutralSite #end</td>
2102: 					</tr>
2103: 					#end
2104: 
2105: 					## LINKS (NEW ROW)
2106: 					#if ($field.equals("_links") && $event.links.size() > 0)
2107: 					<tr class="${eventClass}" #if ($event.inProgress) title="In Progress" #end>
2108: 						<td class="py-1 align-middle">&nbsp;</td>
2109: 						<td colspan="${tool.math.sub($colCount, 1)}" class="links  py-1 small align-middle">
2110: 							#printEventLinks($event, "btn btn-outline-primary btn-sm")
2111: 								$wiki.event($event)
2112: 						</td>
2113: 					</tr>
2114: 					#end
2115: 
2116: 					## NEUTRAL SITE (NEW ROW)
2117: 					#if ($field.equals("_neutralsite") && $event.neutralSite.length() > 0)
2118: 					<tr class="${eventClass}" #if ($event.inProgress) title="In Progress" #end>
2119: 						<td class="py-1 align-middle">&nbsp;</td>
2120: 						<td colspan="${tool.math.sub($colCount, 1)}" class="neutralsite  py-1 small align-middle">#if ($schedule.numericResults) @ #end $event.neutralSite</td>
2121: 					</tr>
2122: 					#end
2123: 				#end ## fields loop
2124: 
2125: 				#set ($lastDate = $theDate)
2126: 			#end ## EVENTS LOOP
2127: 		</tbody>
2128: 	</table>
2129: </div>
2130: #end
2131: 
2132: #macro (printSchedule $evts)
2133: 	#if($evts.size() == 0)
2134: 	<div class="alert alert-secondary" role="alert">
2135: 		No events are currently scheduled. Please check back soon!
2136: 	</div>
2137: 	#else
2138: 	<div class="schedule-inner#if ($enhancedLayout)-enhanced #end d-flex flex-column flex-md-row mb-3">
2139: 		<div class="schedule-events-data flex-grow-1">
2140: 			<div class="section-event-group event-group d-flex flex-column gap-3">
2141: 				#if($groupMonths)
2142: 						#printCollapsibleMonths($evts)
2143: 					#else
2144: 					#printEvents($evts, false)
2145: 				#end
2146: 			</div>
2147: 		</div>
2148: 		#if ($showTeamLeadersCarousel || $showRelatedArticles)
2149: 			<div id="sidebar" class="flex-shrink-1 col-md-4 p-md-2 col-lg-3 p-lg-3">
2150: 				#if ($rosterHeadshots.size() > 0 && $showTeamLeadersCarousel)
2151: 					$website.include("${page.sectionPage.url}/leaders?tmpl=stats-leader-carousel-template")
2152: 				#end
2153: 				#if ($showRelatedArticles)
2154: 					$website.include("${page.sectionPage.url}/news?tmpl=related-articles-template")
2155: 				#end
2156: 			</div>
2157: 		#end
2158: 	</div>
2159: 	#end
2160: #end
2161: 
2162: ## END MACROS
2163: 
2164: #set ($events = [])
2165: #set ($eventTypes = [])
2166: #set ($eventVenues = [])
2167: 
2168: #foreach ($event in $schedule.events)
2169: 	#set ($addEvent = false)
2170: 
2171: 	#if ($event.date && ($event.overall || $showExhibitionGames))
2172: 		#set ($ignoreme = $events.add($event))
2173: 
2174: 		#if ($event.postseason && !$eventTypes.contains("postseason"))
2175: 			#set ($bool = $eventTypes.add("postseason"))
2176: 		#end
2177: 
2178: 		#if ($event.conference && !$eventTypes.contains("conference"))
2179: 			#set ($bool = $eventTypes.add("conference"))
2180: 		#end
2181: 
2182: 		#if ($event.division && !$eventTypes.contains("division"))
2183: 			#set ($bool = $eventTypes.add("division"))
2184: 		#end
2185: 
2186: 		#if (!$event.overall && !$eventTypes.contains("exhibition"))
2187: 			#set ($bool = $eventTypes.add("exhibition"))
2188: 		#end
2189: 
2190: 		#if ($event.neutralSite.length() > 0 && !$eventVenues.contains("neutral"))
2191: 			#set ($bool = $eventVenues.add("neutral"))
2192: 		#elseif ($event.home && !$eventVenues.contains("home"))
2193: 			#set ($bool = $eventVenues.add("home"))
2194: 		#else
2195: 			#if (!$eventVenues.contains("away"))
2196: 				#set ($bool = $eventVenues.add("away"))
2197: 			#end
2198: 		#end
2199: 	#end
2200: #end
2201: 
2202: <div class="page-content schedule-content" data-team-schedule="$isTeamSchedule" data-schedule-type-h2h="$schedule.numericResults" data-schedule-view="${scheduleView}" data-schedule-layout="${scheduleLayout}" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/schedule-layout.js">
2203: 	$wiki
2204: 
2205: 	#set ($scheduleNoteURL = "${page.url}-note")
2206: 	#if ($website.exists($scheduleNoteURL))
2207: 		$website.include($scheduleNoteURL)
2208: 	#end
2209: 
2210: 	<div class="page-content-header d-flex flex-column align-items-center gap-3 mb-3">
2211: 		#printPageTitle()
2212:         #printFilters()
2213:         #printTeamStats()
2214:         #printEventCountdown()
2215: 	</div>
2216: 
2217: 	#if ($isSharedMeet)
2218: 		#printSharedMeet()
2219: 	#else
2220: 		#printSchedule($events)
2221: 	#end
2222: 
2223: 	#printPostSchedule()
2224: 
2225: 	#printLegends()
2226: 
2227: 	#set ($scheduleFooterURL = "${page.url}-footer")
2228: 	#if ($website.exists($scheduleFooterURL))
2229: 		<div class="schedule-footer">$website.include($scheduleFooterURL)</div>
2230: 	#end
2231: 
2232: 	#printSubscribeLinks()
2233: 
2234: 	$sfs $wiki $rss
2235: </div>
2236: 
2237: #if ($website.ads.isAdvertisingEnabled('SCHEDULE'))
2238: 	$website.includeAgain("global-adserver-slots?adSlot=schedule")
2239: #end
2240: 
2241: #if ($request.getParameter("ajax").equals("true"))
2242: 	$!request.setAttribute("decorator", "")
2243: #end
2244: 
2245: #if ($request.getAttribute("scheduleNextEvent") && $scheduleNextEventScroll)
2246: <script>
2247: 	$(document).ready(function() {
2248: 		setTimeout(function() {
2249: 			let nextEventPos = $(".schedule-next-event-indicator").offset().top;
2250: 			let headerHeight = 0;
2251: 			if ($("header.sticky-top").outerHeight() > 0) {
2252: 				headerHeight = $("header.sticky-top").outerHeight();
2253: 				nextEventPos = nextEventPos - headerHeight;
2254: 			}
2255: 			$("html, body").animate({scrollTop: nextEventPos}, 500, 'swing');
2256: 		}, 2000);
2257: 	});
2258: </script>
2259: #end
2260: 
2261: #if (!$enhancedLayout)
2262: <script>
2263: 	document.addEventListener('DOMContentLoaded', function () {
2264: 		document.querySelectorAll('.collapse').forEach(function (panel) {
2265: 			panel.addEventListener('shown.bs.collapse', function () {
2266: 				const tables = panel.querySelectorAll('table.dataTable');
2267: 
2268: 				tables.forEach(function (tableEl) {
2269: 					const $table = $(tableEl);
2270: 
2271: 					// If the table hasn't been initialized, initialize it
2272: 					if (!$table.data('dataTableInitialized')) {
2273: 						if (typeof window.initDataTable === 'function') {
2274: 							window.initDataTable($table);
2275: 						} else {
2276: 							console.warn('initDataTable function is not available');
2277: 						}
2278: 					} else {
2279: 							$table.DataTable().columns.adjust().draw();
2280: 					}
2281: 				});
2282: 			});
2283: 		});
2284: 	});
2285: </script>
2286: #end
2287: 
2288: #if ($showSpotOnAddToCal)
2289: <script>
2290: 	(function (id) {
2291: 		if (document.getElementById(id)) return;
2292: 		var so = document.createElement('script'); so.id = id; so.async = true;
2293: 		so.src = 'https://dff2h0hbfv6w4.cloudfront.net/scripts/presto.js';
2294: 		var s = document.getElementsByTagName('script')[0];
2295: 		s.parentNode.insertBefore(so, s);
2296: 	})('spoton-script');
2297: </script>
2298: #end