Skip to Main Content
ICBA
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#234150" 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#234150" 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            <#assign start = infoObj["Event Start Date"]?datetime("yyyy-MM-dd'T'HH:mm:ss'Z'")/> 
359            <#assign startDateStr = start?string("MMM d")/> 
360            <#assign year = start?string("yyyy")/> 
361            <#assign startTime = start?string("h:mm") + " " + start?string("a")?lower_case/> 
362          </#if> 
363 
364         <#if infoObj["Event End Date"]?has_content> 
365           <#assign end = infoObj["Event End Date"]?datetime("yyyy-MM-dd'T'HH:mm:ss'Z'")/> 
366           <#assign endDateStr = end?string("MMM d")/> 
367           <#assign endTime = end?string("h:mm") + " " + end?string("a")?lower_case/> 
368          </#if> 
369      <ul> 
370        <#if isWebinar == "true" || isEvent == "true"> 
371			<#if isLivestream == "true" || isPerson == "true"> 
372			    <#if start?has_content && end?has_content> 
373				 <#if start?string("yyyyMMdd") == end?string("yyyyMMdd")> 
374					<#assign dateDisplay = startDateStr + ", " + year/> 
375					<#assign timeDisplay = startTime + "–" + endTime/> 
376				  <#else> 
377					<#assign dateDisplay = startDateStr + "–" + endDateStr + ", " + year/> 
378					<#assign timeDisplay = startTime/> 
379				 </#if> 
380					  
381				</#if> 
382				 <li>${dateDisplay}</li> 
383				 <#if isWebinar == "true"> 
384					 <li> | </li> 
385					 <li>${timeDisplay} <#if infoObj["Time Zone"]?? && infoObj["Time Zone"]?has_content>${infoObj["Time Zone"]?first}</#if></li> 
386				 </#if> 
387						<li> | </li> 
388			</#if> 
389			 
390        </#if> 
391            <#if isInPerson = "true"> 
392                <#if infoObj["Location City"]?has_content || infoObj["Location State"]?has_content> 
393						<li> 
394							</#if> 
395							<#if infoObj["Location City"]?has_content>${infoObj["Location City"]}</#if> 
396							<#if infoObj["Location State"]?has_content>, ${infoObj["Location State"]}</#if> 
397							<#if infoObj["Location City"]?has_content || infoObj["Location State"]?has_content> 
398						</li> 
399						<li> | </li> 
400				</#if> 
401             </#if> 
402            <#if isWebinar == "true"> 
403				 
404				<li class="fw-700">Webinar</li> 
405			</#if> 
406			<#if isOnlineCourse == "true"> 
407					<li class="fw-700">Online Course</li> 
408            </#if> 
409            <#if isEvent = "true"> 
410							<li class="fw-700">${eventTypeName}</li> 
411            </#if> 
412            <#if infoObj["CPE Credits"]?has_content> 
413				<li> | </li> 
414				<li class="credits-info"> 
415					<div class="education-card-credits"> 
416					   CPE Credits: ${infoObj["CPE Credits"]} 
417					</div> 
418				</li> 
419            </#if>				 
420         </ul> 
421      </div> 
422			 </#if> 
423      
424      <div class="product-summary" aria-hidden="true"> 
425         ${productDescription} 
426      </div> 
427	    <#if productDescription?has_content> 
428				<a href="#" class="btn btn-link read-more-btn">Read More</a> 
429				</#if>    
430			  
431<!-- Populate Learning Format Dropdown if Webinar with Multiple Options -->			  
432	<#if displayMapValue?has_content && dropdownKeys?? && numberOfOptions gt 1 > 
433		<#if isWebinar == "true" && !infoObj["Alternate URL"]?has_content> 
434			<div class="product-delivery-wrapper"> 
435				<label for="delivery-method" class="label">Learning Format</label> 
436				 <select class="form-control" id="delivery-method"> 
437					 <option value="">Select Learning Format</option> 
438					  
439						<#if tableRowNames?seq_contains("ICBA Member")> 
440						<#list memberdropdownKeys as k> 
441							 <#if displayMapValue[k]?? && displayMapName[k]??> 
442									<option value="${displayMapValue[k]}">${displayMapName[k]}</option> 
443							</#if> 
444					  </#list> 
445					 <#elseif tableRowNames?seq_contains("Non-Member")> 
446						 <#list dropdownKeys as k> 
447									<#if displayMapValue[k]?? && displayMapName[k]??> 
448										 <option value="${displayMapValue[k]}">${displayMapName[k]}</option> 
449									</#if> 
450						 </#list> 
451						  
452					 </#if> 
453				 </select> 
454				</div> 
455			</#if> 
456   </#if>    
457      <div class="product-delivery-ctas"> 
458				 <#if hasSkus == "true"> 
459					 <!-- Check if Alt Reg Button text is set --> 
460					 <#if !infoObj["Alternate Text"]?has_content>    
461						 <#if isWebinar == "true" || isEvent == "true"> 
462							 <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">Register Now</button> 
463						 <#elseif isPriceTypeSubs == "true"> 
464							 <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">Subscribe Now</button> 
465						 <#elseif isPriceTypeMB == "true" || isPriceTypeFree == "Free"> 
466							 <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">Access Now</button> 
467						 <#else> 
468							 <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">Buy Now</button> 
469						 </#if> 
470						 <#if isSeminar = "true" || isInstitute = "true"> 
471							 <button class="btn btn-lg btn-link icon-pdf w-100" onclick="navigateToRegForm()">Printable Registration Form</button> 
472						 </#if> 
473					<#else> 
474						<#if infoObj["Alternate Text"]?has_content>    
475						   <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">${infoObj["Alternate Text"]}</button> 
476						</#if> 
477						<#if isSeminar = "true" || isInstitute = "true"> 
478							 <button class="btn btn-lg btn-link icon-pdf w-100" onclick="navigateToRegForm()">Printable Registration Form</button> 
479						 </#if> 
480					</#if>	 
481					 
482					<!-- Check if an Alternate URL is set and use that URL --> 
483					<#if infoObj["Alternate URL"]?has_content> 
484						<#assign displayMapValue = displayMapValue + {defaultSKUKey: infoObj["Alternate URL"]}> 
485					</#if> 
486				 <#else> 
487					 <!-- Check if hubspot form should be displayed --> 
488					 <#if infoObj["Alternate URL"]?has_content> 
489						  <#assign displayMapValue = displayMapValue + {defaultSKUKey: infoObj["Alternate URL"]}> 
490							<#if !infoObj["Alternate Text"]?has_content>    
491								 <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">Register Now</button> 
492							<#else> 
493								 <button id="productRegistrationBtn" class="btn btn-lg btn-primary btn-arrow-right w-100" onclick="navigateToRegistration()">${infoObj["Alternate Text"]}</button> 
494						  </#if> 
495					 <#else> 
496						 <div class="hubspot-form-wrap"> 
497							 <p> 
498								 This is not currently available, please provide your contact information if you wish to be notified when it becomes available. 
499							 </p> 
500							<script> 
501								hbspt.forms.create({ 
502									portalId: "5005401", 
503									formId: "0865c866-46eb-4be6-944a-fb19a76a7a68", 
504								}); 
505								window.addEventListener('hs-form-event:on-ready', function(event) {  
506								HubSpotFormsV4.getFormFromEvent(event).setFieldValue('0-1/hidden_event_url', window.location.href);  
507								}); 
508							</script> 
509							</div> 
510					 </#if> 
511				 </#if> 
512      </div> 
513   </div> 
514   <!-- Agenda --> 
515   <#if isWebinar == "true" || isEvent == "true">	 
516   <#if infoObj["AgendaId"]?has_content> 
517<#assign agendaString = infoObj["AgendaId"]?string/> 
518<@liferay_journal["journal-article"] 
519		              articleId="${agendaString}" 
520		              ddmTemplateKey="728470" 
521		              groupId=45248 
522	             /> 
523</#if> 
524   </#if>								 
525   <!-- Pricing --> 
526	<#if isPriceTypeFree != "true" && (priceList?? && (priceList?size > 0))> 
527   <div class="product-info-wrapper product-pricing-info"> 
528      <h2 class="product-info-title"><button type="button" data-bs-toggle="collapse" 
529         data-bs-target="#pricing-div" role="button" aria-expanded="true" 
530         aria-controls="pricing-div">Pricing</button></h2> 
531      <div class="product-info-div collapse show" id="pricing-div"> 
532         <div class="table-responsive"> 
533            <#assign columnSize = tableColumnNames?size /> 
534	          <#assign tableRowIndex = 0 /> 
535					  <#if numberOfOptions == 2> 
536							<table class="table custom-table"> 
537								<thead> 
538									<tr> 
539										<th>Audience</th> 
540										<th>Live </th> 
541										<th>Recorded </th> 
542										<th>Live + Recorded </th> 
543									</tr> 
544								</thead> 
545							<tbody> 
546									<tr> 
547										<td> 
548											<h3>ICBA Member</h3> 
549										</td> 
550										<td>${productOptionMap["icba-member:live"]}</td> 
551										<td>${productOptionMap["icba-member:ondemand"]}</td> 
552										<td>${productOptionMap["icba-member:live-ondemand"]}</td> 
553									</tr> 
554 
555									<tr> 
556										<td> 
557											<h3>Non-Member</h3> 
558										</td> 
559										<td>${productOptionMap["nonmember:live"]}</td> 
560										<td>${productOptionMap["nonmember:ondemand"]}</td> 
561										<td>${productOptionMap["nonmember:live-ondemand"]}</td> 
562									</tr> 
563 
564									<tr> 
565										<td> 
566											<h3>Unlimited Webinar Pass</h3> 
567										</td> 
568										<td>${productOptionMap["unlimited-webinar-pass:live"]}</td> 
569										<td>${productOptionMap["unlimited-webinar-pass:ondemand"]}</td> 
570										<td>${productOptionMap["unlimited-webinar-pass:live-ondemand"]}</td> 
571									</tr> 
572								</tbody> 
573 
574							</table> 
575						<#else> 
576								<table class="table custom-table"> 
577									 <thead> 
578											<tr> 
579												 <th>Audience</th> 
580												 <#list tableColumnNames as columnName > 
581											 			<th> ${columnName} <!--<i class="icon-info"></i>--></th> 
582										 		 </#list> 
583											</tr> 
584									 </thead> 
585									 <tbody> 
586										 <#if priceList?? && (priceList?size > 0) > 
587												<#if tableRowNames?seq_contains("ICBA Member")> 
588													<tr> 
589													<td> 
590														 <h3>ICBA Member</h3> 
591													 </td> 
592													<td> 
593														${productOptionMapSingle["icba-member"]}  
594													</td> 
595													</tr> 
596												</#if> 
597												<#if tableRowNames?seq_contains("Non-Member")> 
598													<tr> 
599													<td> 
600														 <h3>Non-Member</h3> 
601													 </td> 
602													<td> 
603														${productOptionMapSingle["nonmember"]}  
604													</td> 
605													</tr> 
606												</#if> 
607												<#if tableRowNames?seq_contains("Non-Banker*")> 
608													<tr> 
609													<td> 
610														 <h3>Non-Banker*</h3> 
611													 </td> 
612													<td> 
613														${productOptionMapSingle["nonbanker"]}  
614													</td> 
615													</tr> 
616												</#if> 
617												<#if tableRowNames?seq_contains("ICBA Bank Director Program Subscriber")> 
618													<tr> 
619													<td> 
620														 <h3>ICBA Bank Director Program Subscriber</h3> 
621													 </td> 
622													<td> 
623														${productOptionMapSingle["icba-bank-director-program-subscriber"]}  
624													</td> 
625													</tr> 
626												</#if> 
627												<#if tableRowNames?seq_contains("Unlimited Webinar Pass")> 
628													<tr> 
629													<td> 
630														 <h3>Unlimited Webinar Pass</h3> 
631													 </td> 
632													<td> 
633														${productOptionMapSingle["unlimited-webinar-pass"]}  
634													</td> 
635													</tr> 
636												</#if> 
637													  
638										 <#list tableRowNames as row> 
639											 <#if row != "ICBA Bank Director Program Subscriber" && 
640														row != "ICBA Member" && 
641														row != "Non-Member" && 
642														row != "Non-Banker*" && 
643														row != "Unlimited Webinar Pass" > 
644												 <tr> 
645													 <td> 
646														 <h3>${row}</h3> 
647													 </td> 
648 
649													 <td> 
650														 ${priceList[tableRowIndex]} 
651													 </td> 
652													  
653												 </tr> 
654												</#if> 
655											  <#assign tableRowIndex++/> 
656										</#list> 
657									</#if> 
658								</tbody> 
659							</table> 
660					</#if> 
661   </div> 
662	    <#if isForum = "true"> 
663         <div class="mb-20"> 
664            <a class="btn btn-link icon-pdf btn-arrow-right" href="/documents/d/asset-library-45247/icba-education-registration-form">Printable Registration Form</a> 
665            <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 
666            Director Forums</a> 
667         </div> 
668	    </#if> 
669	  
670   <div class="disclaimer"> 
671		 <#if isSeminar = "true" || isInstitute = "true" || isWebinar = "true"> 
672            <p> 
673               <#if tableRowNames?seq_contains("Non-Banker*")>* Attendance may be subject to ICBA approval. </#if> 
674							<br/>For attendance and cancellation policies see Disclaimers 
675            </p> 
676			 </#if> 
677         </div> 
678      </div> 
679   </div> 
680	</#if> 
681   <!-- Location --> 
682   <#if isInPerson == "true"> 
683   <div class="product-info-wrapper product-location-info"> 
684      <h2 class="product-info-title"><button type="button" data-bs-toggle="collapse" 
685         data-bs-target="#location-div" role="button" aria-expanded="true" 
686         aria-controls="location-div">Location</button></h2> 
687      <div class="product-info-div collapse show" id="location-div"> 
688         <div class="row"> 
689					 <#assign columnTwo = 'col-md-12' /> 
690                  <#if infoObj["Location Image"]?has_content> 
691					 <#assign columnTwo = 'col-md-8' /> 
692            <div class="col-md-4"> 
693               <div class="location-image"> 
694               <div class="slider-carousel-wrapper" data-slick-slider-wrapper="true"> 
695                  <div data-slick-slider="true" data-infinite="false" data-slides-to-show="1" 
696                     data-slides-to-scroll="1" data-fade="true"> 
697                     <div> 
698                  <img src="${infoObj["Location Image"]}" alt="" class="img-fluid" /> 
699                     </div> 
700                  </div> 
701               </div> 
702            </div> 
703               </div> 
704                  </#if>	 
705            <div class="${columnTwo}"> 
706               <h3 class="location-title"> 
707                  <#if infoObj["Location Name"]?has_content> 
708                  ${infoObj["Location Name"]} 
709                  </#if>	 
710               </h3> 
711               <p class="location-address"> 
712                  <#if infoObj["Location Address"]?has_content> 
713                  ${infoObj["Location Address"]} 
714                  </#if>	 
715                  <#if infoObj["Location City"]?has_content> 
716                  ${infoObj["Location City"]} 
717                  </#if>	 
718                  <#if infoObj["Location State"]?has_content> 
719                  ${infoObj["Location State"]} 
720                  </#if> 
721               </p> 
722               <p class="location-summary"> 
723                  <#if infoObj["Location Description"]?has_content> 
724                  ${infoObj["Location Description"]} 
725                  </#if> 
726               </p> 
727               <div class="booking-link-wrapper"> 
728                  <#if infoObj["Location Url"]?has_content> 
729                  <a href="${infoObj["Location Url"]}" class="btn btn-primary btn-lg btn-arrow-right">ICBA Booking Link</a> 
730                  </#if> 
731               </div> 
732             
733            </div> 
734         </div> 
735         <div class="disclaimer"> 
736            <p> 
737               <#if infoObj["Location Disclaimer"]?has_content> 
738               ${infoObj["Location Disclaimer"]} 
739               </#if> 
740            </p> 
741         </div> 
742      </div> 
743   </div> 
744   </#if> 
745   <!-- End -->								  
746   <!-- Who should Attend --> 
747 <#if isWebinar == "true" || isEvent == "true"> 
748	 <div class="product-info-wrapper product-attendees-info"> 
749      <h2 class="product-info-title"><button type="button" data-bs-toggle="collapse" 
750         data-bs-target="#attendees-div" role="button" aria-expanded="true" 
751         aria-controls="attendees-div">Who Should Participate</button></h2> 
752      <div class="product-info-div collapse show" id="attendees-div"> 
753         <div class="table-responsive"> 
754            <table class="table custom-table"> 
755               <tbody> 
756                  <tr> 
757                     <td> 
758                        <p><strong>Who should attend: </strong></p> 
759                     </td> 
760                     <td> 
761                             <#if infoObj.icbaaudience?? && infoObj.icbaaudience?size gt 0> 
762                                <#assign formatList = []> 
763                                    <#list infoObj.icbaaudience as format> 
764                                       <#if format.value?has_content> 
765                                          <#assign formatList += [format.value]> 
766                                       </#if> 
767                                    </#list> 
768                                 ${formatList?join(", ")} 
769                              </#if> 
770                     </td> 
771                  </tr> 
772                  <tr> 
773                     <td> 
774                        <p><strong>Prerequisites:</strong></p> 
775                     </td> 
776                     <td> 
777                        <#if infoObj["Prerequisites"]?has_content> 
778                        <p>${infoObj["Prerequisites"]}</p> 
779                        </#if>	 
780                     </td> 
781                  </tr> 
782                  <tr> 
783                     <td> 
784                        <p><strong>Advanced Preparation:</strong></p> 
785                     </td> 
786                     <td> 
787                        <#if infoObj["Advanced Preparation"]?has_content> 
788                        <p>${infoObj["Advanced Preparation"]}</p> 
789                        </#if>	 
790                     </td> 
791                  </tr> 
792                  <tr> 
793                     <td> 
794                        <p><strong>Program Level:</strong></p> 
795                     </td> 
796                     <td> 
797                        <#if infoObj["Program Level"]?has_content> 
798                        <p>${infoObj["Program Level"]}</p> 
799                        </#if>	 
800                     </td> 
801                  </tr> 
802                  <tr> 
803                     <td> 
804                        <p><strong>Field of Study:</strong></p> 
805                     </td> 
806                     <td> 
807                        <#if infoObj["Field of Study"]?has_content> 
808                        <p>${infoObj["Field of Study"]}</p> 
809                        </#if>	 
810                     </td> 
811                  </tr> 
812                  <tr> 
813                     <td> 
814                        <p><strong>Delivery Method:</strong></p> 
815                     </td> 
816                     <td> 
817                        <#if infoObj.nasbadeliverymethod?? && infoObj.nasbadeliverymethod?size gt 0> 
818                        <#assign formatList = []> 
819                        <#list infoObj.nasbadeliverymethod as format> 
820                        <#if format.value?has_content> 
821                        <#assign formatList += [format.value]> 
822                        </#if> 
823                        </#list> 
824                        ${formatList?join(", ")} 
825                        </#if> 
826                     </td> 
827                  </tr> 
828                  <tr> 
829                     <td> 
830                        <p><strong>Continuing Professional<br />Education (CPE) Credit Hours:</strong></p> 
831                     </td> 
832                     <td> 
833                        <#if infoObj["CPE Credits"]?has_content> 
834                        <p>${infoObj["CPE Credits"]} hrs</p> 
835                        </#if>	 
836                     </td> 
837                  </tr> 
838               </tbody> 
839            </table> 
840         </div> 
841      </div> 
842   </div> 
843	 </#if> 
844    
845   <!-- Instructor --> 
846<#if isWebinar == "true" || isEvent == "true"> 
847	<#if infoObj["InstructorId"]?has_content> 
848	<div class="product-info-wrapper product-instructors-info"> 
849      <h2 class="product-info-title"><button type="button" data-bs-toggle="collapse" 
850         data-bs-target="#instructors-div" role="button" aria-expanded="true" 
851         aria-controls="instructors-div">Instructors</button></h2> 
852      <div class="product-info-div collapse show" id="instructors-div"> 
853         <div class="row"> 
854				 <!-- Article Structure Type --> 
855            <#assign instructorString = infoObj["InstructorId"]?string/> 
856            <#assign instructorIdList = instructorString?split(",")/> 
857					 <#list instructorIdList as iid> 
858						 <div class="col-md-6"> 
859	             <@liferay_journal["journal-article"] 
860		              articleId="${iid}" 
861		              ddmTemplateKey="716972" 
862		              groupId=45248 
863	             /> 
864						 </div> 
865            </#list> 
866         </div> 
867      </div> 
868   </div> 
869	</#if> 
870   </#if> 
871   <!--End--> 
872   <!-- Disclaimers --> 
873	   <#if isWebinar == "true" || isEvent == "true" || isPerson == "true"> 
874			  <div class="product-info-wrapper product-disclaimers-info"> 
875            <h2 class="product-info-title"> 
876							<button type="button" data-bs-toggle="collapse" data-bs-target="#disclaimers-div" role="button" aria-expanded="true" aria-controls="disclaimers-div">Disclaimers</button> 
877					  </h2> 
878               <div class="product-info-div collapse show" id="disclaimers-div"> 
879                     <h3>Attendance and Cancellation Policy</h3> 
880                         <#-- Loop through contentFields to get the "content" field --> 
881                         <#if isSeminar == "true" || isInstitute == "true"> 
882													 		<#list attendenceSeminar.contentFields as field> 
883                                <#if field.name == "content"> 
884                                     ${htmlUtil.unescape(field.contentFieldValue.data)} 
885                                 </#if> 
886                             </#list> 
887													 </#if>  
888                         <#if isWebinar == "true"> 
889													 		<#list attendenceWebinar.contentFields as field> 
890                                <#if field.name == "content"> 
891                                     ${htmlUtil.unescape(field.contentFieldValue.data)} 
892                                 </#if> 
893                             </#list> 
894													 </#if>  
895         
896													 <hr /> 
897													  
898                       <h3>Continuing Professional Education Credit (CPE) Requirements</h3> 
899                           <#if isSeminar == "true" || isInstitute == "true"> 
900													    <#list cpeSeminar.contentFields as cpefield> 
901                                 <#if cpefield.name == "content"> 
902                                    ${htmlUtil.unescape(cpefield.contentFieldValue.data)} 
903                                 </#if> 
904                                </#list> 
905														 </#if> 
906												  <#if isWebinar == "true"> 
907													    <#list cpeWebinar.contentFields as cpefield> 
908                                 <#if cpefield.name == "content"> 
909                                    ${htmlUtil.unescape(cpefield.contentFieldValue.data)} 
910                                 </#if> 
911                                </#list> 
912														 </#if> 
913	                        <#if isPerson == "true"> 
914													    <#list cpePerson.contentFields as cpefield> 
915                                 <#if cpefield.name == "content"> 
916                                    ${htmlUtil.unescape(cpefield.contentFieldValue.data)} 
917                                 </#if> 
918                                </#list> 
919														 </#if>												  
920													 <hr /> 
921          
922										<h3>${coc.title}</h3> 
923                        <#list coc.contentFields as cocfield> 
924                            <#if cocfield.name == "content"> 
925                                ${htmlUtil.unescape(cocfield.contentFieldValue.data)} 
926                            </#if> 
927                        </#list> 
928                    <a href="/code-of-conduct">Read Full Policy</a> 
929                      
930											<hr /> 
931        
932								<h3>${policy.title}</h3> 
933                     <#list policy.contentFields as policyfield> 
934                         <#if policyfield.name == "content"> 
935                             ${htmlUtil.unescape(policyfield.contentFieldValue.data)} 
936                          </#if> 
937                      </#list> 
938													 											<hr /> 
939        
940								<h3>${recording.title}</h3> 
941                     <#list recording.contentFields as recordingfield> 
942                         <#if recordingfield.name == "content"> 
943                             ${htmlUtil.unescape(recordingfield.contentFieldValue.data)} 
944                          </#if> 
945                      </#list> 
946													 											 											<hr /> 
947        
948								<h3>${video.title}</h3> 
949                     <#list video.contentFields as videofield> 
950                         <#if videofield.name == "content"> 
951                             ${htmlUtil.unescape(videofield.contentFieldValue.data)} 
952                          </#if> 
953                      </#list> 
954													 													 											 											<hr /> 
955        
956								<h3>${nasba.title}</h3> 
957                     <#list nasba.contentFields as nasbafield> 
958                         <#if nasbafield.name == "content"> 
959                             ${htmlUtil.unescape(nasbafield.contentFieldValue.data)} 
960                          </#if> 
961                      </#list> 
962               </div> 
963            </div> 
964			 </#if> 
965  </div> 
966	  
967   <!-- End -->		 
968<#if hasSkus == "true" || infoObj["Alternate URL"]?has_content> 
969	 <script> 
970		 function navigateToRegistration(){ 
971	     var defaultURL = '${displayMapValue[defaultSKUKey]}'; 
972			  
973			 var deliveryMethod = document.getElementById("delivery-method"); 
974			 if(deliveryMethod){ 
975         defaultURL = deliveryMethod.value; 
976
977		   window.location.href = defaultURL; 
978
979	 </script> 
980</#if> 
981<!-- Handle Registration Form button click -->	  
982<script> 
983		 function navigateToRegForm(){ 
984 
985			 window.open('/documents/d/asset-library-45247/icba-education-registration-form', '_blank'); 
986
987	 </script> 
988	  
989<#if isWebinar == "true" && numberOfOptions gt 1 && !infoObj["Alternate URL"]?has_content> 
990<script> 
991	 
992		const delveryMethodSelect = document.getElementById('delivery-method'); 
993	  const registrationButton = document.getElementById('productRegistrationBtn'); 
994    registrationButton.classList.add("disabled"); 
995	  if(delveryMethodSelect){ 
996			delveryMethodSelect.onchange = function() { 
997				const selectedValue = delveryMethodSelect.value; 
998				 
999				if(selectedValue){ 
1000					 registrationButton.classList.remove("disabled"); 
1001				} else { 
1002						registrationButton.classList.add("disabled"); 
1003
1004
1005		}; 
1006 
1007</script> 
1008</#if>