Skip to Main Content
ICBA
  • Member Login
  • Member Login
An error occurred while processing the template.
The following has evaluated to null or missing:
==> cpCatalogEntry  [in template "49724393377863#35335#5420685" at line 55, column 26]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: cpDefinitionId = cpCatalogEntry.getCP...  [in template "49724393377863#35335#5420685" at line 55, column 9]
----
1<#assign  
2	defaultImgMap = { 
3				 "Default": { 
4	  			   "image": "/documents/d/guest/default_logo.png", 
5		  		   "color": "gray" 
6			  	 }, 
7  				 "Livestream": { 
8	  			   "image": "/documents/d/guest/icon-desktop-svg", 
9		  		   "color": "purple" 
10			  	 }, 
11				   "Recorded":{ 
12				     "image": "/documents/d/guest/icon-play", 
13				     "color": "red" 
14  				 }, 
15	  			 "In Person":{ 
16		  		   "image": "/documents/d/guest/icon-persons", 
17			  	   "color": "green" 
18				   }, 
19				   "Download": { 
20				     "image": "/documents/d/guest/icon-download-black", 
21				     "color": "border-color" 
22  				 }, 
23  				 "Self-paced": { 
24				     "image": "/documents/d/guest/icon-mouse-white", 
25				     "color": "black" 
26				   }, 
27					 "Bank subscription": { 
28				     "image": "/documents/d/guest/icon-bank", 
29				     "color": "blue" 
30
31	}			  
32/> 
33 
34<!--Parent Assignment--> 
35<#setting url_escaping_charset='UTF-8'> 
36<#assign 
37	commerceContext = renderRequest.getAttribute("COMMERCE_CONTEXT") 
38	account = commerceContext.getAccountEntry() 
39	accountId = account.getAccountEntryId() 
40	chanelId = commerceContext.getCommerceChannelId() 
41	 
42	attendenceWebinarStructuredContentId = 1087266 
43	attendenceSeminarStructuredContentId = 237233 
44	cpeWebinarStructuredContentId = 237244 
45	cpeSeminarStructuredContentId = 1087351 
46	cpePersonStructuredContentId = 1087403 
47	cocStructuredContentId = 237255 
48	policyStructuredContentId = 237266 
49	recordingStructuredContentId = 1087301 
50	videoStructuredContentId = 1087312 
51	nasbaStructuredContentId = 1087327				  
52/> 
53 
54<#assign 
55	cpDefinitionId = cpCatalogEntry.getCPDefinitionId() 
56	productId = cpCatalogEntry.getCProductId() 
57	productName = cpCatalogEntry.getName() 
58	productShortDescription = cpCatalogEntry.getShortDescription() 
59	productDescription = cpCatalogEntry.getDescription() 
60	friendlyURL = cpContentHelper.getFriendlyURL(cpCatalogEntry, themeDisplay) 
61	defaultImageURL = cpContentHelper.getDefaultImageFileURL(accountId, cpDefinitionId) 
62	defaultImageFileVersion = cpContentHelper.getCPDefinitionImageFileVersion(cpDefinitionId, request) 
63	productDetail = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/${chanelId}/products/${productId}?accountId=${accountId}&nestedFields=categories,productSpecifications") 
64	defaultImageURL = productDetail.urlImage?replace('https://localhost', '') 
65	fileEntryIdAttr = 'data-fileentryid="' + defaultImageFileVersion.fileEntryId + '"' 
66	specifications = productDetail.productSpecifications 
67	customFields = productDetail.customFields 
68	productCategories = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/${chanelId}/products/${productId}/categories?pageSize=100") 
69	categories = productCategories.items 
70	extRefCode = productDetail.externalReferenceCode 
71	filterValue = extRefCode?url 
72	url = "/c/agendas/?fields=informationRawText,information,startTime,endTime&filter=r_productAgendaItem_CPDefinitionERC%20eq%20%27${filterValue}%27&sort=startTime" 
73	agendaData = restClient.get(url) 
74	productsku= restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/${chanelId}/products/${productId}/skus?pageSize=40") 
75	productOptions= restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/${chanelId}/products/${productId}/product-options?pageSize=40") 
76				  
77	attendenceWebinar= restClient.get("/headless-delivery/v1.0/structured-contents/${attendenceWebinarStructuredContentId}") 
78	attendenceSeminar= restClient.get("/headless-delivery/v1.0/structured-contents/${attendenceSeminarStructuredContentId}") 
79	cpeWebinar= restClient.get("/headless-delivery/v1.0/structured-contents/${cpeWebinarStructuredContentId}") 
80	cpeSeminar= restClient.get("/headless-delivery/v1.0/structured-contents/${cpeSeminarStructuredContentId}") 
81	cpePerson= restClient.get("/headless-delivery/v1.0/structured-contents/${cpePersonStructuredContentId}") 
82	coc= restClient.get("/headless-delivery/v1.0/structured-contents/${cocStructuredContentId}") 
83	policy= restClient.get("/headless-delivery/v1.0/structured-contents/${policyStructuredContentId}") 
84	recording= restClient.get("/headless-delivery/v1.0/structured-contents/${recordingStructuredContentId}") 
85	video= restClient.get("/headless-delivery/v1.0/structured-contents/${videoStructuredContentId}") 
86	nasba= restClient.get("/headless-delivery/v1.0/structured-contents/${nasbaStructuredContentId}") 
87				  
88	filter = "productId eq ${productId}" 
89	encodedFilter = filter?url 
90	contentMappingURL = "/c/productcontentlinks/?filter=" + encodedFilter 
91	contentMapping = restClient.get(contentMappingURL) 			  
92	infoObj = {} 
93	tags = productDetail.tags 
94	featuredSpecificationKeys = ["fit", "weight", "material"] 
95	eventTypeName = "" 
96	startDate = "" 
97	startTime = "" 
98	endDate = "" 
99	endTime = "" 
100	deliverymethodArray = [{"id": "", "value": ""}] 
101	audiencemethodArray = [{"id": "", "value": ""}] 
102	nasbadeliverymethodArray = [{"id": "", "value": ""}] 
103	locationAddress = "" 
104	hasSkus = "false" 
105/> 
106 
107<!-- SKU Area  --> 
108	<#assign priceFormatted = ""/> 
109	<#assign displayMapValue = {} /> 
110	<#assign displayMapName = {} /> 
111  <#assign defaultSKUKey = ''/> 
112	<#assign dropdownKeys = ["nonmember:live","nonmember:ondemand","nonmember:live-ondemand"] /> 
113	<#assign memberdropdownKeys = ["icba-member:live","icba-member:ondemand","icba-member:live-ondemand"] /> 
114	<#assign tableColumnNames = [] /> 
115	<#assign tableRowNames = [] /> 
116	<#assign numberOfOptions = 0 /> 
117  <#assign priceList = [] /> 
118	 
119	<!-- Create Option Map for multiple option products--> 
120<#assign productOptionMap = {"unlimited-webinar-pass:live": "", 
121"unlimited-webinar-pass:ondemand": "", 
122"unlimited-webinar-pass:live-ondemand": "", 
123"nonmember:live": "", 
124"nonmember:ondemand": "", 
125"nonmember:live-ondemand": "", 
126"icba-member:live": "", 
127"icba-member:ondemand": "", 
128"icba-member:live-ondemand": "", 
129"bank-director-program-subscriber:live": "", 
130"bank-director-program-subscriber:ondemand": "", 
131"bank-director-program-subscriber:live-ondemand": "", 
132"icba-bank-director-program-subscriber:live": "", 
133"icba-bank-director-program-subscriber:ondemand": "", 
134"icba-bank-director-program-subscriber:live-ondemand": ""} /> 
135	 
136<!-- Create Option Map for single Option products--> 
137<#assign productOptionMapSingle = {"unlimited-webinar-pass": "", 
138"nonmember": "", 
139"icba-member": "", 
140"bank-director-program-subscriber": "", 
141"icba-bank-director-program-subscriber": "", 
142"nonbanker": ""} /> 
143		   
144<#assign 	productskuJson = jsonFactoryUtil.createJSONObject(productsku)/>	 
145	<#if productskuJson?has_content && productskuJson.has("items")> 
146		<#assign itemsArray = productskuJson.getJSONArray("items")/> 
147<#if itemsArray?has_content && itemsArray.length() gt 0> 
148	<#assign hasSkus = "true"> 
149  <#list 0..itemsArray.length() - 1 as index> 
150		<#if itemsArray.getJSONObject(index)?has_content> 
151     <#assign item = itemsArray.getJSONObject(index) /> 
152		 <#assign price = item.price.priceFormatted> 
153         <#assign ccustomFields = item.getJSONArray("customFields") /> 
154		      <#assign urlValue = ""/> 
155          <#if ccustomFields?has_content> 
156            <#list 0..ccustomFields.length() - 1 as j> 
157              <#assign ccustomField = ccustomFields.getJSONObject(j) /> 
158							<#assign urlValue = ccustomField.getJSONObject("customValue").getString("data")/> 
159            </#list> 
160           </#if> 
161               <#assign skuOptions = item.getJSONArray("skuOptions") /> 
162                  <#if skuOptions?has_content> 
163										 <#assign nameKey = "" /> 
164										 <#assign numberOfOptions = skuOptions.length() /> 
165										<#if skuOptions.length() != 1 > 
166											<!-- Handle Product with Multiple Options to create matrix table --> 
167                     <#list 0..skuOptions.length() - 1 as i> 
168                         <#assign skuOption = skuOptions.getJSONObject(i) /> 
169											   <#assign skuOptionKey = skuOption.getString("skuOptionKey") /> 
170											    <#if skuOptionKey == "registration-options"> 
171													  <#assign skuOptionValueKey = skuOption.skuOptionValueKey /> 
172													  <#list 0..skuOptions.length() - 1 as j> 
173													    <#assign subskuOption = skuOptions.getJSONObject(j) /> 
174															<#assign subskuOptionKey = subskuOption.skuOptionKey /> 
175															<#if subskuOptionKey != skuOptionKey> 
176																<#assign displayName = subskuOption.skuOptionValueNames?remove_beginning('["')?remove_ending('"]') /> 
177																<#assign rowdisplayName = skuOption.skuOptionValueNames?remove_beginning('["')?remove_ending('"]') /> 
178																<#if !tableRowNames?seq_contains(rowdisplayName) > 
179																   <#assign tableRowNames = tableRowNames + [rowdisplayName] /> 
180																</#if> 
181																<#if !tableColumnNames?seq_contains(displayName) > 
182																   <#assign tableColumnNames = tableColumnNames + [displayName] /> 
183																</#if> 
184																<#assign priceList = priceList + [price] /> 
185																<#assign skukey = skuOptionValueKey + ":" + subskuOption.skuOptionValueKey /> 
186																<#assign productOptionMap = productOptionMap + { skukey: price }> 
187																<#assign displayName = subskuOption.skuOptionValueNames?remove_beginning('["')?remove_ending('"]') /> 
188																<#assign displayMapValue += {skukey:urlValue} /> 
189																<#assign displayMapName += {skukey:displayName} /> 
190																<#assign defaultSKUKey = skukey/> 
191															</#if> 
192													  </#list> 
193														 
194												  </#if> 
195                      </#list> 
196											<!-- Handle products with a single SKU --> 
197											<#else> 
198												<#if !tableColumnNames?seq_contains("Price") > 
199												  <#assign tableColumnNames = tableColumnNames + ["Price"] /> 
200												</#if> 
201												<#list 0..skuOptions.length() - 1 as i> 
202                         <#assign skuOption = skuOptions.getJSONObject(i) /> 
203											   <#assign skuOptionKey = skuOption.getString("skuOptionKey") /> 
204													  <#assign skuOptionValueKey = skuOption.skuOptionValueKey /> 
205																<#assign rowdisplayName = skuOption.skuOptionValueNames?remove_beginning('["')?remove_ending('"]') /> 
206																<#if !tableRowNames?seq_contains(rowdisplayName) > 
207																   <#assign tableRowNames = tableRowNames + [rowdisplayName] /> 
208																</#if> 
209																<#assign priceList = priceList + [price] /> 
210																<#assign skukey = skuOptionValueKey /> 
211																<#assign displayMapValue += {skukey:urlValue} /> 
212																<#assign displayMapName += {skukey:rowdisplayName} /> 
213													      <#assign defaultSKUKey = skukey/> 
214													      <#assign productOptionMapSingle = productOptionMapSingle + { skukey: price }> 
215                         </#list> 
216											</#if> 
217                  </#if> 
218						</#if> 
219       </#list> 
220   </#if> 
221</#if> 
222 
223<!-- Category area--> 
224<#assign isInstitute = "false" /> 
225<#assign isSeminar = "false" /> 
226<#assign isForum = "false" />			 
227<#assign isLivestream = "false" /> 
228<#assign isOnlineCourse = "false" /> 
229<#assign isInPerson = "false" /> 
230<!-- Predefine all needed variables so they persist across scopes --> 
231<#assign start = "", end = "", startDateStr = "", endDateStr = "", startTime = "", endTime = "", year = "", dateDisplay = "", timeDisplay = "", locationDisplay = "" /> 
232<#assign isWebinar = "false" /> 
233<#assign isEvent = "false" />	 
234<#assign isPerson = "false" /> 
235<#assign isPriceTypeFree = "false" />	 
236<#assign isPriceTypeSubs = "false" />	 
237<#assign isPriceTypeMB = "false" />	 
238 
239	 
240<!-- Ends --> 
241<#if categories?has_content> 
242	<#list categories as category> 
243		<#if category.vocabulary?replace(' ', '') = 'deliverymethod'> 
244			<#assign deliverymethodArray += [{"id": category.id, "value": category.name}] /> 
245			<#elseif category.vocabulary?replace(' ', '') = 'icbaaudience'> 
246			<#assign audiencemethodArray += [{"id": category.id, "value": category.name}] /> 
247			<#elseif category.vocabulary?replace(' ', '') = 'nasbadeliverymethod'> 
248			<#assign nasbadeliverymethodArray += [{"id": category.id, "value": category.name}] /> 
249		<#else> 
250			<#assign infoObj = infoObj + {category.vocabulary?replace(' ', ''): {"id": category.id, "value": category.name}} /> 
251		</#if> 
252	</#list> 
253		<#assign infoObj = infoObj + {"deliverymethod": deliverymethodArray} /> 
254		<#assign infoObj = infoObj + {"icbaaudience": audiencemethodArray} /> 
255		<#assign infoObj = infoObj + {"nasbadeliverymethod": nasbadeliverymethodArray} /> 
256</#if> 
257	 
258<#list customFields as customField> 
259	<!--  ${customField.name} --> 
260	<#assign infoObj = infoObj + {(customField.name): customField.customValue.data} /> 
261</#list> 
262			 
263<#if categories?has_content> 
264	<#list categories as category> 
265		<#if category.vocabulary = 'price type' && category.name == "Free"> 
266			    <#assign isPriceTypeFree = "true" /> 
267		</#if> 
268		<#if category.vocabulary = 'price type' && category.name == "Subscription"> 
269		    <#assign isPriceTypeSubs = "true" /> 
270		</#if> 
271		<#if category.vocabulary = 'price type' && category.name == "Member Benefit"> 
272		    <#assign isPriceTypeMB = "true" /> 
273		</#if> 
274		<#if category.vocabulary = 'delivery method' && category.name = 'In Person'> 
275		    <#assign isInPerson = "true" /> 
276		</#if> 
277		<#if category.vocabulary = 'delivery method' && category.name = 'Livestream'> 
278			  <#if infoObj["Event End Date"]?has_content> 
279					<#assign end = infoObj["Event End Date"]?datetime("yyyy-MM-dd'T'HH:mm:ss'Z'") /> 
280					<#assign today = .now?datetime> <!-- Today's date without time --> 
281						<#assign showLiveStream = end < today /> 
282						<!-- Ensure 'end' is valid before performing the comparison --> 
283						<#if !showLiveStream> 
284							<#assign isLivestream = "true" /> 
285						</#if> 
286				</#if> 
287		</#if> 
288		<#if category.vocabulary = 'event type' && category.name = 'Institute'> 
289		    <#assign isInstitute = "true" /> 
290		</#if> 
291	 
292			<#if category.vocabulary = 'event type' && category.name = 'Seminar'> 
293		    <#assign isSeminar = "true" /> 
294		</#if> 
295		<#if category.vocabulary = 'product type' && category.name = 'Webinar'> 
296		    <#assign isWebinar = "true" /> 
297		</#if> 
298		<#if category.vocabulary = 'product type' && category.name = "Online Course"> 
299			  <#assign isOnlineCourse = "true" /> 
300		</#if> 
301		<#if category.vocabulary = 'product type' && category.name == "Event"> 
302		    <#assign isEvent = "true" /> 
303		</#if> 
304		<#if category.vocabulary = 'event type'> 
305		   <#assign eventTypeName = category.name /> 
306		</#if> 
307	</#list> 
308</#if> 
309	 
310	 
311<div class="education-details-sec"> 
312   <div class="product-main-info"> 
313      <div class="top-row"> 
314				 
315         <#if infoObj.deliverymethod??> 
316         <div class="education-card-categories"> 
317            <#list infoObj.deliverymethod as format> 
318							<#if format.value != ""> 
319								<#if format.value == "Livestream"> 
320									<#if isLivestream == "true"> 
321										<span class="category"> 
322											<img src="${defaultImgMap[format.value]['image']}" alt="" class="category-img bg-${defaultImgMap[format.value]['color']}" /> 
323											<span class="category-name">${format.value}</span> 
324										</span> 
325									</#if> 
326								<#else> 
327									<span class="category"> 
328										<img src="${defaultImgMap[format.value]['image']}" alt="" class="category-img bg-${defaultImgMap[format.value]['color']}" /> 
329										<span class="category-name">${format.value}</span> 
330									</span> 
331								</#if> 
332							</#if> 
333            </#list> 
334         </div> 
335         </#if> 
336         <!-- Only display certificate if --> 
337         <#if isInstitute == "true"> 
338         <div class="certification-info"> 
339            <span class="certification-info-text">Earn Professional Certification</span> 
340            <div class="certification-info-img"><i class="certification-info-img"></i></div> 
341         </div> 
342         </#if> 
343      </div> 
344      <h1 class="product-title product-title-name header-xl">${productName}</h1> 
345		 <#if infoObj.deliverymethod??> 
346			 <#list infoObj.deliverymethod as format> 
347				 <#if format.value != ""> 
348					  <#if format.value == "In Person"> 
349							<#assign isPerson = "true"/> 
350							</#if> 
351					 </#if> 
352				 </#list> 
353			 </#if> 
354		 <#if isOnlineCourse == "true" || isWebinar == "true" || isPerson == "true" || isEvent == "true"> 
355			  <div class="meta-info"> 
356        <#-- Parse date and time -->    
357          <#if infoObj["Event Start Date"]?has_content> 
358					 
359 
360 
361 
362						 
363            <#assign start = infoObj["Event Start Date"]?datetime("yyyy-MM-dd'T'HH:mm:ss'Z'")/> 
364            <#assign startDateStr = start?string("MMM d")/> 
365            <#assign year = start?string("yyyy")/> 
366            <#assign startTime = start?string("h:mm") + " " + start?string("a")?lower_case/> 
367          </#if> 
368 
369         <#if infoObj["Event End Date"]?has_content> 
370           <#assign end = infoObj["Event End Date"]?datetime("yyyy-MM-dd'T'HH:mm:ss'Z'")/> 
371           <#assign endDateStr = end?string("MMM d")/> 
372           <#assign endTime = end?string("h:mm") + " " + end?string("a")?lower_case/> 
373          </#if> 
374      <ul> 
375        <#if isWebinar == "true" || isEvent == "true"> 
376			<#if isLivestream == "true" || isPerson == "true"> 
377			    <#if start?has_content && end?has_content> 
378				 <#if start?string("yyyyMMdd") == end?string("yyyyMMdd")> 
379					<#assign dateDisplay = startDateStr + ", " + year/> 
380					<#assign timeDisplay = startTime + "–" + endTime/> 
381				  <#else> 
382					<#assign dateDisplay = startDateStr + "–" + endDateStr + ", " + year/> 
383					<#assign timeDisplay = startTime/> 
384				 </#if> 
385					  
386				</#if> 
387				 <li>${dateDisplay}</li> 
388				 <#if isWebinar == "true"> 
389					 <li> | </li> 
390					 <li>${timeDisplay} <#if infoObj["Time Zone"]?? && infoObj["Time Zone"]?has_content>${infoObj["Time Zone"]?first}</#if></li> 
391				 </#if> 
392						<li> | </li> 
393			</#if> 
394			 
395        </#if> 
396            <#if isInPerson = "true"> 
397                <#if infoObj["Location City"]?has_content || infoObj["Location State"]?has_content> 
398						<li> 
399							</#if> 
400							<#if infoObj["Location City"]?has_content>${infoObj["Location City"]}</#if> 
401							<#if infoObj["Location State"]?has_content>, ${infoObj["Location State"]}</#if> 
402							<#if infoObj["Location City"]?has_content || infoObj["Location State"]?has_content> 
403						</li> 
404						<li> | </li> 
405				</#if> 
406             </#if> 
407            <#if isWebinar == "true"> 
408				 
409				<li class="fw-700">Webinar</li> 
410			</#if> 
411			<#if isOnlineCourse == "true"> 
412					<li class="fw-700">Online Course</li> 
413            </#if> 
414            <#if isEvent = "true"> 
415							<li class="fw-700">${eventTypeName}</li> 
416            </#if> 
417            <#if infoObj["CPE Credits"]?has_content> 
418				<li> | </li> 
419				<li class="credits-info"> 
420					<div class="education-card-credits"> 
421					   CPE Credits: ${infoObj["CPE Credits"]} 
422					</div> 
423				</li> 
424            </#if>				 
425         </ul> 
426      </div> 
427			 </#if> 
428      
429      <div class="product-summary" aria-hidden="true"> 
430         ${productDescription} 
431      </div> 
432	    <#if productDescription?has_content> 
433				<a href="#" class="btn btn-link read-more-btn">Read More</a> 
434				</#if>    
435			  
436<!-- Populate Learning Format Dropdown if Webinar with Multiple Options -->			  
437	<#if displayMapValue?has_content && dropdownKeys?? && numberOfOptions gt 1 > 
438		<#if isWebinar == "true" && !infoObj["Alternate URL"]?has_content> 
439			<div class="product-delivery-wrapper"> 
440				<label for="delivery-method" class="label">Learning Format</label> 
441				 <select class="form-control" id="delivery-method"> 
442					 <option value="">Select Learning Format</option> 
443					  
444						<#if tableRowNames?seq_contains("ICBA Member")> 
445						<#list memberdropdownKeys as k> 
446							 <#if displayMapValue[k]?? && displayMapName[k]??> 
447									<option value="${displayMapValue[k]}">${displayMapName[k]}</option> 
448							</#if> 
449					  </#list> 
450					 <#elseif tableRowNames?seq_contains("Non-Member")> 
451						 <#list dropdownKeys as k> 
452									<#if displayMapValue[k]?? && displayMapName[k]??> 
453										 <option value="${displayMapValue[k]}">${displayMapName[k]}</option> 
454									</#if> 
455						 </#list> 
456						  
457					 </#if> 
458				 </select> 
459				</div> 
460			</#if> 
461   </#if>    
462      <div class="product-delivery-ctas"> 
463				 <#if hasSkus == "true"> 
464					 <!-- Check if Alt Reg Button text is set --> 
465					 <#if !infoObj["Alternate Text"]?has_content>    
466						 <#if isWebinar == "true" || isEvent == "true"> 
467							 <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">Register Now</button> 
468						 <#elseif isPriceTypeSubs == "true"> 
469							 <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">Subscribe Now</button> 
470						 <#elseif isPriceTypeMB == "true" || isPriceTypeFree == "Free"> 
471							 <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">Access Now</button> 
472						 <#else> 
473							 <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">Buy Now</button> 
474						 </#if> 
475						 <#if isSeminar = "true" || isInstitute = "true"> 
476							 <button class="btn btn-lg btn-link icon-pdf w-100" onclick="navigateToRegForm()">Printable Registration Form</button> 
477						 </#if> 
478					<#else> 
479						<#if infoObj["Alternate Text"]?has_content>    
480						   <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">${infoObj["Alternate Text"]}</button> 
481						</#if> 
482						<#if isSeminar = "true" || isInstitute = "true"> 
483							 <button class="btn btn-lg btn-link icon-pdf w-100" onclick="navigateToRegForm()">Printable Registration Form</button> 
484						 </#if> 
485					</#if>	 
486					 
487					<!-- Check if an Alternate URL is set and use that URL --> 
488					<#if infoObj["Alternate URL"]?has_content> 
489						<#assign displayMapValue = displayMapValue + {defaultSKUKey: infoObj["Alternate URL"]}> 
490					</#if> 
491				 <#else> 
492					 <!-- Check if hubspot form should be displayed --> 
493					 <#if infoObj["Alternate URL"]?has_content> 
494						  <#assign displayMapValue = displayMapValue + {defaultSKUKey: infoObj["Alternate URL"]}> 
495							<#if !infoObj["Alternate Text"]?has_content>    
496								 <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">Register Now</button> 
497							<#else> 
498								 <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">${infoObj["Alternate Text"]}</button> 
499						  </#if> 
500					 <#else> 
501						 <div class="hubspot-form-wrap"> 
502							 <p><strong> 
503								 This event is not currently available, please provide your contact information if you wish to be notified when it becomes available. 
504							 </strong></p> 
505							<script> 
506								hbspt.forms.create({ 
507									portalId: "5005401", 
508									formId: "0865c866-46eb-4be6-944a-fb19a76a7a68", 
509								}); 
510								window.addEventListener('hs-form-event:on-ready', function(event) {  
511								HubSpotFormsV4.getFormFromEvent(event).setFieldValue('0-1/hidden_event_url', window.location.href);  
512								}); 
513							</script> 
514							</div> 
515					 </#if> 
516				 </#if> 
517      </div> 
518   </div> 
519   <!-- Agenda --> 
520   <#if isWebinar == "true" || isEvent == "true">	 
521   <#if infoObj["AgendaId"]?has_content> 
522<#assign agendaString = infoObj["AgendaId"]?string/> 
523<@liferay_journal["journal-article"] 
524		              articleId="${agendaString}" 
525		              ddmTemplateKey="728470" 
526		              groupId=45248 
527	             /> 
528</#if> 
529   </#if>								 
530   <!-- Pricing --> 
531	<#if isPriceTypeFree != "true" && (priceList?? && (priceList?size > 0))> 
532   <div class="product-info-wrapper product-pricing-info"> 
533      <h2 class="product-info-title"><button type="button" data-bs-toggle="collapse" 
534         data-bs-target="#pricing-div" role="button" aria-expanded="true" 
535         aria-controls="pricing-div">Pricing</button></h2> 
536      <div class="product-info-div collapse show" id="pricing-div"> 
537         <div class="table-responsive"> 
538            <#assign columnSize = tableColumnNames?size /> 
539	          <#assign tableRowIndex = 0 /> 
540					  <#if numberOfOptions == 2> 
541							<table class="table custom-table"> 
542								<thead> 
543									<tr> 
544										<th>Audience</th> 
545										<th>Live </th> 
546										<th>Recorded </th> 
547										<th>Live + Recorded </th> 
548									</tr> 
549								</thead> 
550							<tbody> 
551									<tr> 
552										<td> 
553											<h3>ICBA Member</h3> 
554										</td> 
555										<td>${productOptionMap["icba-member:live"]}</td> 
556										<td>${productOptionMap["icba-member:ondemand"]}</td> 
557										<td>${productOptionMap["icba-member:live-ondemand"]}</td> 
558									</tr> 
559 
560									<tr> 
561										<td> 
562											<h3>Non-Member</h3> 
563										</td> 
564										<td>${productOptionMap["nonmember:live"]}</td> 
565										<td>${productOptionMap["nonmember:ondemand"]}</td> 
566										<td>${productOptionMap["nonmember:live-ondemand"]}</td> 
567									</tr> 
568 
569									<tr> 
570										<td> 
571											<h3>Unlimited Webinar Pass</h3> 
572										</td> 
573										<td>${productOptionMap["unlimited-webinar-pass:live"]}</td> 
574										<td>${productOptionMap["unlimited-webinar-pass:ondemand"]}</td> 
575										<td>${productOptionMap["unlimited-webinar-pass:live-ondemand"]}</td> 
576									</tr> 
577								</tbody> 
578 
579							</table> 
580						<#else> 
581								<table class="table custom-table"> 
582									 <thead> 
583											<tr> 
584												 <th>Audience</th> 
585												 <#list tableColumnNames as columnName > 
586											 			<th> ${columnName} <!--<i class="icon-info"></i>--></th> 
587										 		 </#list> 
588											</tr> 
589									 </thead> 
590									 <tbody> 
591										 <#if priceList?? && (priceList?size > 0) > 
592												<#if tableRowNames?seq_contains("ICBA Member")> 
593													<tr> 
594													<td> 
595														 <h3>ICBA Member</h3> 
596													 </td> 
597													<td> 
598														${productOptionMapSingle["icba-member"]}  
599													</td> 
600													</tr> 
601												</#if> 
602												<#if tableRowNames?seq_contains("Non-Member")> 
603													<tr> 
604													<td> 
605														 <h3>Non-Member</h3> 
606													 </td> 
607													<td> 
608														${productOptionMapSingle["nonmember"]}  
609													</td> 
610													</tr> 
611												</#if> 
612												<#if tableRowNames?seq_contains("Non-Banker*")> 
613													<tr> 
614													<td> 
615														 <h3>Non-Banker*</h3> 
616													 </td> 
617													<td> 
618														${productOptionMapSingle["nonbanker"]}  
619													</td> 
620													</tr> 
621												</#if> 
622												<#if tableRowNames?seq_contains("ICBA Bank Director Program Subscriber")> 
623													<tr> 
624													<td> 
625														 <h3>ICBA Bank Director Program Subscriber</h3> 
626													 </td> 
627													<td> 
628														${productOptionMapSingle["icba-bank-director-program-subscriber"]}  
629													</td> 
630													</tr> 
631												</#if> 
632												<#if tableRowNames?seq_contains("Unlimited Webinar Pass")> 
633													<tr> 
634													<td> 
635														 <h3>Unlimited Webinar Pass</h3> 
636													 </td> 
637													<td> 
638														${productOptionMapSingle["unlimited-webinar-pass"]}  
639													</td> 
640													</tr> 
641												</#if> 
642													  
643										 <#list tableRowNames as row> 
644											 <#if row != "ICBA Bank Director Program Subscriber" && 
645														row != "ICBA Member" && 
646														row != "Non-Member" && 
647														row != "Non-Banker*" && 
648														row != "Unlimited Webinar Pass" > 
649												 <tr> 
650													 <td> 
651														 <h3>${row}</h3> 
652													 </td> 
653 
654													 <td> 
655														 ${priceList[tableRowIndex]} 
656													 </td> 
657													  
658												 </tr> 
659												</#if> 
660											  <#assign tableRowIndex++/> 
661										</#list> 
662									</#if> 
663								</tbody> 
664							</table> 
665					</#if> 
666   </div> 
667	    <#if isForum = "true"> 
668         <div class="mb-20"> 
669            <a class="btn btn-link icon-pdf btn-arrow-right" href="/documents/d/asset-library-45247/icba-education-registration-form">Printable Registration Form</a> 
670            <a class="btn btn-link btn-arrow-right" href="https://myicba.icba.org/eweb/dynamicpage.aspx?webcode=CSCBundles&Action=Add&cst_key=00000000-0000-0000-0000-000000000000&ObjectKeyFrom=1A83491A-9853-4C87-86A4-F7D95601C2E2&DoNotSave=Yes&DoNotAdd=Yes&ParentObject=CentralizedOrderEntry&ParentDataObject=Order%20Entry%20Bundle&key=271A2B6B-EE9F-4ACD-BB61-B9B9076B0BA2">Register for all four of the 2025 Bank 
671            Director Forums</a> 
672         </div> 
673	    </#if> 
674	  
675   <div class="disclaimer"> 
676		 <#if isSeminar = "true" || isInstitute = "true" || isWebinar = "true"> 
677           <!-- <p> 
678               <#if tableRowNames?seq_contains("Non-Banker*")>* Attendance may be subject to ICBA approval. </#if> 
679							<br/>For attendance and cancellation policies see Disclaimers 
680            </p> 
681--> 
682			 <p> 
683               *Attendance may be subject to ICBA approval.  
684							<br/>For attendance and cancellation policies see Disclaimers 
685            </p> 
686			 </#if> 
687         </div> 
688      </div> 
689   </div> 
690	</#if> 
691   <!-- Location --> 
692   <#if isInPerson == "true"> 
693   <div class="product-info-wrapper product-location-info"> 
694      <h2 class="product-info-title"><button type="button" data-bs-toggle="collapse" 
695         data-bs-target="#location-div" role="button" aria-expanded="true" 
696         aria-controls="location-div">Location</button></h2> 
697      <div class="product-info-div collapse show" id="location-div"> 
698         <div class="row"> 
699					 <#assign columnTwo = 'col-md-12' /> 
700                  <#if infoObj["Location Image"]?has_content> 
701					 <#assign columnTwo = 'col-md-8' /> 
702            <div class="col-md-4"> 
703               <div class="location-image"> 
704               <div class="slider-carousel-wrapper" data-slick-slider-wrapper="true"> 
705                  <div data-slick-slider="true" data-infinite="false" data-slides-to-show="1" 
706                     data-slides-to-scroll="1" data-fade="true"> 
707                     <div> 
708                  <img src="${infoObj["Location Image"]}" alt="" class="img-fluid" /> 
709                     </div> 
710                  </div> 
711               </div> 
712            </div> 
713               </div> 
714                  </#if>	 
715            <div class="${columnTwo}"> 
716               <h3 class="location-title"> 
717                  <#if infoObj["Location Name"]?has_content> 
718                  ${infoObj["Location Name"]} 
719                  </#if>	 
720               </h3> 
721               <p class="location-address"> 
722                  <#if infoObj["Location Address"]?has_content> 
723                  ${infoObj["Location Address"]} 
724                  </#if>	 
725                  <#if infoObj["Location City"]?has_content> 
726                  ${infoObj["Location City"]} 
727                  </#if>	 
728                  <#if infoObj["Location State"]?has_content> 
729                  ${infoObj["Location State"]} 
730                  </#if> 
731               </p> 
732               <p class="location-summary"> 
733                  <#if infoObj["Location Description"]?has_content> 
734                  ${infoObj["Location Description"]} 
735                  </#if> 
736               </p> 
737					 
738               
739             
740            </div> 
741         </div> 
742				 <div class="mt-3"> 
743                  <#if infoObj["Booking Link"]?has_content> 
744                  <a href="${infoObj["Booking Link"]}" class="btn btn-primary btn-lg btn-arrow-right" target="_blank">ICBA Booking Link</a> 
745                  </#if> 
746          </div> 
747		     
748         <div class="disclaimer"> 
749            <p> 
750               <#if infoObj["Location Disclaimer"]?has_content> 
751               ${infoObj["Location Disclaimer"]} 
752               </#if> 
753            </p> 
754         </div> 
755      </div> 
756   </div> 
757   </#if> 
758   <!-- End -->								  
759   <!-- Who should Attend --> 
760 <#if isWebinar == "true" || isEvent == "true"> 
761	 <div class="product-info-wrapper product-attendees-info"> 
762      <h2 class="product-info-title"><button type="button" data-bs-toggle="collapse" 
763         data-bs-target="#attendees-div" role="button" aria-expanded="true" 
764         aria-controls="attendees-div">Who Should Participate</button></h2> 
765      <div class="product-info-div collapse show" id="attendees-div"> 
766         <div class="table-responsive"> 
767            <table class="table custom-table"> 
768               <tbody> 
769                  <tr> 
770                     <td> 
771                        <p><strong>Who should attend: </strong></p> 
772                     </td> 
773                     <td> 
774                             <#if infoObj.icbaaudience?? && infoObj.icbaaudience?size gt 0> 
775                                <#assign formatList = []> 
776                                    <#list infoObj.icbaaudience as format> 
777                                       <#if format.value?has_content> 
778                                          <#assign formatList += [format.value]> 
779                                       </#if> 
780                                    </#list> 
781                                 ${formatList?join(", ")} 
782                              </#if> 
783                     </td> 
784                  </tr> 
785                  <tr> 
786                     <td> 
787                        <p><strong>Prerequisites:</strong></p> 
788                     </td> 
789                     <td> 
790                        <#if infoObj["Prerequisites"]?has_content> 
791                        <p>${infoObj["Prerequisites"]}</p> 
792                        </#if>	 
793                     </td> 
794                  </tr> 
795                  <tr> 
796                     <td> 
797                        <p><strong>Advanced Preparation:</strong></p> 
798                     </td> 
799                     <td> 
800                        <#if infoObj["Advanced Preparation"]?has_content> 
801                        <p>${infoObj["Advanced Preparation"]}</p> 
802                        </#if>	 
803                     </td> 
804                  </tr> 
805                  <tr> 
806                     <td> 
807                        <p><strong>Program Level:</strong></p> 
808                     </td> 
809                     <td> 
810                        <#if infoObj["Program Level"]?has_content> 
811                        <p>${infoObj["Program Level"]}</p> 
812                        </#if>	 
813                     </td> 
814                  </tr> 
815                  <tr> 
816                     <td> 
817                        <p><strong>Field of Study:</strong></p> 
818                     </td> 
819                     <td> 
820                        <#if infoObj["Field of Study"]?has_content> 
821                        <p>${infoObj["Field of Study"]}</p> 
822                        </#if>	 
823                     </td> 
824                  </tr> 
825                  <tr> 
826                     <td> 
827                        <p><strong>Delivery Method:</strong></p> 
828                     </td> 
829                     <td> 
830                        <#if infoObj.nasbadeliverymethod?? && infoObj.nasbadeliverymethod?size gt 0> 
831                        <#assign formatList = []> 
832                        <#list infoObj.nasbadeliverymethod as format> 
833                        <#if format.value?has_content> 
834                        <#assign formatList += [format.value]> 
835                        </#if> 
836                        </#list> 
837                        ${formatList?join(", ")} 
838                        </#if> 
839                     </td> 
840                  </tr> 
841                  <tr> 
842                     <td> 
843                        <p><strong>Continuing Professional<br />Education (CPE) Credit Hours:</strong></p> 
844                     </td> 
845                     <td> 
846                        <#if infoObj["CPE Credits"]?has_content> 
847                        <p>${infoObj["CPE Credits"]} hrs</p> 
848                        </#if>	 
849                     </td> 
850                  </tr> 
851               </tbody> 
852            </table> 
853         </div> 
854      </div> 
855   </div> 
856	 </#if> 
857    
858   <!-- Instructor --> 
859<#if isWebinar == "true" || isEvent == "true"> 
860	<#if infoObj["InstructorId"]?has_content> 
861	<div class="product-info-wrapper product-instructors-info"> 
862      <h2 class="product-info-title"><button type="button" data-bs-toggle="collapse" 
863         data-bs-target="#instructors-div" role="button" aria-expanded="true" 
864         aria-controls="instructors-div">Instructors</button></h2> 
865      <div class="product-info-div collapse show" id="instructors-div"> 
866         <div class="row"> 
867				 <!-- Article Structure Type --> 
868            <#assign instructorString = infoObj["InstructorId"]?string/> 
869            <#assign instructorIdList = instructorString?split(",")/> 
870					 <#list instructorIdList as iid> 
871						 <div class="col-md-6"> 
872	             <@liferay_journal["journal-article"] 
873		              articleId="${iid}" 
874		              ddmTemplateKey="716972" 
875		              groupId=45248 
876	             /> 
877						 </div> 
878            </#list> 
879         </div> 
880      </div> 
881   </div> 
882	</#if> 
883   </#if> 
884   <!--End--> 
885   <!-- Disclaimers --> 
886	   <#if isWebinar == "true" || isEvent == "true" || isPerson == "true"> 
887			  <div class="product-info-wrapper product-disclaimers-info"> 
888            <h2 class="product-info-title"> 
889							<button type="button" data-bs-toggle="collapse" data-bs-target="#disclaimers-div" role="button" aria-expanded="true" aria-controls="disclaimers-div">Disclaimers</button> 
890					  </h2> 
891               <div class="product-info-div collapse show" id="disclaimers-div"> 
892                     <h3>Attendance and Cancellation Policy</h3> 
893                         <#-- Loop through contentFields to get the "content" field --> 
894                         <#if isSeminar == "true" || isInstitute == "true"> 
895													 		<#list attendenceSeminar.contentFields as field> 
896                                <#if field.name == "content"> 
897                                     ${htmlUtil.unescape(field.contentFieldValue.data)} 
898                                 </#if> 
899                             </#list> 
900													 </#if>  
901                         <#if isWebinar == "true"> 
902													 		<#list attendenceWebinar.contentFields as field> 
903                                <#if field.name == "content"> 
904                                     ${htmlUtil.unescape(field.contentFieldValue.data)} 
905                                 </#if> 
906                             </#list> 
907													 </#if>  
908         
909													 <hr /> 
910													  
911                       <h3>Continuing Professional Education Credit (CPE) Requirements</h3> 
912                           <#if isSeminar == "true" || isInstitute == "true" && isPerson=="false"> 
913													    <#list cpeSeminar.contentFields as cpefield> 
914                                 <#if cpefield.name == "content"> 
915                                    ${htmlUtil.unescape(cpefield.contentFieldValue.data)} 
916                                 </#if> 
917                                </#list> 
918														 </#if> 
919												  <#if isWebinar == "true"> 
920													    <#list cpeWebinar.contentFields as cpefield> 
921                                 <#if cpefield.name == "content"> 
922                                    ${htmlUtil.unescape(cpefield.contentFieldValue.data)} 
923                                 </#if> 
924                                </#list> 
925														 </#if> 
926	                        <#if isPerson == "true"> 
927													    <#list cpePerson.contentFields as cpefield> 
928                                 <#if cpefield.name == "content"> 
929                                    ${htmlUtil.unescape(cpefield.contentFieldValue.data)} 
930                                 </#if> 
931                                </#list> 
932														 </#if>												  
933													 <hr /> 
934          
935										<h3>${coc.title}</h3> 
936                        <#list coc.contentFields as cocfield> 
937                            <#if cocfield.name == "content"> 
938                                ${htmlUtil.unescape(cocfield.contentFieldValue.data)} 
939                            </#if> 
940                        </#list> 
941                    <a href="/code-of-conduct">Read Full Policy</a> 
942                      
943											<hr /> 
944        
945								<h3>${policy.title}</h3> 
946                     <#list policy.contentFields as policyfield> 
947                         <#if policyfield.name == "content"> 
948                             ${htmlUtil.unescape(policyfield.contentFieldValue.data)} 
949                          </#if> 
950                      </#list> 
951													 											<hr /> 
952        
953								<h3>${recording.title}</h3> 
954                     <#list recording.contentFields as recordingfield> 
955                         <#if recordingfield.name == "content"> 
956                             ${htmlUtil.unescape(recordingfield.contentFieldValue.data)} 
957                          </#if> 
958                      </#list> 
959													 											 											<hr /> 
960        
961								<h3>${video.title}</h3> 
962                     <#list video.contentFields as videofield> 
963                         <#if videofield.name == "content"> 
964                             ${htmlUtil.unescape(videofield.contentFieldValue.data)} 
965                          </#if> 
966                      </#list> 
967													 													 											 											<hr /> 
968        
969								<h3>${nasba.title}</h3> 
970                     <#list nasba.contentFields as nasbafield> 
971                         <#if nasbafield.name == "content"> 
972                             ${htmlUtil.unescape(nasbafield.contentFieldValue.data)} 
973                          </#if> 
974                      </#list> 
975               </div> 
976            </div> 
977			 </#if> 
978  </div> 
979	  
980   <!-- End -->		 
981<#if hasSkus == "true" || infoObj["Alternate URL"]?has_content> 
982	 <script> 
983		 function navigateToRegistration(){ 
984	     var defaultURL = '${displayMapValue[defaultSKUKey]}'; 
985			  
986			 var deliveryMethod = document.getElementById("delivery-method"); 
987			 if(deliveryMethod){ 
988         defaultURL = deliveryMethod.value; 
989
990		   window.location.href = defaultURL; 
991
992	 </script> 
993</#if> 
994<!-- Handle Registration Form button click -->	  
995<script> 
996		 function navigateToRegForm(){ 
997 
998			 window.open('/documents/d/asset-library-45247/icba-education-registration-form', '_blank'); 
999
1000	 </script> 
1001	  
1002<#if isWebinar == "true" && numberOfOptions gt 1 && !infoObj["Alternate URL"]?has_content> 
1003<script> 
1004	 
1005		const delveryMethodSelect = document.getElementById('delivery-method'); 
1006	  const registrationButton = document.getElementById('productRegistrationBtn'); 
1007    registrationButton.classList.add("disabled"); 
1008	  if(delveryMethodSelect){ 
1009			delveryMethodSelect.onchange = function() { 
1010				const selectedValue = delveryMethodSelect.value; 
1011				 
1012				if(selectedValue){ 
1013					 registrationButton.classList.remove("disabled"); 
1014				} else { 
1015						registrationButton.classList.add("disabled"); 
1016
1017
1018		}; 
1019 
1020</script> 
1021</#if>