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>