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>