处理模板时发生错误。
The following has evaluated to null or missing:
==> qstringmap["ecdma-lc"] [in template "10154#10192#18387089" at line 19, column 15]
----
Tip: It's the final [] step that caused this error, not those before it.
----
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: #assign lc = qstringmap["ecdma-lc"]?f... [in template "10154#10192#18387089" at line 19, column 1]
----
1<#assign utilServ = (serviceLocator.findService("com.elan.crc.utilites.service.CRCRemoteServiceService"))! />
2<#assign oadURL = propsUtil.get('elan.oad.url') >
3<#assign serviceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext() >
4<#assign themeDisplay = serviceContext.getThemeDisplay() />
5<#assign url = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent()/>
6<#assign qstringmap = httpUtil.getParameterMap(httpUtil.getQueryString(url))>
7<#assign url404 = '/error/404.html' >
8<#assign environment = url?replace('/11t3.*','','r')>
9
10<#assign text_to_apply_source = "vanity url" >
11<#if qstringmap["sms"]?has_content>
12 <#assign sms = 1 >
13 <#assign text_to_apply_source = "sms" >
14</#if>
15<#if qstringmap["qrCode"]?has_content>
16 <#assign text_to_apply_source = "qr code" >
17</#if>
18
19<#assign lc = qstringmap["ecdma-lc"]?first>
20<#assign lc = htmlUtil.escape(lc)>
21<#assign lc = htmlUtil.escapeJS(lc)>
22
23<#assign prefix = "00000" >
24<#assign lcWithPrefix = prefix + lc >
25<#assign withPrefixLength = lcWithPrefix?length >
26<#assign startHere = withPrefixLength - 5>
27<#assign lc = lcWithPrefix?substring(startHere)>
28
29<#if qstringmap["ecid"]?has_content>
30 <#assign ecidExt = qstringmap["ecid"]?first>
31 <#assign ecidExt = htmlUtil.escape(ecidExt)>
32 <#assign ecidExt = htmlUtil.escapeJS(ecidExt)>
33 <#assign ecidExt = "&ecid=" + ecidExt>
34
35
36 <#assign campaignId = qstringmap["ecid"]?first >
37 <#assign campaignId = htmlUtil.escape(campaignId)>
38 <#assign campaignId = htmlUtil.escapeJS(campaignId)>
39<#else>
40 <#assign ecidExt="">
41 <#assign campaignId = "" >
42</#if>
43
44<#assign isFromDCOLink = false>
45<#assign dcoSourceCode = ''>
46<#if qstringmap["sourcecode"]?has_content>
47 <#assign dcoSourceCode = qstringmap["sourcecode"]?first>
48 <#assign dcoSourceCode = htmlUtil.escape(dcoSourceCode)>
49 <#assign dcoSourceCode = htmlUtil.escapeJS(dcoSourceCode)>
50<#elseif qstringmap["sourceCode"]?has_content>
51 <#assign dcoSourceCode = qstringmap["sourceCode"]?first>
52 <#assign dcoSourceCode = htmlUtil.escape(dcoSourceCode)>
53 <#assign dcoSourceCode = htmlUtil.escapeJS(dcoSourceCode)>
54</#if>
55
56<#if dcoSourceCode?has_content>
57 <#assign isFromDCOLink = true>
58</#if>
59
60<#assign clientProfileService = (serviceLocator.findService("com.elan.crc.user.service.CrcClientProfileLocalService"))! />
61<#assign clientProfileList = clientProfileService.findByLocationCode(lc)>
62<#assign clientProfile = clientProfileList?first>
63<#assign partnerName = clientProfile.getMarketingNameLong()>
64<#assign pbu = clientProfile.getPbu()>
65<#assign subbu = clientProfile.getSUBBRANDBUNBR()>
66
67<#assign logoFileName = clientProfile.getLogoBFormat1()?replace(".", "-")?replace("-([^-]*)$", ".$1", "r")?lower_case>
68<#assign cdnLogoUrl = (propsUtil.get('rackspace.cdn.web.url'))!>
69<#assign fiCardsData = utilServ.makeCall('crcTier3GetPbuData','0&'+pbu+'&'+subbu)>
70
71 <#assign clientDataService = (serviceLocator.findService("com.elan.crc.user.service.CrcPbuLocalService"))! />
72<#assign clientProfileDataList = clientDataService.getByPbuAndSubBu(pbu,subbu)>
73<#assign partnerUrl = clientProfileDataList.getPartnerMainUrl()>
74<script>
75//console.log('Partner URL', ${partnerUrl});
76</script>
77<#if partnerUrl?has_content && !partnerUrl?matches(r"(?i)^https?\:\/\/.*")>
78 <#assign partnerUrl = 'https://' + partnerUrl>
79</#if>
80<script>
81//console.log('Partner URL', ${partnerUrl});
82
83</script>
84<#-- Begin: filter duplicated cards-->
85<#assign temp = []>
86<#assign offerTypeList = []>
87<#if (fiCardsData?size > 0)>
88
89
90<!-- redirect to PANO start -->
91<!-- parse URL for page to determine product -->
92<#if (fiCardsData?first.redirectToPANO == "1")>
93 <#assign pageend = url?index_of("?") - 1 >
94 <#assign urlwoquery = url[0..pageend] >
95 <#assign pagestart = urlwoquery?last_index_of("/") + 1 >
96 <#assign productURL = urlwoquery[pagestart..] >
97 <#assign qstringonly = httpUtil.getQueryString(url) >
98
99 <#if (productURL == "consumer-platinum")>
100 <#assign PANOofferType = "108">
101 <#elseif (productURL == "zero-plus")>
102 <#assign PANOofferType = "109">
103 <#elseif (productURL == "zero-plus-business")>
104 <#assign PANOofferType = "132">
105 <#elseif (productURL == "max-cash")>
106 <#assign PANOofferType = "104">
107 <#elseif (productURL == "consumer-edr")>
108 <#assign PANOofferType = "101">
109 <!-- PANOofferType = "103" -->
110 <#elseif (productURL == "secured")>
111 <#assign PANOofferType = "115">
112 <#elseif (productURL == "smart-business-rewards")>
113 <#assign PANOofferType = "144">
114 <#elseif (productURL == "business-cash-preferred")>
115 <#assign PANOofferType = "128">
116 <#elseif (productURL == "business-real-rewards")>
117 <#assign PANOofferType = "143">
118 <#elseif (productURL == "business-platinum")>
119 <#assign PANOofferType = "121">
120 <#elseif (productURL == "max-cash-secured")>
121 <#assign PANOofferType = "147">
122 <#elseif (productURL == "college-real-rewards")>
123 <#assign PANOofferType = "141">
124 <#elseif (productURL == "travel-rewards-plus")>
125 <#assign PANOofferType = "138">
126 <#elseif (productURL == "reserve-rewards-plus")>
127 <#assign PANOofferType = "154">
128 <#else>
129 <#assign PANOofferType = "0">
130 </#if>
131 <#assign redirectToPANO = 'https://www.mycardapply.com/synindex/?' + qstringonly + "&offertype=" + PANOofferType >
132 <script>
133 console.log('${productURL}');
134 console.log('${PANOofferType}');
135 console.log('${redirectToPANO}');
136 <!-- append #business to PANO Redirect URL if current URL contains #business. PANO uses this to show business tab as selected -->
137 if(window.location.href.includes('#business')){
138 location.href = '${redirectToPANO}'+'#business';
139 } else {
140 location.href = '${redirectToPANO}';
141 }
142 </script>
143</#if>
144<!-- redirect to PANO end -->
145
146
147 <#assign index = 0>
148 <#list fiCardsData as fib>
149 <#if (fib.offerType?has_content && !(offerTypeList?seq_contains(fib.offerType)))>
150 <#assign offerTypeList = offerTypeList + [fib.offerType]>
151 <#assign temp = temp + fiCardsData[index..index]>
152 </#if>
153 <#assign index = index + 1>
154 </#list>
155 <#assign fiCardsData = temp>
156 <#if (fiCardsData?size > 0)>
157 <div class="content-container content-container-main">
158 <#if url?contains("index")>
159 <#assign product="All Cards">
160 <h1 class="sr-only">${partnerName!'Elan'} Credit Cards</h1>
161 <header class="page-header">
162 <div class="page-header__logo">
163 <#if partnerUrl?has_content>
164 <a href="${partnerUrl!''}">
165 <img src="${cdnLogoUrl!''}/${logoFileName!''}" alt="${partnerName!''} Logo">
166 </a>
167 <#else>
168 <img src="${cdnLogoUrl!''}/${logoFileName!''}" alt="${partnerName!''} Logo">
169 </#if>
170 </div>
171 </header>
172 <#else>
173 <header class="page-header">
174 <#if !isFromDCOLink>
175 <div class="back-overview hide-desktop">
176 <a href="${environment}/11t3/index?ecdma-lc=${lc}${ecidExt}">Home</a>
177 </div>
178 </#if>
179
180 <div class="header-main-logo">
181 <#if partnerUrl?has_content>
182 <a href="${partnerUrl!''}">
183 <img src="${cdnLogoUrl!''}/${logoFileName!''}" alt="${partnerName!''} Logo">
184 </a>
185 <#else>
186 <img src="${cdnLogoUrl!''}/${logoFileName!''}" alt="${partnerName!''} Logo">
187 </#if>
188 </div>
189 <#if !isFromDCOLink>
190 <div class="styled-select slate">
191 <nav class="styled-select__dropdown">
192 <div class="back-overview hide-mobile-flex">
193 <a href="${environment}/11t3/index?ecdma-lc=${lc}${ecidExt}">Home</a>
194 </div>
195 <a href="javascript:void(0)" class="dropdown-select" aria-expanded="false">
196 <span class="selected-option"></span>
197 <div class="jn-arrow arrow arrow-right"></div>
198 </a>
199 <a href="javascript:void(0)" aria-label="Open page navigation menu" class="jn-hamburger hamburger" aria-expanded="false">
200 <div class="first-line transform transformed1"></div>
201 <div></div>
202 <div class="transform transformed2"></div>
203 <div></div>
204 </a>
205 <ul>
206 <#list fiCardsData as fib>
207 <#switch fib.offerType>
208 <#case "101">
209 <#assign productURL = "202302/consumer-edr">
210 <#assign productName = "Everyday Rewards+">
211 <#break>
212 <#case "103">
213 <#assign productURL = "202302/consumer-edr">
214 <#assign productName = "Everyday Rewards+">
215 <#break>
216 <#case "104">
217 <#assign productURL = "max-cash">
218 <#assign productName = "Max Cash Preferred Card">
219 <#break>
220 <#case "108">
221 <#assign productURL="202308/consumer-platinum">
222 <#assign productName="Platinum Card">
223 <#break>
224 <#case "109">
225 <#assign productURL="202308/consumer-platinum">
226 <#assign productName="Platinum Card">
227 <#break>
228 <#case "115">
229 <#assign productURL = "secured">
230 <#assign productName = "Secured Card" >
231 <#break>
232 <#case "138">
233 <#assign productURL = "202305/travel-rewards-plus">
234 <#assign productName = "Travel Rewards+" >
235 <#break>
236 <#case "141">
237 <#assign productURL = "college-real-rewards">
238 <#assign productName = "College Real Rewards" >
239 <#break>
240 <#case "147">
241 <#assign productURL = "max-cash-secured">
242 <#assign productName = "Max Cash Secured Card" >
243 <#break>
244 <#case "154">
245 <#assign productURL = "202305/reserve-rewards-plus">
246 <#assign productName = "Reserve Rewards+" >
247 <#break>
248 <#case "121">
249 <#assign productURL = "202208/business-platinum">
250 <#assign productName = "Business Card" >
251 <#break>
252 <#case "128">
253 <#assign productURL = "business-cash-preferred">
254 <#assign productName = "Business Cash Preferred" >
255 <#break>
256 <#case "143">
257 <#assign productURL = "business-real-rewards">
258 <#assign productName = "Business Real Rewards Card" >
259 <#break>
260 <#case "144">
261 <#assign productURL = "smart-business-rewards">
262 <#assign productName = "Smart Business Rewards Card" >
263 <#break>
264 <#default>
265 </#switch>
266 <#if url?matches(".*/${productURL}\\?.*")>
267 <li class="selected" data-value="${productName}" selected="selected"><a href="javascript:void(0)">${productName}</a></li>
268 <#else>
269 <li class="dropdown-item" data-value="${productName}">
270 <a href="${environment}/11t3/${productURL}?ecdma-lc=${lc}${ecidExt}">
271 ${productName}
272 </a>
273 </li>
274 </#if>
275 </#list>
276 </ul>
277 </nav>
278
279 </div>
280 </#if>
281 </header>
282 <script>
283 function toggleFlyOutMenu() {
284 $('.styled-select').toggleClass('show-select');
285 var ariaExpanded = $('.styled-select__dropdown .dropdown-select').attr('aria-expanded');
286 if(ariaExpanded !== null) {
287 var isAriaExpanded;
288 if(ariaExpanded === "true") {
289 isAriaExpanded = true;
290 } else {
291 isAriaExpanded = false
292 }
293 $('.styled-select__dropdown .dropdown-select').attr('aria-expanded', !isAriaExpanded);
294 const ariaLabel = isAriaExpanded? "Open page navigation menu" : "Close page navigation menu";
295 $('.styled-select__dropdown .jn-hamburger').attr('aria-expanded', !isAriaExpanded).attr('aria-label', ariaLabel);
296 }
297 }
298 AUI().ready(function () {
299 var pageSelected = $('.selected').attr('data-value');
300 $('.jn-hamburger, .dropdown-select').click(function () {
301 toggleFlyOutMenu();
302 });
303 $('.styled-select__dropdown').keydown(function(event) {
304 var firstNavigationLink = $('.styled-select__dropdown ul li:visible a').first();
305 var lastNavigationLink = $('.styled-select__dropdown ul li:visible a').last();
306
307 if(event.keyCode === 9 ) {
308 // if they tab outside of the nav close the navigation
309 //shift + tab pressed
310 if(event.shiftKey && firstNavigationLink.is(document.activeElement)) {
311 toggleFlyOutMenu();
312 } else if(!event.shiftKey && lastNavigationLink.is(document.activeElement)) {
313 toggleFlyOutMenu();
314 }
315 }
316 });
317 $('.selected-option').text(pageSelected);
318 });
319 </script>
320 </#if>
321 </div>
322 <script>
323 var reportingData = {};
324
325 //document.addEventListener('DOMContentLoaded', function() {
326 AUI().ready(function () {
327 //console.log('inside ready');
328 var page = location.pathname.split('/')[location.pathname.split('/').length-1];
329 var hostName = location.hostname;
330 function getDomainFromHostname(hostname) {
331 var parts = hostname.split('.');
332 return parts.length === 3 ? parts[1] : parts[0];
333 }
334 var domain = getDomainFromHostname(hostName);
335 var partnerName = "${partnerName!''}";
336 var product = "All Cards";
337 var title = "";
338 var metaDesc = "";
339 var m = document.createElement('meta');
340 switch(page) {
341 case "max-cash-secured":
342 product="Max Cash Secured Card";
343 title = "Earn more on the categories you pick | "+partnerName+" Max Cash Secured Card";
344 metaDesc = "Apply Today for a "+partnerName+" Credit Card. Use this card as a solid foundation to build your credit.";
345 break;
346 case "max-cash":
347 product="Max Cash Preferred Card";
348 title = "Earn a $150 Bonus and 5% cash back | "+partnerName+" Max Cash Preferred Card";
349 metaDesc = "Apply Today for a "+partnerName+" Credit Card. Earn a $150 Bonus and 5% cash back on the two categories you select.";
350 break;
351 case "consumer-platinum":
352 product="Platinum Card";
353 title = "The purchasing power of Zero | "+partnerName+" Platinum Card";
354 metaDesc = "Apply Today for a "+partnerName+" Credit Card. Limited Time Offer. 0% Intro APR on Purchases and Balance Transfers for 18 Billing Cycles Consolidate your Balances with the "+partnerName+" Intro APR Card.";
355 break;
356 case "consumer-edr":
357 product="Everyday Rewards+";
358 title = "Sign up and earn bonus points | "+partnerName+" Everyday Rewards+";
359 metaDesc = "Apply Today for a "+partnerName+" Credit Card. Earn 15,000 when you spend $500 within the first 90 days.";
360 break;
361 case "secured":
362 product="Secured Card";
363 title = "Strengthen your finances | "+partnerName+" Secured Card";
364 metaDesc = "Apply Today for a "+partnerName+" Credit Card. Use this card as a solid foundation to build your credit.";
365 break;
366 case "college-real-rewards":
367 product="College Real Rewards";
368 title = "Sign up and earn bonus points. | "+partnerName+" College Real Rewards";
369 metaDesc = "Apply Today for a "+partnerName+" Credit Card. Use this card as a solid foundation to build your credit.";
370 break;
371 case "smart-business-rewards":
372 product="Smart Business Rewards Card";
373 title = "2X rewards in your top 2 spend categories | "+partnerName+" Business Smart Business Rewards Card";
374 metaDesc = "Apply Today for a "+partnerName+" Credit Card. More choices. More value for your business. Earn a $200 Bonus and 2x Rewards on your top 2 spend categories each month with the "+partnerName+" Credit Card.";
375 break;
376 case "business-cash-preferred":
377 product="Business Cash Preferred";
378 title = "Flexible rewards for your business | "+partnerName+" Business Cash Preferred";
379 metaDesc = "Apply Today for a "+partnerName+" Credit Card. Earn Cash back on common business expenses.";
380 break;
381 case "business-real-rewards":
382 product="Business Real Rewards Card";
383 title = "Earn up to 1.5X points with no caps | "+partnerName+" Business Real Rewards Card";
384 metaDesc = "Apply Today for a "+partnerName+" Credit Card. Get more rewards in the categories you spend the most on." ;
385 break;
386 case "business-platinum":
387 product="Business Card";
388 title = "Pay down your other credit card balances faster | "+partnerName+" Business Card";
389 metaDesc = "Apply Today for a "+partnerName+" Business Card. 0% Intro APR on Purchases and Balance Transfers for 18 Billing Cycles.";
390 break;
391 case "travel-rewards-plus":
392 product="Travel Rewards+"
393 title = partnerName + " | Travel Rewards+ Card";
394 metaDesc = "Make travel more rewarding with unlimited 4x points on travel and frequent popular categories."
395 break;
396 case "reserve-rewards-plus":
397 product="Reserve Rewards+"
398 title = partnerName + " | Reserve Rewards+ Card";
399 metaDesc = "Get exceptional rewards on travel and frequent purchases with this exclusive metal card.";
400 break;
401 default:
402 product = "All Cards";
403 title = partnerName + " Credit Card Index Page";
404 metaDesc = "Apply Today for a "+partnerName+" Credit Card.";
405 }
406 document.title = title;
407 m.name = 'description';
408 m.content = metaDesc;
409 document.head.appendChild(m);
410
411 var lc = "${lc!'0'}";
412
413 /* update SiteCatalyst data object */
414 reportingData.current_page = "microsite:${partnerName}:" + domain + ':' + page.replace('-',' ');
415 reportingData.page_type = 'product';
416 reportingData.site_section = 'credit cards';
417 reportingData.platform = 'microsite';
418 reportingData.campaign_id = '${campaignId}';
419 reportingData.location_code = lc;
420 reportingData.partner_name = partnerName;
421 reportingData.product = product;
422 reportingData.text_to_apply_source = '${text_to_apply_source}';
423 reportingData.visitor_type = 'prospect';
424 reportingData.Banker_id = '0';
425 reportingData.Banker_code = '0';
426
427
428 /* SiteCatalyst pageView tracking */
429 AUI().ready(function() {
430 if (window.publisherFW) {
431 //console.log("pageView");
432 window.publisherFW.publishEvent("pageView", reportingData);
433 }
434 });
435
436 jQuery('.jn-button, .applyNowLink').on('click', function(e){
437 var buttonName = $(this).data('button-name');
438 var productName = $(this).data('product-name');
439 /* SiteCatalyst onClick tracking */
440 reportingData.applyButton = buttonName;
441 reportingData.product = productName;
442
443 if (window.publisherFW) {
444 //console.log('clicked', reportingData);
445 window.publisherFW.publishEvent("onClick", reportingData);
446 }
447
448 });
449
450 jQuery('.applyNowLink').on('click', function(e){
451 ga("send", {
452 hitType: "event",
453 eventAction: "ApplyNow",
454 eventCategory: "click",
455 eventLabel: "BottomButton"
456 });
457 });
458
459 });
460 </script>
461 <#else>
462 <script>
463 console.log("Empty card list");
464 location.href = '${url404}';
465 </script>
466 </#if>
467<#else>
468 <script>
469 console.log("FI Cards Data empty", "pbu:", "${pbu}", ",subbu:","${subbu}");
470 location.href = '${url404}';
471 </script>
472</#if>
处理模板时发生错误。
The following has evaluated to null or missing:
==> qstringmap["ecdma-lc"] [in template "10154#10192#18372552" at line 12, column 14]
----
Tip: It's the final [] step that caused this error, not those before it.
----
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: #assign lc = qstringmap["ecdma-lc"]?f... [in template "10154#10192#18372552" at line 12, column 1]
----
1<#assign url = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent()>
2<#assign qstringmap = httpUtil.getParameterMap(httpUtil.getQueryString(url))>
3<#assign basePath = "/web/creditcardlearnmore">
4<#assign environment = url?substring(0, url?index_of(basePath) + basePath?length)>
5<#assign oadURL = propsUtil.get('elan.oad.url')>
6<#assign oadURL_TC = propsUtil.get('elan.oad.tac.url') >
7<#assign prcaURL = propsUtil.get('elan.prca.url') >
8<#assign rewardsCalculatorURL = propsUtil.get('cclm.rewards.calculator.url') >
9<#assign applyNowText = "Apply Now" >
10<#assign learnMoreText = "Learn More" >
11
12<#assign lc= qstringmap["ecdma-lc"]?first>
13<#assign lc = htmlUtil.escape(lc)>
14<#assign lc = htmlUtil.escapeJS(lc)>
15
16<#assign prefix = "00000" >
17<#assign lcWithPrefix = prefix + lc >
18<#assign withPrefixLength = lcWithPrefix?length >
19<#assign startHere = withPrefixLength - 5>
20<#assign lc = lcWithPrefix?substring(startHere)>
21
22<#assign calculatorOfferTypes = ["101", "104", "138", "154", "144", "143", "128"] >
23<#assign balanceTransferCalculatorOfferTypes = ["108", "109"] >
24
25<#assign utilServ = (serviceLocator.findService("com.elan.crc.utilites.service.CRCRemoteServiceService"))! >
26<#assign clientProfileService = (serviceLocator.findService("com.elan.crc.user.service.CrcClientProfileLocalService"))! >
27<#assign clientProfileList = clientProfileService.findByLocationCode(lc)>
28<#assign clientProfile = clientProfileList?first>
29<#assign partnerName = clientProfile.getMarketingNameLong()>
30<#assign pbu = clientProfile.getPbu()>
31<#assign subbu = clientProfile.getSUBBRANDBUNBR()>
32<#assign cdnCardArtUrl = (propsUtil.get('rackspace.cdn.cardart.url'))!>
33<#assign fiCardsData = utilServ.makeCall('crcTier3GetPbuData','0&'+ pbu + '&'+subbu + '&' + lc)>
34
35
36<#assign synExclusionMessageService = (serviceLocator.findService("com.elan.crc.quicklink.service.SYNExclusionMessageLocalService"))! />
37<#assign synExclusionMessageData = synExclusionMessageService.getClientProfileAndSyndicatedExclusionMsg(lc) />
38<#assign synExclusionDefaultMessageData = synExclusionMessageService.getSyndicatedDefaultMsg() />
39<#assign synExclusionMsg = "" />
40<#assign synExclusionMsgURL = "" />
41<#assign synExclusionMsgAriaLabel = "" />
42<#assign synExclusionDefaultMsg = "" />
43
44<#if synExclusionDefaultMessageData?exists && synExclusionDefaultMessageData?has_content >
45 <#assign synExclusionDefaultMsg = synExclusionDefaultMessageData!""/>
46</#if>
47
48<#if synExclusionMessageData?exists && synExclusionMessageData?has_content >
49 <#assign synExclusionMsgObj = synExclusionMessageData[0] />
50 <#assign synExclusionMsg = synExclusionMsgObj[4]!"" />
51 <#assign synExclusionMsgURL = synExclusionMsgObj[5]!"" />
52 <#assign synExclusionMsgAriaLabel = synExclusionMsgObj[6]!"" />
53</#if>
54
55<#assign fultonBankpbu = "0727491">
56<#if pbu == fultonBankpbu>
57 <style>
58 #hideFultonInfo {
59 display: none;
60 }
61 </style>
62</#if>
63
64<#function getOfferIdByOfferType offerType>
65 <#list fiCardsData as fiData>
66 <#if fiData.offerType == offerType>
67 <#return fiData.offerId>
68 </#if>
69 </#list>
70 <#return "" />
71</#function>
72
73<#function getFileNameByOfferType offerType>
74 <#list fiCardsData as fiData>
75 <#if fiData.offerType == offerType>
76 <#return fiData.filename>
77 </#if>
78 </#list>
79 <#return "" />
80</#function>
81
82<#function isOfferExcluded offerType>
83 <#list fiCardsData as fiData>
84 <#if fiData.offerType == offerType>
85 <#return fiData.dmaexclude!"">
86 </#if>
87 </#list>
88 <#return "" />
89</#function>
90
91<#function getUsePRCA offerType>
92 <#list fiCardsData as fiData>
93 <#if fiData.offerType == offerType>
94 <#return fiData.useprca!"">
95 </#if>
96 </#list>
97 <#return "" />
98</#function>
99
100<#function replacePlaceholders(input, APRValue, AMFValue, BALValue, TCLinkValue)>
101 <#return input
102 ?replace("{APR}", APRValue)
103 ?replace("{AMF}", AMFValue)
104 ?replace("{BAL}", BALValue)
105 ?replace("{TC}", TCLinkValue)>
106</#function>
107
108<#assign productOfferTypeValue = "">
109<#assign productOfferTypeName = "">
110<#if (productOfferType.getData())??>
111 <#assign productOfferTypeValue = productOfferType.getData()>
112 <#assign productOfferTypeName = productOfferType.optionsMap[productOfferType.getData()]>
113</#if>
114
115<#assign productOfferTypeName = productOfferTypeName?substring(productOfferTypeName?index_of(" - ") + 3)?upper_case!>
116
117
118
119<#assign offerId = getOfferIdByOfferType(productOfferTypeValue)>
120<#assign cardArtImage = cdnCardArtUrl + "/" + getFileNameByOfferType(productOfferTypeValue) + ".png" >
121<#assign cardArtImageAlt = cdnCardArtUrl + "/" + getFileNameByOfferType(productOfferTypeValue) + ".jpg" >
122<#assign cardArtImageAltText = partnerName + " " + productOfferTypeName?capitalize>
123
124<#assign hasBalanceTransferCalculator = balanceTransferCalculatorOfferTypes?seq_contains(productOfferTypeValue)>
125<#assign hasCalculatorRewards = calculatorOfferTypes?seq_contains(productOfferTypeValue)>
126<#assign isExcluded = isOfferExcluded(productOfferTypeValue)>
127<#assign prcaValue = getUsePRCA(productOfferTypeValue)>
128
129<#assign APR="" AMF="" BAL="">
130<#assign scrapedData = utilServ.makeCall('crcDDCGetSchumerBox', offerId)>
131<#if scrapedData?? && scrapedData?has_content && (scrapedData?size > 0)>
132
133<#list scrapedData as sItem>
134 <#if sItem.scrapedLabel?contains("Annual Percentage Rate (APR) for Purchases") && sItem.scrapedValue?has_content>
135 <#if !APR?has_content><#assign APR = sItem.scrapedValue></#if>
136 <#elseif sItem.scrapedLabel?contains("Annual Membership Fee") && sItem.scrapedValue?has_content>
137 <#if !AMF?has_content><#assign AMF = sItem.scrapedValue></#if>
138 <#elseif sItem.scrapedLabel?contains("APR for Balance Transfers") && sItem.scrapedValue?has_content>
139 <#if !BAL?has_content><#assign BAL = sItem.scrapedValue></#if>
140 </#if>
141 <#if APR?has_content && AMF?has_content && BAL?has_content>
142 <#break>
143 </#if>
144 </#list>
145</#if>
146
147 <#assign APRValue = APR!'' />
148 <#assign AMFValue = AMF!'' />
149 <#assign BALValue = BAL!'' />
150
151 <#assign termsAndConditionsLink =
152 '<a href="' + oadURL_TC + '?step=display&offerId=' + offerId + '&locationCode=' + lc +
153 '" target="_blank" class="t_c_link">' +
154 'See Terms & Conditions' +
155 '</a>'
156 />
157 <#assign TCLinkValue = termsAndConditionsLink!'' />
158
159 <#assign benefits = []>
160 <#if benefit.getSiblings()?has_content>
161 <#list benefit.getSiblings() as benefit>
162 <#assign primaryBenefitCopyRaw = benefit.primaryBenefitCopy.getData()!'' />
163 <#assign updatedPrimaryBenefitCopy = replacePlaceholders(primaryBenefitCopyRaw, APRValue, AMFValue, BALValue, TCLinkValue) />
164
165 <#assign benefitObject = {
166 "svgIcon": benefit.primaryBenefitSVGIcon.getData(),
167 "primaryBenefitCopy": updatedPrimaryBenefitCopy
168 } />
169 <#assign benefits += [benefitObject] />
170 </#list>
171</#if>
172
173<#assign additionalBenefits = []>
174<#if additionalBenefit.getSiblings()?has_content>
175 <#list additionalBenefit.getSiblings() as additionalBenefit>
176 <#assign additionalBenefitCopyRaw = additionalBenefit.additionalBenefitCopy.getData()!'' />
177 <#assign updatedAdditionalBenefitCopy = replacePlaceholders(additionalBenefitCopyRaw, APRValue, AMFValue, BALValue, TCLinkValue) />
178
179 <#assign additionalBenefitObject = {
180 "additionalBenefitSVGIcon": additionalBenefit.additionalBenefitSVGIcon.getData(),
181 "additionalBenefitCopy": updatedAdditionalBenefitCopy
182 } />
183 <#assign additionalBenefits += [additionalBenefitObject] />
184 </#list>
185</#if>
186
187<#assign offerCopyRaw = offerCopy.getData()!'' />
188<#assign updatedOfferCopy = replacePlaceholders(offerCopyRaw, APRValue, AMFValue, BALValue, TCLinkValue) />
189
190<#assign renderApplyNowButtonCount = 0>
191<#macro renderApplyNowButton>
192 <#assign renderApplyNowButtonCount = renderApplyNowButtonCount +1>
193 <#if isExcluded == "0">
194 <#if prcaValue == "1">
195 <a
196 class="apply-now-link"
197 data-button-name="apply-now-link"
198 data-product-name="${productOfferTypeName!''}"
199 href=""
200 offerId="${offerId}"
201 onclick="submitForm(event)"
202 >
203 ${applyNowText}
204 </a>
205 <form aria-hidden="true" id="applyForm" action="${prcaURL}?locationCode=${lc}&offerId=${offerId}&preparerType=customer" method="post">
206 <input type="hidden" name="locationCode" value="${lc}" id="locationCode">
207 <input type="hidden" name="offerId" value="${offerId}" id="offerId">
208 <input type="hidden" name="preparerType" value="customer">
209 </form>
210 <#else>
211 <a
212 href="${oadURL}?locationCode=${lc}&offerId=${offerId}&preparerType=customer"
213 class="apply-now-link"
214 data-button-name="apply-now-link"
215 data-product-name="${productOfferTypeName!''}"
216 >
217 ${applyNowText}
218 </a>
219 </#if>
220 <#else>
221 <a
222 class="apply-now-link"
223 data-button-name="apply-now-link"
224 data-product-name="${productOfferTypeName!''}"
225 data-micromodal-trigger="modal-tabs-${productOfferTypeValue}"
226 href="javascript:void(0);"
227 >
228 ${applyNowText}
229 </a>
230 </#if>
231</#macro>
232
233<div id="product-card-id" class="Tier3-Syn-Product-Detail-2024">
234 <div class="tab-card">
235 <div class="tab-card__left">
236 <h1 class="super-head">
237 ${productOfferTypeName}
238 <#if (cardNameFootnotes.getData())??>
239 <sup class="super-head--super-script">${cardNameFootnotes.getData()}</sup>
240 </#if>
241 </h1>
242 <img src="${cardArtImage}" alt="${cardArtImageAltText!''}" onerror="this.onerror=null;this.src='${cardArtImageAlt!''}'"/>
243 <@renderApplyNowButton />
244 <#if (hasBalanceTransferCalculator)>
245 <a href="javascript:void(0);" class="transfer-modal-link" data-micromodal-trigger="modal-2">See how much you could save with a balance transfer</a>
246 </#if>
247 <#if (hasCalculatorRewards)>
248 <a class="reward-calculator-link" target="_blank" href="${rewardsCalculatorURL}?ecdma-lc=${lc}">Calculate Rewards</a>
249 </#if>
250 </div>
251
252 <div class="tab-card__right">
253 <h1 class="super-head">
254 ${productOfferTypeName}
255 <#if (cardNameFootnotes.getData())??>
256 <sup class="super-head--super-script">${cardNameFootnotes.getData()}</sup>
257 </#if>
258 </h1>
259 <div class="offer-copy">${updatedOfferCopy}</div>
260 <div class="benefits">
261 <#list benefits as benefit>
262 <div class="benefits__item">
263 <#if benefit.svgIcon?has_content>
264 <div class="svg-container">
265 <img loading="lazy" src="${benefit.svgIcon}" alt="" class="<#if benefit.svgIcon?contains('svg')>dynamic-svg</#if>" />
266 </div>
267 </#if>
268 <div>
269 ${benefit.primaryBenefitCopy}
270 </div>
271 </div>
272 </#list>
273 </div>
274 </div>
275
276 </div>
277
278 <div class="additional-benefit-container">
279 <div class="additional-benefit">
280 <h2 class="additional-benefit__header">Additional Benefits </h2>
281 <div class="additional-benefit__layout">
282 <#list additionalBenefits as additionalBenefit>
283 <div class="additional-benefit__item">
284 <#if additionalBenefit.additionalBenefitSVGIcon?has_content>
285 <div class="svg-container">
286 <img loading="lazy" src="${additionalBenefit.additionalBenefitSVGIcon}" alt="" class="dynamic-svg" />
287 </div>
288 </#if>
289 <div>${additionalBenefit.additionalBenefitCopy}</div>
290 </div>
291 </#list>
292 </div>
293 <div class="additional-benefit__button">
294 <@renderApplyNowButton />
295 </div>
296 </div>
297 </div>
298</div>
299
300
301<#if isExcluded == "1">
302 <div aria-hidden="true" class="modal micromodal-slide" id="modal-tabs-${productOfferTypeValue}" >
303 <div class="excludeModal__overlay" data-micromodal-close tabindex="-1" >
304 <div
305 aria-modal="true"
306 aria-labelledby="modal-tabs-title-${productOfferTypeValue}"
307 class="excludeModal__container"
308 role="dialog"
309 >
310 <button aria-label="Close modal" class="excludeModal__close" data-micromodal-close></button>
311 <header class="excludeModal__header">
312 <div>
313 <h2 class="excludeModal__title" id="modal-tabs-title-${productOfferTypeValue}">
314 <#if synExclusionMsg?has_content>
315 ${synExclusionMsg}
316 <#else>
317 ${synExclusionDefaultMsg}
318 </#if>
319 </h2>
320 </div>
321 <div id="excludeModalDivLink">
322 <#if synExclusionMsgURL?has_content>
323 <p>
324 <a href="${synExclusionMsgURL}" target="_blank" aria-label="${synExclusionMsgAriaLabel!''}" class="excludeModal__link">
325 ${learnMoreText}
326 </a>
327 </p>
328 </#if>
329 </div>
330 </header>
331 </div>
332 </div>
333 </div>
334</#if>
335
336<!-- https://micromodal.vercel.app/ -->
337<script src="https://unpkg.com/micromodal/dist/micromodal.min.js" async></script>
338<script async>
339 function submitForm(event) {
340 event.preventDefault();
341 var offerId = event.target.getAttribute("offerId");
342 console.log("offerId::::::::::::::"+offerId);
343 var lc = document.getElementById('locationCode').value;
344
345 var url = "${prcaURL}?locationCode=" + lc + "&offerId=" + offerId + "&preparerType=customer";
346
347 document.getElementById('applyForm').action = url;
348 postCreditcardLearnMore(url);
349
350 }
351
352 function postCreditcardLearnMore(path, method='post') {
353 const form = document.createElement('form');
354 form.method = method;
355 //form.target = '_blank';
356 form.action = path;
357 document.body.appendChild(form);
358 form.submit();
359 }
360 AUI().ready(function() {
361 MicroModal.init();
362
363 setTimeout(() => {
364 const svgImages = document.querySelectorAll(".Tier3-Syn-Product-Detail-2024 .dynamic-svg");
365 svgImages.forEach(function (image) {
366 const svgUrl = image.src;
367 fetch(svgUrl)
368 .then(response => response.text())
369 .then(svgContent => {
370 const parser = new DOMParser();
371 const svgElement = parser.parseFromString(svgContent, "image/svg+xml").querySelector("svg");
372 if (svgElement) {
373 image.replaceWith(svgElement); // Replace <img> with the <svg>
374 }
375 })
376 .catch(err => console.error("Error loading SVG:", err));
377
378 });
379 }, 1);
380 });
381</script>
382
383<style>
384 .excludeModal__overlay {
385 position: fixed;
386 top: 0;
387 left: 0;
388 right: 0;
389 bottom: 0;
390 background: rgba(0,0,0,0.6);
391 display: flex;
392 justify-content: center;
393 align-items: center;
394 }
395
396 .excludeModal__container {
397 background-color: #fff;
398 padding: 30px;
399 min-width: 500px;
400 max-width: 500px;
401 max-height: 100vh;
402 border-radius: 4px;
403 overflow-y: auto;
404 box-sizing: border-box;
405 }
406
407 .excludeModal__header {
408 display: block;
409 justify-content: space-between;
410 align-items: center;
411 }
412
413 .modal .excludeModal__container .excludeModal__title {
414 margin-top: 0;
415 margin-bottom: 0;
416 font-weight: normal;
417 font-size: 20px !important;
418 line-height: 1.5 !important;
419 color: #000;
420 box-sizing: border-box;
421 }
422
423 .excludeModal__close {
424 background: transparent;
425 border: 1px solid white;
426 padding: 4px 8px;
427 float: right;
428 }
429
430 .excludeModal__close:hover {
431 border: 1px solid black;
432 }
433
434 .excludeModal__close:before { content: "\2715"; }
435
436 @keyframes mmfadeIn {
437 from { opacity: 0; }
438 to { opacity: 1; }
439 }
440
441 @keyframes mmfadeOut {
442 from { opacity: 1; }
443 to { opacity: 0; }
444 }
445
446 @keyframes mmslideIn {
447 from { transform: translateY(15%); }
448 to { transform: translateY(0); }
449 }
450
451 @keyframes mmslideOut {
452 from { transform: translateY(0); }
453 to { transform: translateY(-10%); }
454 }
455
456 .micromodal-slide {
457 display: none;
458 }
459
460 .micromodal-slide.is-open {
461 display: block;
462 }
463
464 .micromodal-slide[aria-hidden="false"] .excludeModal__overlay {
465 animation: mmfadeIn .3s cubic-bezier(0.0, 0.0, 0.2, 1);
466 }
467
468 .micromodal-slide[aria-hidden="false"] .excludeModal__container {
469 animation: mmslideIn .3s cubic-bezier(0, 0, .2, 1);
470 }
471
472 .micromodal-slide[aria-hidden="true"] .excludeModal__overlay {
473 animation: mmfadeOut .3s cubic-bezier(0.0, 0.0, 0.2, 1);
474 }
475
476 .micromodal-slide[aria-hidden="true"] .excludeModal__container {
477 animation: mmslideOut .3s cubic-bezier(0, 0, .2, 1);
478 }
479
480 .micromodal-slide .excludeModal__container,
481 .micromodal-slide .excludeModal__overlay {
482 will-change: transform;
483 }
484
485 .excludeModal__link {
486 font-size: 18px !important;
487 font-weight: normal;
488 text-decoration: underline !important;
489 }
490
491 .excludeModal__link a:hover {
492 text-decoration: underline !important;
493 }
494
495 #excludeModalDivLink {
496 margin-top: 20px;
497 }
498</style>
499
500<style>
501 :root {
502 --card-image-size: 280px;
503 --left-padding: 30px;
504 --left-width: calc(var(--card-image-size) + var(--left-padding) );
505 --addition-benefits-gap-desktop: 30px;
506 }
507 .Tier3-Syn-Product-Detail-2024 .tab-card {
508 align-items: flex-start;
509 display: flex;
510 flex-wrap: wrap;
511 justify-content: center;
512 max-width: 1336px;
513 margin: 0 20px;
514 }
515 @media (min-width: 870px) {
516 .Tier3-Syn-Product-Detail-2024 .tab-card {
517 flex-wrap: nowrap;
518 padding-bottom: 45px;
519 }
520 }
521 @media (min-width: 1376px) {
522 .Tier3-Syn-Product-Detail-2024 .tab-card {
523 margin: 0 auto;
524 }
525 }
526 @media (min-width: 1336px) {
527 .Tier3-Syn-Product-Detail-2024 .tab-card {
528 align-items: stretch;
529 }
530 }
531
532 .Tier3-Syn-Product-Detail-2024 .tab-card__left {
533 display: flex;
534 align-items: center;
535 flex-direction: column;
536 flex-shrink: 0;
537 width: 100%;
538 padding: 40px 0 10px 0;
539 }
540 @media (min-width: 870px) {
541 .Tier3-Syn-Product-Detail-2024 .tab-card__left {
542 display: block;
543 width: var(--left-width);
544 padding-right: var(--left-padding);
545 }
546 .Tier3-Syn-Product-Detail-2024 .tab-card__left .super-head {
547 display: none;
548 }
549 }
550 .Tier3-Syn-Product-Detail-2024 .tab-card__left img {
551 height: auto;
552 margin: auto;
553 margin-bottom: 20px;
554 display: block;
555 max-height: var(--card-image-size);
556 object-fit: contain;
557 max-width: var(--card-image-size);
558 }
559 #content .Tier3-Syn-Product-Detail-2024 .apply-now-link {
560 width: 168px;
561 padding: 10px 30px;
562 margin-right: auto;
563 margin-left: auto;
564 background-color: var(--ecdma-btn-color);
565 color: #fff;
566 text-transform: capitalize;
567 text-align: center;
568 text-decoration: none;
569 }
570 #content .Tier3-Syn-Product-Detail-2024 .apply-now-link:hover {
571 background-color: var(--ecdma-hover-color);
572 }
573 .Tier3-Syn-Product-Detail-2024 .apply-now-link,
574 .Tier3-Syn-Product-Detail-2024 .reward-calculator-link,
575 .Tier3-Syn-Product-Detail-2024 .transfer-modal-link {
576 display: block;
577 text-align: center;
578 margin-bottom: 10px;
579 }
580
581 .Tier3-Syn-Product-Detail-2024 .tab-card__right {
582 flex-grow: 1;
583 padding: 0 0 40px 0;
584 }
585 @media (min-width: 870px) {
586 .Tier3-Syn-Product-Detail-2024 .tab-card__right {
587 padding: 30px 0 30px 0;
588 }
589 }
590 .Tier3-Syn-Product-Detail-2024 .tab-card__right .super-head {
591 display: none;
592 }
593 @media (min-width: 870px) {
594 .Tier3-Syn-Product-Detail-2024 .tab-card__right .super-head {
595 display: block;
596 }
597 }
598 #content .Tier3-Syn-Product-Detail-2024 .super-head {
599 color: #000;
600 margin-bottom: 18px;
601 }
602 #content .Tier3-Syn-Product-Detail-2024 .super-head--super-script {
603 font-size: 10px;
604 line-height: 13px;
605 }
606 #content .Tier3-Syn-Product-Detail-2024 .tab-card__right .offer-copy p {
607 margin-bottom: 10px;
608 }
609 .Tier3-Syn-Product-Detail-2024 .tab-card__right .offer-copy {
610 color: #000;
611 margin-bottom: 20px;
612 }
613 #content .Tier3-Syn-Product-Detail-2024 .tab-card__right .offer-copy h1,
614 #content .Tier3-Syn-Product-Detail-2024 .tab-card__right .offer-copy h2,
615 #content .Tier3-Syn-Product-Detail-2024 .tab-card__right .offer-copy h3,
616 #content .Tier3-Syn-Product-Detail-2024 .tab-card__right .offer-copy h4,
617 #content .Tier3-Syn-Product-Detail-2024 .tab-card__right .offer-copy h5,
618 #content .Tier3-Syn-Product-Detail-2024 .tab-card__right .offer-copy h6 {
619 color: var(--ecdma-text-color);
620 font-size: 25px;
621 font-style: normal;
622 font-weight: 400;
623 line-height: 1.3;
624 margin-bottom: 8px;
625 }
626 .Tier3-Syn-Product-Detail-2024 .benefits {
627 display: flex;
628 flex-wrap: wrap;
629 gap: 20px;
630 }
631 .Tier3-Syn-Product-Detail-2024 .benefits__item {
632 display: flex;
633 flex-wrap: none;
634 gap: 10px;
635 flex: 1;
636 flex-basis: 100%;
637 }
638 @media (min-width: 870px) {
639 .Tier3-Syn-Product-Detail-2024 .benefits__item {
640 flex-basis: calc(50% - 20px);
641 }
642 }
643 .Tier3-Syn-Product-Detail-2024 .benefits__item .benefitfootnote {
644 font-size: 85%;
645 }
646 .Tier3-Syn-Product-Detail-2024 .benefits__item img {
647 width: 20px;
648 height: 20px;
649 margin-right: 5px;
650 }
651 #content .Tier3-Syn-Product-Detail-2024 .benefits__item h1,
652 #content .Tier3-Syn-Product-Detail-2024 .benefits__item h2,
653 #content .Tier3-Syn-Product-Detail-2024 .benefits__item h3,
654 #content .Tier3-Syn-Product-Detail-2024 .benefits__item h4,
655 #content .Tier3-Syn-Product-Detail-2024 .benefits__item h5,
656 #content .Tier3-Syn-Product-Detail-2024 .benefits__item h6 {
657 color: var(--ecdma-text-color);
658 font-size: 20px;
659 font-style: normal;
660 font-weight: 700;
661 line-height: 1.3;
662 margin-bottom: 8px;
663 }
664 .Tier3-Syn-Product-Detail-2024 .svg-container,
665 .Tier3-Syn-Product-Detail-2024 .benefits__item h1,
666 .Tier3-Syn-Product-Detail-2024 .benefits__item h2,
667 .Tier3-Syn-Product-Detail-2024 .benefits__item h3,
668 .Tier3-Syn-Product-Detail-2024 .benefits__item h4,
669 .Tier3-Syn-Product-Detail-2024 .benefits__item h5,
670 .Tier3-Syn-Product-Detail-2024 .benefits__item h6 {
671 display: inline-block;
672 }
673 #content .Tier3-Syn-Product-Detail-2024 .tab-card__right .offer-copy h2 sup, #content .Tier3-Syn-Product-Detail-2024 .benefits__item h3 sup {
674 font-size: 75%;
675 font-weight: normal;
676 }
677 .Tier3-Syn-Product-Detail-2024 .svg-container svg,
678 .Tier3-Syn-Product-Detail-2024 .svg-container svg rect,
679 .Tier3-Syn-Product-Detail-2024 .svg-container svg circle,
680 .Tier3-Syn-Product-Detail-2024 .svg-container svg ellipse,
681 .Tier3-Syn-Product-Detail-2024 .svg-container svg line,
682 .Tier3-Syn-Product-Detail-2024 .svg-container svg polygon,
683 .Tier3-Syn-Product-Detail-2024 .svg-container svg polyline,
684 .Tier3-Syn-Product-Detail-2024 .svg-container svg path,
685 .Tier3-Syn-Product-Detail-2024 .svg-container svg text,
686 .Tier3-Syn-Product-Detail-2024 .svg-container svg tspan,
687 .Tier3-Syn-Product-Detail-2024 .svg-container svg textPath
688 .Tier3-Syn-Product-Detail-2024 .svg-container svg g,
689 .Tier3-Syn-Product-Detail-2024 .svg-container svg use {
690 fill: var(--ecdma-bg-color) !important;
691 stroke: var(--ecdma-bg-color) !important;
692 }
693 .Tier3-Syn-Product-Detail-2024 .svg-container svg,
694 .Tier3-Syn-Product-Detail-2024 .svg-container img {
695 margin: 0;
696 max-width: 30px;
697 height: 30px;
698 }
699 .additional-benefit-container {
700 background-color: #F7F7F7;
701 padding: 30px 0;
702 margin-bottom: 30px
703 }
704 .Tier3-Syn-Product-Detail-2024 .additional-benefit {
705 max-width: 1336px;
706 margin: 0 20px;
707 }
708 @media (min-width: 1376px) {
709 .Tier3-Syn-Product-Detail-2024 .additional-benefit {
710 margin: 0 auto;
711 }
712 }
713 .Tier3-Syn-Product-Detail-2024 .additional-benefit__layout {
714 display: flex;
715 flex-wrap: wrap;
716 margin: 20px 0;
717 gap: 20px;
718 }
719 @media (min-width: 870px) {
720 .Tier3-Syn-Product-Detail-2024 .additional-benefit__layout {
721 margin: 40px 0;
722 gap: var(--addition-benefits-gap-desktop);
723 }
724 }
725 #content .Tier3-Syn-Product-Detail-2024 .additional-benefit__header {
726 color: #000;
727 text-align: left;
728 font-size: 25px;
729 font-weight: 400;
730 line-height: 1.4;
731 }
732 @media (min-width: 870px) {
733 #content .Tier3-Syn-Product-Detail-2024 .additional-benefit__header {
734 text-align: center;
735 }
736 }
737
738 .Tier3-Syn-Product-Detail-2024 .additional-benefit__item {
739 display: flex;
740 flex-wrap: nowrap;
741 gap: 10px;
742 flex: 1;
743 flex-basis: 100%;
744 }
745 @media (min-width: 870px) {
746 .Tier3-Syn-Product-Detail-2024 .additional-benefit__item {
747 flex-basis: calc(25% - var(--addition-benefits-gap-desktop));
748 }
749 }
750 #content .Tier3-Syn-Product-Detail-2024 .additional-benefit__item h1,
751 #content .Tier3-Syn-Product-Detail-2024 .additional-benefit__item h2,
752 #content .Tier3-Syn-Product-Detail-2024 .additional-benefit__item h3,
753 #content .Tier3-Syn-Product-Detail-2024 .additional-benefit__item h4,
754 #content .Tier3-Syn-Product-Detail-2024 .additional-benefit__item h5,
755 #content .Tier3-Syn-Product-Detail-2024 .additional-benefit__item h6 {
756 color: var(--ecdma-text-color);
757 font-size: 20px;
758 font-style: normal;
759 font-weight: 700;
760 line-height: 1.4;
761 margin-bottom: 10px;
762 }
763 .Tier3-Syn-Product-Detail-2024 .additional-benefit__button .apply-now-link {
764 margin: auto;
765 }
766 @media (min-width: 870px) {
767 .Tier3-Syn-Product-Detail-2024 .additional-benefit__button .apply-now-link {
768 max-width: var(--card-image-size);
769 }
770 }
771</style>
处理模板时发生错误。
The following has evaluated to null or missing:
==> qstringmap["ecdma-lc"] [in template "10154#10192#18387104" at line 5, column 15]
----
Tip: It's the final [] step that caused this error, not those before it.
----
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: #assign lc = qstringmap["ecdma-lc"]?f... [in template "10154#10192#18387104" at line 5, column 1]
----
1<#assign utilServ = (serviceLocator.findService("com.elan.crc.utilites.service.CRCRemoteServiceService"))! />
2<#assign url = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent()/>
3<#assign qstringmap = httpUtil.getParameterMap(httpUtil.getQueryString(url))>
4
5<#assign lc = qstringmap["ecdma-lc"]?first>
6<#assign lc = htmlUtil.escape(lc)>
7<#assign lc = htmlUtil.escapeJS(lc)>
8
9<#assign prefix = "00000" >
10<#assign lcWithPrefix = prefix + lc >
11<#assign withPrefixLength = lcWithPrefix?length >
12<#assign startHere = withPrefixLength - 5>
13<#assign lc = lcWithPrefix?substring(startHere)>
14
15<#assign clientProfileService = (serviceLocator.findService("com.elan.crc.user.service.CrcClientProfileLocalService"))! >
16<#assign clientProfileList = clientProfileService.findByLocationCode(lc)>
17<#if clientProfileList?first?has_content>
18 <#assign clientProfile = clientProfileList?first>
19 <#assign partnerName = clientProfile.getMarketingNameLong()>
20
21 <#assign pbu = clientProfile.getPbu()>
22 <#assign subbu = clientProfile.getSUBBRANDBUNBR()>
23
24 <#assign fultonBankpbu = "0727491">
25 <#if pbu == fultonBankpbu>
26 <style>
27 #hideFultonInfo {
28 display: none;
29 }
30 </style>
31 </#if>
32
33 <#assign fiCardsData = utilServ.makeCall('crcTier3GetPbuData','0&'+ pbu +'&'+subbu)>
34
35
36 <#if (fiCardsData?size > 0)>
37
38 <#list fiCardsData as fib>
39 <#switch fib.offerType>
40 <#case "101">
41 <#assign productURL = "consumer-edr">
42 <#assign productName = "Everyday Rewards+">
43 <#break>
44 <#case "103">
45 <#assign productURL = "consumer-edr">
46 <#assign productName = "Everyday Rewards+">
47 <#break>
48 <#case "104">
49 <#assign productURL = "max-cash">
50 <#assign productName = "Max Cash Preferred Card">
51 <#break>
52 <#case "108">
53 <#assign productURL="consumer-platinum">
54 <#assign productName="Platinum Card">
55 <#break>
56 <#case "109">
57 <#assign productURL="consumer-platinum">
58 <#assign productName="Platinum Card">
59 <#break>
60 <#case "115">
61 <#assign productURL = "secured">
62 <#assign productName = "Secured Card" >
63 <#break>
64 <#case "138">
65 <#assign productURL = "travel-rewards-plus">
66 <#assign productName = "Travel Rewards+" >
67 <#break>
68 <#case "141">
69 <#assign productURL = "college-real-rewards">
70 <#assign productName = "College Real Rewards" >
71 <#break>
72 <#case "147">
73 <#assign productURL = "max-cash-secured">
74 <#assign productName = "Max Cash Secured Card" >
75 <#break>
76 <#case "154">
77 <#assign productURL = "reserve-rewards-plus">
78 <#assign productName = "Reserve Rewards+" >
79 <#break>
80 <#case "121">
81 <#assign productURL = "business-platinum">
82 <#assign productName = "Business Card" >
83 <#break>
84 <#case "128">
85 <#assign productURL = "business-cash-preferred">
86 <#assign productName = "Business Cash Preferred" >
87 <#break>
88 <#case "143">
89 <#assign productURL = "business-real-rewards">
90 <#assign productName = "Business Real Rewards Card" >
91 <#break>
92 <#case "144">
93 <#assign productURL = "smart-business-rewards">
94 <#assign productName = "Smart Business Rewards Card" >
95 <#break>
96 <#default>
97 </#switch>
98 <#if productURL?has_content && url?matches(".*/${productURL}\\?.*")>
99 <script>
100 console.log('offerType', '${fib.offerType}', '${productURL}')
101 </script>
102 <#assign cardProviderAbbreviated = "">
103 <#assign cardProvider = utilServ.makeCall('crcDDCGetMcOrVisa', fib.offerType + '&' + lc)>
104 <#if (cardProvider?size > 0)>
105 <#-- This will be V for visa or M for mastercard. -->
106 <#assign cardProviderAbbreviated = cardProvider[0].cardType>
107 <#else>
108 <script>
109 console.log("No card provider(Visa/Master Card) found for disclaimer");
110 </script>
111 </#if>
112 <#list product.getSiblings() as card>
113 <#if (card.offerType.getData() == fib.offerType)>
114 <div title="${partnerName!''} - Disclaimer" class="page-disclaimer">
115 <div class="page-disclaimer__content">
116 <#if pbuList.getData()?has_content && pbuList.getData()?contains(pbu) && card.disclaimerBank.getData()?has_content>
117 ${card.disclaimerBank.getData()}
118 <#else>
119 <#if (card.disclaimerVisa?has_content && cardProviderAbbreviated?contains('V'))>
120 ${card.disclaimerVisa.getData()}
121 </#if>
122 <#if (card.disclaimerMasterCard?has_content && cardProviderAbbreviated?contains('M')) >
123 ${card.disclaimerMasterCard.getData()}
124 </#if>
125 </#if>
126 </div>
127 </div>
128 <#break>
129 </#if>
130 </#list>
131 <#break>
132 </#if>
133 </#list>
134 </#if>
135</#if>
处理模板时发生错误。
The following has evaluated to null or missing:
==> qstringmap["ecdma-lc"] [in template "10154#10192#18387099" at line 3, column 15]
----
Tip: It's the final [] step that caused this error, not those before it.
----
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: #assign lc = qstringmap["ecdma-lc"]?f... [in template "10154#10192#18387099" at line 3, column 1]
----
1<#assign url = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent()/>
2<#assign qstringmap = httpUtil.getParameterMap(httpUtil.getQueryString(url))>
3<#assign lc = qstringmap["ecdma-lc"]?first>
4<#assign lc = htmlUtil.escape(lc)>
5<#assign lc = htmlUtil.escapeJS(lc)>
6
7<#if (lc?has_content && lc?length gt 5)>
8 <#assign lc = lc[0..4] >
9</#if>
10<#assign lc = lc?web_safe>
11<#assign aDateTime = .now>
12<#assign currentYear = aDateTime?string.yyyy>
13
14
15<footer class="page-footer" id="footerIdAdPlatinum">
16 <div class="page-footer__content">
17 ${footerContent.getData()}
18 </div>
19</footer>
20
21<!-- BEGIN CALIFORNIA OPT-OUT MODAL STYLE AND MARKUP -->
22<script src="https://unpkg.com/micromodal/dist/micromodal.min.js"></script>
23<style>
24 #opt-out-button,
25 .modal__btn.learn-more {
26 background: #0C2074;
27 border: 1px solid #0C2074;
28 color: white;
29 text-transform: uppercase;
30 text-decoration: none;
31 font-size: 16px;
32 padding: 0.5rem 2rem;
33 display: inline-block;
34 border-radius: 0;
35 }
36 #opt-out-button:hover,
37 .modal__btn.learn-more:hover {
38 color: white !important;
39 border-color: #2C76AF !important;
40 background-color: #2C76AF !important;
41 }
42 .modal .modal__btn.learn-more {
43 background: white;
44 border: 1px solid #0C2074;
45 color: #0C2074;
46 text-decoration: none;
47 }
48 #opt-out-button[disabled="true"] {
49 background-color: rgba(0,0,0,.15);
50 color: rgba(0,0,0,.45);
51 border-color: rgba(0,0,0,.25);
52 }
53 #opt-out-button:hover[disabled="true"] {
54 background-color: rgba(0,0,0,.15) !important;
55 color: rgba(0,0,0,.45) !important;
56 border-color: rgba(0,0,0,.25) !important;
57 }
58 #opt-out-button:focus {
59 outline-style: solid;
60 outline-color: white;
61 outline-offset: -3px;
62 outline-width: 1px;
63 }
64 .opt-out-link svg {
65 width: 30px;
66 height: 14px;
67 width: auto;
68 vertical-align: middle;
69 }
70 .modal__overlay {
71 position: fixed;
72 top: 0;
73 left: 0;
74 right: 0;
75 bottom: 0;
76 background: rgba(0,0,0,0.6);
77 display: flex;
78 justify-content: center;
79 align-items: center;
80 }
81
82 .modal__container {
83 background-color: #fff;
84 padding: 30px;
85 max-width: 500px;
86 max-height: 100vh;
87 border-radius: 4px;
88 overflow-y: auto;
89 box-sizing: border-box;
90 }
91
92 .modal__header {
93 display: flex;
94 justify-content: space-between;
95 align-items: center;
96 }
97
98 .modal .modal__container .modal__title {
99 margin-top: 0;
100 margin-bottom: 0;
101 font-weight: 600;
102 font-size: 20px;
103 line-height: 1.25;
104 color: #00449e;
105 box-sizing: border-box;
106 }
107
108 .modal__close {
109 background: transparent;
110 border: 1px solid white;
111 padding: 4px 8px;
112 }
113 .modal__close:hover {
114 border: 1px solid black;
115 }
116
117 .modal__header .modal__close:before { content: "\2715"; }
118
119 .modal__content {
120 margin-top: 2rem;
121 margin-bottom: 2rem;
122 line-height: 1.5;
123 }
124
125 @keyframes mmfadeIn {
126 from { opacity: 0; }
127 to { opacity: 1; }
128 }
129
130 @keyframes mmfadeOut {
131 from { opacity: 1; }
132 to { opacity: 0; }
133 }
134
135 @keyframes mmslideIn {
136 from { transform: translateY(15%); }
137 to { transform: translateY(0); }
138 }
139
140 @keyframes mmslideOut {
141 from { transform: translateY(0); }
142 to { transform: translateY(-10%); }
143 }
144
145 .micromodal-slide {
146 display: none;
147 }
148
149 .micromodal-slide.is-open {
150 display: block;
151 }
152
153 .micromodal-slide[aria-hidden="false"] .modal__overlay {
154 animation: mmfadeIn .3s cubic-bezier(0.0, 0.0, 0.2, 1);
155 }
156
157 .micromodal-slide[aria-hidden="false"] .modal__container {
158 animation: mmslideIn .3s cubic-bezier(0, 0, .2, 1);
159 }
160
161 .micromodal-slide[aria-hidden="true"] .modal__overlay {
162 animation: mmfadeOut .3s cubic-bezier(0.0, 0.0, 0.2, 1);
163 }
164
165 .micromodal-slide[aria-hidden="true"] .modal__container {
166 animation: mmslideOut .3s cubic-bezier(0, 0, .2, 1);
167 }
168
169 .micromodal-slide .modal__container,
170 .micromodal-slide .modal__overlay {
171 will-change: transform;
172 }
173</style>
174
175<div class="modal micromodal-slide" id="modal-1" aria-hidden="true">
176<div class="modal__overlay" tabindex="-1" data-micromodal-close>
177 <div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="modal-1-title">
178 <header class="modal__header">
179 <h2 class="modal__title" id="modal-1-title">
180 Your California privacy choices
181 </h2>
182 <button class="modal__close" aria-label="Close modal" data-micromodal-close></button>
183 </header>
184 <div class="modal__content" id="modal-1-content">
185 <div id="message-no-cookie">
186 <p>
187 We use technologies, such as cookies, that gather information on our website. That information is used for a variety of purposes, such as to understand how visitors interact with our websites, or to serve advertisements on our websites or on other websites. The use of technologies, such as cookies, constitutes a ‘share’ or ‘sale’ of personal information under the California Privacy Rights Act. You can stop the use of certain third-party tracking technologies that are not considered our service providers by clicking on “Opt-Out” below or by broadcasting the global privacy control signal.</p>
188
189<p> </p>
190
191<p>Note that due to technological limitations, if you visit our website from a different computer or device, or clear cookies on your browser that store your preferences, you will need to return to this screen to opt-out and/or rebroadcast the signal. You can find a description of the types of tracking technologies, and your options with respect to those technologies, by clicking “Learn more” below.</p>
192 </div>
193 <div id="message-with-cookie">
194 <p>You have successfully opted-out.</p>
195 </div>
196 </div>
197 <div class="modal__footer">
198 <a href="https://www.myaccountaccess.com/onlineCard/publicPrivacyPolicy.do?phase=privacyPolicy" target="_blank" class="modal__btn learn-more" aria-label="Learn more">Learn More</a>
199 <button id="opt-out-button" class="modal__btn modal__btn-primary" aria-label="Opt Out and Close modal" onclick="window.californiaOptOut()">Opt Out</button>
200 </div>
201 </div>
202</div>
203</div>
204<!-- END CALIFORNIA OPT-OUT MODAL STYLE AND MARKUP -->
205<!-- BEGIN CALIFORNIA OPT-OUT MODAL LOGIC -->
206<script>
207AUI().ready(function() {
208 //this aui.ready prevents from it not showing cali opt out modal due to getting the node before page finished loading.
209 const copyrightNode = document.querySelector('#footerIdAdPlatinum .copyright');
210 const fdicNode = document.querySelector('#footerIdAdPlatinum .fdic');
211 const agreementNode = document.querySelector('#footerIdAdPlatinum .member-agreement');
212 agreementNode.innerHTML= '<a class="text-color-white" href="https://onboarding.elancreditcard.com/usl/generic/credit-card/application/card-member-agreements?locationCode=${lc!''}" target="_blank">Cardmember Agreements</a>';
213 copyrightNode.innerHTML= '© Elan Financial Services ' + ${currentYear};
214 copyrightNode.classList.add('ecdma-footer-client-name-copyright');
215 fdicNode.innerHTML = '<a class="text-color-white" href="https://www.myaccountaccess.com/onlineCard/publicPrivacyPolicy.do?phase=privacyPolicy" target="_blank">Privacy and Security</a>';
216 /* BEGIN CALIFORNIA OPT-OUT MODAL TRIGGER */
217 fdicNode.insertAdjacentHTML('afterend', '<div class="opt-out-container" ><a href="javascript:void(0);" class="opt-out-link" data-micromodal-trigger="modal-1">Your California privacy choices <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 14" xml:space="preserve"><path d="M7.4 12.8h6.8l3.1-11.6H7.4C4.2 1.2 1.6 3.8 1.6 7s2.6 5.8 5.8 5.8z" fill-rule="evenodd" clip-rule="evenodd" fill="#fff"/><path d="M22.6 0H7.4c-3.9 0-7 3.1-7 7s3.1 7 7 7h15.2c3.9 0 7-3.1 7-7s-3.2-7-7-7zm-21 7c0-3.2 2.6-5.8 5.8-5.8h9.9l-3.1 11.6H7.4c-3.2 0-5.8-2.6-5.8-5.8z" fill-rule="evenodd" clip-rule="evenodd" fill="#06f"/><path d="M24.6 4c.2.2.2.6 0 .8L22.5 7l2.2 2.2c.2.2.2.6 0 .8-.2.2-.6.2-.8 0l-2.2-2.2-2.2 2.2c-.2.2-.6.2-.8 0-.2-.2-.2-.6 0-.8L20.8 7l-2.2-2.2c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0l2.2 2.2L23.8 4c.2-.2.6-.2.8 0z" fill="#fff"/><path d="M12.7 4.1c.2.2.3.6.1.8L8.6 9.8c-.1.1-.2.2-.3.2-.2.1-.5.1-.7-.1L5.4 7.7c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0L8 8.6l3.8-4.5c.2-.2.6-.2.9 0z" fill="#06f"/></svg></a></div>');
218 /* END CALIFORNIA OPT-OUT MODAL TRIGGER */
219
220 window.getCookieDomain = function() {
221 var hostname = window.location.hostname.split(".");
222 return hostname && hostname.slice(hostname.length - 2).join(".");
223 }
224 window.setToOptOut = function() {
225 if (window.getCookie('privacy_optout')) {
226 document.getElementById('message-no-cookie').style.display = 'none';
227 document.getElementById('message-with-cookie').style.display = 'block';
228 document.getElementById('opt-out-button').setAttribute('disabled', true)
229 } else {
230 document.getElementById('message-no-cookie').style.display = 'block';
231 document.getElementById('message-with-cookie').style.display = 'none';
232 }
233 }
234 window.getCookie = function(name) {
235 var value = '; ' + document.cookie;
236 var parts = value.split('; ' + name + '=');
237 if (parts.length === 2) return parts.pop().split(';').shift();
238 }
239 window.californiaOptOut = function() {
240 if (!window.getCookie('privacy_optout')) {
241 document.cookie = 'privacy_optout=1; path=/; domain=' + window.getCookieDomain() + '; expires=Thu, 31 Dec 2099 00:00:00 GMT;';
242 try {
243 if (window.CustomEvent) {
244 window.dispatchEvent(new CustomEvent('privacy_optout'));
245 } else {
246 var privacyOptoutEvent = document.createEvent('Event');
247 privacyOptoutEvent.initEvent('privacy_optout', true, true);
248 window.dispatchEvent(privacyOptoutEvent);
249 }
250 window.setToOptOut();
251 } catch (err) {
252 console.error(err);
253 }
254 }
255 }
256 MicroModal.init({
257 onShow: window.setToOptOut
258 });
259
260 // user browser setting for Global Privacy Control to opt out of sharing information with third parties
261 const isBrowserGpcOptOut = navigator.globalPrivacyControl;
262 if(isBrowserGpcOptOut === true) {
263 window.californiaOptOut();
264 }
265 });
266</script>
267<!-- END CALIFORNIA OPT-OUT MODAL LOGIC -->