Publicador de Conteúdos e Mídias

Um erro ocorreu enquanto processava o modelo.
The following has evaluated to null or missing:
==> articleId  [in template "20102#20129#28135110" at line 996, column 160]

----
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: ${articleId}  [in template "20102#20129#28135110" at line 996, column 158]
----
1<style> 
2         
3    body{ 
4        background-color:#e4e4e4; 
5
6     
7    .ssp:not(.liferay-instance) .ssp-card-detalhe-curso__description p { 
8        max-width:830px; 
9
10     
11    .ssp:not(.liferay-instance) .ssp-card-detalhe-curso__title { 
12        max-width:830px; 
13
14     
15    .ssp-card-unidade-curso{ 
16 
17    width: 388px; 
18    height: 514px; 
19    background: #FFFFFF; 
20    box-shadow: 0px 0px 12px #00000010; 
21    opacity: 1; 
22    border-radius: 12px; 
23    padding: 29px 46px; 
24 
25
26 
27    .section-slider-unidades{ 
28        padding: 40px 0 60px 0; 
29        background: #2A2E43; 
30        display: flex; 
31        justify-content:center; 
32
33 
34    .ssp-card-unidade-curso>p{ 
35        margin: 28.56px 0!important; 
36        color:#4f596f!important; 
37        font-weight:600!important; 
38        font-size:16px!important; 
39
40 
41    .ssp-card-unidade-curso a{ 
42        width: 295px; 
43        height: 50px; 
44        display: flex; 
45        align-items: center; 
46        justify-content: center; 
47        margin-bottom: 28.56px; 
48
49 
50    .ssp-card-unidade-curso__nome-unidade{ 
51        display: flex; 
52        color: #78849E; 
53
54 
55    .ssp-card-unidade-curso__nome-unidade p{ 
56        margin: 0!important; 
57        font-size:22px!important; 
58        font-weight: bold!important; 
59
60 
61    .ssp-card-unidade-curso__nome-unidade i{ 
62        font-size: 26px; 
63        margin-right: 11px; 
64
65 
66    .ssp-card-unidade-curso__img-content{ 
67        width: 297px; 
68        height: 235px; 
69        background-color: #78849E; 
70        border-radius: 12px; 
71        margin-top: 24.5px; 
72        background-size: cover; 
73        background-position: center; 
74 
75
76 
77    .ssp-slider-control-mobile { 
78        display: none; 
79
80 
81    /*Card Mobile*/ 
82 
83    @media only screen and (max-width: 1024px) { 
84 
85        .ssp-card-unidade-curso{ 
86 
87            width: 334px; 
88            height: 502px; 
89            border-radius: 12px; 
90            padding: 29px; 
91            margin:12px; 
92 
93
94 
95        .ssp-card-unidade-curso>p { 
96            margin: 28.56px 0!important; 
97            color: #4f596f!important; 
98            font-weight: 600!important; 
99            font-size: 15px!important; 
100
101 
102        .ssp-card-unidade-curso__img-content{ 
103 
104            width: 100%; 
105            height: 242px; 
106            border-radius: 12px; 
107            margin-top: 21.43px; 
108 
109
110 
111        .ssp-card-unidade-curso__nome-unidade>p{ 
112            margin: 0!important; 
113            font-size:18px!important; 
114            font-weight: bold!important; 
115
116 
117        .ssp-card-unidade-curso__nome-unidade i{ 
118            font-size: 22px; 
119            margin-right: 11px; 
120
121 
122         
123        .ssp-slider-control-mobile { 
124            display: flex; 
125            justify-content: space-between; 
126            color: white; 
127
128 
129        .ssp-slider-control-mobile__item-prev { 
130            cursor: pointer; 
131
132 
133         
134        .ssp:not(.liferay-instance) .oferta-slick-area--md-bleed .slick-arrow { 
135            display: none !important; 
136            color: white; 
137            font-size: 14px; 
138            font-weight: normal; 
139        }  
140 
141        .ssp-slider-control-mobile__item-next { 
142            cursor: pointer; 
143            bottom: -30px!important; 
144            right: 25px!important; 
145            width: auto!important; 
146            height: auto!important; 
147
148 
149        .ssp-slider-control-mobile__item-prev { 
150            cursor: pointer; 
151            bottom: -30px!important; 
152            left: 25px!important; 
153            width: auto!important; 
154            height: auto!important; 
155
156         
157
158 
159 
160    /* Form de Aprendizagem */ 
161 
162    [data-modal="modal"]{ 
163        background-color: rgba(0,0,0,0.7); 
164        backdrop-filter: blur(10px); 
165        display:none; 
166
167 
168    [data-modal="close-form-modal"]{ 
169 
170        font-size: 22px; 
171        background: unset!important; 
172        color: white!important; 
173        display: flex; 
174        align-items: center; 
175        margin: 0; 
176        padding: 0; 
177        position:absolute; 
178        right:0; 
179        border:0; 
180        gap:5px; 
181        right: 2%; 
182        top: -2%; 
183 
184
185 
186    [data-modal="close-form-modal"] i{ 
187 
188        font-size:43px; 
189        height:fit-content; 
190 
191
192 
193    .open-modal-form{ 
194        position: fixed; 
195        top: 0; 
196        width: 100%; 
197        height: 100%; 
198        z-index: 100; 
199        display: flex; 
200        justify-content: center; 
201        align-items: center; 
202        overflow:auto; 
203 
204
205 
206    .open-modal-form .ssp_ct_form_programe{ 
207        animation-name: animatetop; 
208        animation-duration: .4s; 
209        position:relative; 
210
211 
212    .ssp_ct_form_programe .lfr-ddm__default-page-header{ 
213        display:none; 
214
215 
216 
217    label .reference-mark { 
218        color:#78849e; 
219
220    .lexicon-icon-asterisk { 
221        color:#78849e; 
222
223    .lexicon-icon-reload { 
224        margin-left:10px; 
225
226    .ssp_title_form_programe{ 
227        font-size: 42px!important; 
228        color: #ffffff!important; 
229        font-family: "Montserrat",sans-serif; 
230        font-weight:600; 
231        text-align:left; 
232
233    .ssp_subtitle_form_programe { 
234        margin-top:0px!important; 
235 
236
237    .ssp_subtitle_form_programe{ 
238        font-size: 20px!important; 
239        color: #ffffff!important; 
240        font-family: "Montserrat",sans-serif; 
241        font-weight:600; 
242        text-align:left; 
243
244    .lfr-ddm-form-page { 
245        background-color: #fff; 
246        border-radius: 12px 12px 0px 0px; 
247        padding: 35px 15px!important; 
248
249    .ssp:not(.liferay-instance) .form-group label { 
250        color: #78849E; 
251        font: normal normal 600 16px/19px Montserrat; 
252        padding-bottom: 10px; 
253
254    .lfr-ddm-form-page-description {  
255        display: none!important; 
256
257    .lfr-ddm-form-page-title { 
258        display: none!important; 
259
260    .lfr-ddm-form-submit { 
261        background-color: #0380F0; 
262        text-align: center; 
263        float: none!important; 
264        border: 1px solid #0380F0; 
265        border-radius: 6px; 
266        font-size: 16px; 
267        width: 245px; 
268        height: 50px; 
269
270    .lfr-ddm-form-pagination-controls { 
271        background-color: #fff; 
272        text-align: center; 
273        border-radius: 0px 0px 12px 12px; 
274        padding-bottom: 25px; 
275
276    .ddm-form-name { 
277        display: none!important; 
278
279    .ddm-form-description { 
280        display: none!important; 
281
282    .ddm-form-builder-app { 
283        margin-top:35px; 
284
285    .taglib-captcha { 
286        display: flex; 
287
288    .input-text-wrapper { 
289        left: 20px; 
290
291    .lfr-ddm-form-pagination-controls { 
292        padding-top:0px!important; 
293        display:flex; 
294        justify-content:center; 
295        align-items: center; 
296        flex-flow:column; 
297
298 
299@media only screen and (max-width: 1024px) { 
300 
301    .open-modal-form{ 
302 
303        align-items: flex-start; 
304 
305    }   
306 
307    .ddm-form-builder-app { 
308        margin-top: 15px; 
309
310 
311    .ssp_title_form_programe{ 
312        font-size: 34px!important; 
313        line-height: 1.2!important; 
314
315    .ssp_subtitle_form_programe{ 
316        font-size:18px!important; 
317
318    .taglib-captcha { 
319        display:block; 
320
321    .input-text-wrapper { 
322        left:0; 
323
324    .ssp_ct_form_programe { 
325        padding:0px; 
326        max-width:100%; 
327        padding:40px 20px; 
328
329 
330    [data-modal="close-form-modal"]{ 
331 
332        right: 20px; 
333        top: 0; 
334 
335
336 
337
338 
339.slick-area__item { 
340            display: flex; 
341            flex-basis: auto; 
342
343 
344        .slick-initialized .slick-track { 
345            display: flex; 
346
347 
348        .slick-initialized .slick-slide { 
349            height: inherit!important; 
350            display: flex; 
351
352 
353  @media only screen and (max-width: 550px) { 
354 
355        .slick-initialized .slick-track { 
356      display: flex; 
357
358 
359    .slick-initialized .slick-slide { 
360      height: inherit!important; 
361      display: flex; 
362      min-height: 440px; 
363
364 
365
366 
367  /* Prev and next Mobile button */ 
368 
369 
370.prev-mobile{ 
371    color: white; 
372    display: flex; 
373    align-items: center; 
374    text-decoration: none; 
375    text-decoration: none!important; 
376
377 
378.prev-mobile:hover{ 
379    color: white; 
380    font-weight: normal!important; 
381
382 
383.prev-mobile::after{ 
384    font-family: "Montserrat", sans-serif; 
385    content: "Anterior"; 
386    font-weight: 600; 
387    font-size: 14px; 
388    display: block; 
389    margin-left: 9px; 
390    color: white; 
391
392 
393.prev-mobile.slick-arrow.slick-disabled{ 
394    opacity: 0.4; 
395
396 
397.next-mobile{ 
398    color: white; 
399    display: flex; 
400    align-items: center; 
401    text-decoration: none!important; 
402
403 
404.next-mobile:hover{ 
405    color: white; 
406    font-weight: normal!important; 
407
408 
409.next-mobile::before{ 
410    font-family: "Montserrat", sans-serif; 
411    content: "Próxima"; 
412    font-size: 14px; 
413    font-weight: 600; 
414    display: block; 
415    margin-right: 9px; 
416    color: white; 
417
418 
419.next-mobile.slick-arrow.slick-disabled{ 
420    opacity: 0.4; 
421
422@media screen and (min-width: 767px){ 
423   
424  .ssp-modal-local-realizacao{ 
425      width: 480px!important; 
426
427    
428   .ssp-modal-local-realizacao__title{ 
429    color:#01488C !important; 
430    text-align: center!important; 
431        margin-left: -23px!important; 
432
433   
434  .ssp:not(.liferay-instance) .ssp-modal-local-realizacao__title { 
435      font-size: 14pt; 
436
437   
438
439 
440@media only screen and (max-width: 768px){ 
441 
442    .ssp:not(.liferay-instance) .ssp-card-oferta-curso__dia-hora-item__dia {  
443        font-size: 16px; 
444
445 
446    .ssp:not(.liferay-instance) .ssp-modal-local-realizacao__title { 
447      font-size: 16pt; 
448
449 
450 
451 
452
453 
454.ssp:not(.liferay-instance) .ssp-card-oferta-curso__dia-hora-item { 
455      border-radius: 0; 
456      background-color: unset; 
457      padding: 0; 
458      max-width: 100%; 
459      width: 100%; 
460      margin: 0; 
461
462 
463.ssp:not(.liferay-instance) .ssp-card-oferta-curso__dia-hora-item__dia { 
464      margin: 0; 
465      font-size: 17px; 
466      font-weight: bold; 
467      font-stretch: normal; 
468      font-style: normal; 
469      line-height: 1.23; 
470      letter-spacing: normal; 
471      text-align: center; 
472
473 
474  .ssp:not(.liferay-instance) .ssp-card-oferta-curso__dia-hora_content{ 
475      margin:0; 
476      opacity: 0; 
477      transition: 0.3s; 
478
479 
480  .content-data-dias{ 
481 
482    padding:20px; 
483    border-bottom: 1px #E4E8F0 solid; 
484    margin-bottom: 17px; 
485 
486
487 
488  .container-local-realizacao { 
489      padding:0; 
490      border:0; 
491      border-radius: unset; 
492      width: 100%; 
493      margin: 10px 0 0 0; 
494      box-shadow: none; 
495      display: flex; 
496      justify-content:center; 
497      align-items: flex-end; 
498
499 
500  .ssp:not(.liferay-instance) .ssp-card-oferta-curso__local-realizacao-content__title { 
501    font-size: 13px; 
502    color: #00488C; 
503    font-weight: 600; 
504    text-decoration: none!important; 
505    border: 1px solid #00488C; 
506    padding: 11px 14px; 
507    transition:.3s; 
508    border-radius: 4px; 
509
510   
511  .ssp:not(.liferay-instance) .ssp-card-oferta-curso__local-realizacao-content__title:hover { 
512      color: #FC9F34; 
513      font-weight: 600!important; 
514      opacity: .7; 
515  }  
516 
517  .ssp-modal-local-realizacao__title{ 
518    color:#01488C !important; 
519    text-align: center!important; 
520
521 
522  h6.ssp-modal-local-realizacao__title::after { 
523    content: ""; 
524    display: block; 
525    width: 20%; 
526    padding-top: 10px; 
527    border-bottom: 1px solid #01488C; 
528    transition: .5s; 
529    margin:auto; 
530
531 
532  .ssp-modal__local-realizacao-content__icon-wifi{ 
533    display: flex; 
534    margin-right: 2px 
535
536 
537  .ssp:not(.liferay-instance) .ssp-modal__local-realizacao-content__icon-wifi::after { 
538    font-family: "Font Awesome 5 Free"; 
539    content: '\f1eb'; 
540    font-weight: 600; 
541    color: #00488c; 
542    font-size: 9pt; 
543    font-style: normal; 
544    margin-right: 10px; 
545
546 
547  .ssp:not(.liferay-instance) .ssp-modal__local-realizacao-content__icon-chalkboard-teacher::after { 
548    font-family: "Font Awesome 5 Free"; 
549    content: '\f51c'; 
550    font-weight: 600; 
551    color: #00488c; 
552    font-size: 16pt; 
553    font-style: normal; 
554    margin-left: -16px; 
555
556 
557 .ssp-modal-local-realizacao__texto{ 
558    text-align:center!important; 
559
560 
561 /* Troca cor fonte (solicitação gcr) - ajuste 4 - Tarefa 9525**/ 
562 .ssp:not(.liferay-instance) .ssp-bolsa-formulario__card-aviso-texto > p { 
563     
564    color: #474F61 !important; 
565
566 
567/* CSS filtro inscrições abertas e unidades por região - tarefa 10090**/ 
568.ssp-filters-px { 
569  padding: 0 80px; 
570
571 
572    /* Slider **/ 
573    .ssp-switch { 
574    position: relative; 
575    display: inline-block; 
576    width: 63px; 
577    height: 32px; 
578
579 
580    .ssp-switch input {  
581    opacity: 0; 
582    width: 0; 
583    height: 0; 
584
585 
586    .ssp-switch-label { 
587    margin: auto 15px; 
588    font: normal normal 600 16px/19px Montserrat; 
589    letter-spacing: 0px; 
590    color: #FFFFFF; 
591    white-space: nowrap; 
592
593 
594    .ssp-switch-label-section { 
595    font: normal normal 600 18px/22px Montserrat; 
596    margin-bottom: 11px; 
597
598 
599    .ssp-switch-label-message { 
600    font: normal normal medium 16px/19px Montserrat !important; 
601    letter-spacing: 0px; 
602    color: #FFFFFF; 
603    margin-top: 16px; 
604    padding-left: 25px; 
605    padding-right: 25px; 
606
607 
608    .ssp-switch-divider { 
609    border-bottom: 1px solid #4a4d5f; 
610    width: 100%; 
611
612    .ssp-switch-slider { 
613    position: absolute; 
614    cursor: pointer; 
615    top: 0; 
616    left: 0; 
617    right: 0; 
618    bottom: 0; 
619    background-color: #00000000; 
620    border: 1px solid #FFFFFF; 
621    -webkit-transition: .4s; 
622    transition: .4s; 
623
624 
625    .ssp-switch-slider:before { 
626    position: absolute; 
627    content: ""; 
628    height: 21px; 
629    width: 21px; 
630    left: 4px; 
631    bottom: 4px; 
632    background-color: white; 
633    -webkit-transition: .4s; 
634    transition: .4s; 
635
636 
637    input:checked + .ssp-switch-slider { 
638    background-color: #5ACC75; 
639    border: 1px solid #5ACC75; 
640
641    input:checked + .ssp-switch-slider-secondary { 
642    background-color: #2967F4; 
643    border: 1px solid #2967F4; 
644
645 
646    input:focus + .ssp-switch-slider { 
647    box-shadow: 0 0 1px #5ACC75; 
648
649    input:focus + .ssp-switch-slider-secondary { 
650    box-shadow: 0 0 1px #2967F4; 
651
652 
653    input:checked + .ssp-switch-slider:before { 
654    -webkit-transform: translateX(33px); 
655    -ms-transform: translateX(33px); 
656    transform: translateX(33px); 
657
658 
659    /* Rounded sliders */ 
660    .ssp-switch-slider.round { 
661    border-radius: 34px; 
662
663 
664    .ssp-switch-slider.round:before { 
665    border-radius: 50%; 
666
667 
668    .ssp-switch-label { 
669        margin: auto 15px; 
670        font: normal normal 600 16px/19px Montserrat; 
671        letter-spacing: 0px; 
672        color: #FFFFFF; 
673        white-space: nowrap; 
674
675 
676    .ssp-switch-label-section { 
677        font: normal normal 600 18px/22px Montserrat; 
678        margin-bottom: 11px; 
679
680 
681    .ssp-switch-label-message { 
682        font: normal normal medium 16px/19px Montserrat !important; 
683        letter-spacing: 0px; 
684        color: #FFFFFF; 
685        margin-top: 16px; 
686        padding-left: 25px; 
687        padding-right: 25px; 
688
689 
690    @media screen and (max-width: 1199px){ 
691	 .ssp-filters-px { 
692	    padding: 0 !important; 
693
694	  .ssp-switch-label { 
695	    margin: auto 0 !important; 
696
697	  .ssp-switch-label-message { 
698	    margin-top: 10px; 
699	    margin-bottom: 10px; 
700	    padding-right: 0 !important; 
701	    padding-left: 0 !important; 
702
703	  .ssp-container-selecione-unidade [name="unidades-ofertas"] { 
704	    max-width: 316px!important; 
705
706	  .ssp-detalhe-curso-titulo-filter { 
707	    font-size: 16px !important; 
708
709
710 
711    .ssp-option-group { 
712        text-align: left; 
713        font: normal normal 600 15px/19px Montserrat; 
714        letter-spacing: 0px; 
715        color: #004A8C; 
716
717</style> 
718 
719 
720<#assign prefix = "ssp" /> 
721<#--  Iterate the list with  --> 
722<#assign vocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") /> 
723<#assign normalizer = serviceLocator.findService("com.liferay.portal.kernel.util.FriendlyURLNormalizer") /> 
724 
725<#assign defaultImage = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTuyJZ_Ky8o9kn0wiBy4mp5-3sb7xei_WudTL_3Jo6yvWmzQHuK&s" /> 
726 
727<#function getStringValue dom name> 
728        <#assign 
729        seletorSTR = "dynamic-element[@field-reference='"+name+"']" 
730        xPathSelector = saxReaderUtil.createXPath(seletorSTR) 
731        /> 
732        <#if xPathSelector.selectSingleNode(dom)?? > 
733        <#assign 
734            valueSTR = xPathSelector.selectSingleNode(dom).getStringValue()?trim 
735        /> 
736        <#return valueSTR> 
737        </#if> 
738        <#return ''> 
739  </#function> 
740 
741    <#list entries![] as entry> 
742 
743        <#assign renderer = entry.getAssetRenderer() /> 
744        <#assign document = saxReaderUtil.read(renderer.getArticle().getContent()) /> 
745        <#assign rootElement = document.getRootElement() /> 
746        <#assign journalArticle = renderer.getArticle() /> 
747 
748             
749 
750                    <#-- Get fields --> 
751 
752                    <#assign 
753 
754                        <#--  Codigo FT  --> 
755                        codigoFT = getStringValue(rootElement,'codigoFT') 
756 
757                        <#--  Data Efetiva  --> 
758                        xPathSelectorDataEfetiva = saxReaderUtil.createXPath("dynamic-element[@field-reference='dataEfetivaFT']") 
759                         
760                        dataEfetiva = xPathSelectorDataEfetiva.selectSingleNode(rootElement)  
761 
762                        dataEfetivaSTR = dataEfetiva.elementText("dynamic-content")?string 
763 
764                        <#--  Title  --> 
765                        tituloCurso = journalArticle.getTitle() 
766 
767                        <#--  Objetivo  --> 
768                        xPathSelectorObjetivoCurso = saxReaderUtil.createXPath("dynamic-element[@field-reference='objetivoComercial']") 
769 
770                        objetivo = xPathSelectorObjetivoCurso.selectSingleNode(rootElement).getStringValue() 
771 
772                        <#--  Carga Horária  --> 
773 
774                        xPathSelectorCargaHoraria = saxReaderUtil.createXPath("dynamic-element[@field-reference='cargaHorariaTotalFT']") 
775 
776                        cargaHoraria = xPathSelectorCargaHoraria.selectSingleNode(rootElement).getStringValue()?trim 
777 
778                         
779 
780                    /> 
781 
782                    <#if codigoFT?? && dataEfetivaSTR??> 
783                        <#assign searchImpl = serviceLocator.findService("br.senac.search.api.Search") /> 
784                        <#assign articles = searchImpl.search("Curso", {"codigoFT_pt_BR":codigoFT,"dataEfetivaFT":dataEfetivaSTR}, themeDisplay.getCompanyId(), themeDisplay.getScopeGroupId(), themeDisplay.getUserId(), false) /> 
785									 
786												 <#list articles![] as article> 
787                            <#assign articleId = article.getArticleId()> 
788                        </#list> 
789										 
790                    </#if> 
791 
792 
793                    <#assign xPathSelector = saxReaderUtil.createXPath("dynamic-element[@field-reference='imagemComercial']")> 
794 
795                        <#assign imagemStr = xPathSelector.selectSingleNode(rootElement).getStringValue()> 
796                         
797                        <#if imagemStr?contains("{") > 
798                            <#assign 
799                                imagemJson = jsonFactoryUtil.createJSONObject(imagemStr) 
800                                imagemId = getterUtil.getInteger(imagemJson.get('fileEntryId')) 
801                                imagemDescricao = imagemJson.get('alt') 
802                                dl = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppService") 
803                                dlURLHelper = serviceLocator.findService("com.liferay.document.library.util.DLURLHelper") 
804                                fileEntry = dl.getFileEntry(imagemId) 
805                                <#--  imagemUrl = dlURLHelper.getImagePreviewURL(fileEntry, themeDisplay)   --> 
806                                <#--  faz o get da imagem em alta qualidade  --> 
807                                 imagemUrl = dlURLHelper.getDownloadURL(fileEntry, fileEntry.getFileVersion(), themeDisplay,null) 
808                            /> 
809                            <#else> 
810                                <#assign imagemUrl = ""> 
811                        </#if> 
812 
813                    <#--  Header Curso  --> 
814 
815                    <div class="${prefix}-header-curso__image" style="background-image:url(${imagemUrl})"> 
816 
817 
818                        <#list entry.getCategories()![] as category> 
819 
820                            <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim /> 
821 
822                            <#if normalizer.normalize(vocabularyName) == "tipo-de-curso"> 
823 
824                                <#assign normalizedCategoryName = normalizer.normalize(category.getName()) /> 
825 
826                                <div class="${prefix}-header-curso__tag-formato bg-nivel-${normalizedCategoryName}"> 
827 
828                                    <#list entry.getCategories()![] as category> 
829                                     
830 
831                                        <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim /> 
832 
833                                            <#if normalizer.normalize(vocabularyName) == "tipo-de-curso"> 
834                                                <#assign normalizedCategoryName = normalizer.normalize(category.getName()) /> 
835                                                <span>${category.getName()}</span> 
836                                            </#if> 
837 
838                                    </#list> 
839 
840                                </div> 
841 
842                            </#if> 
843                        </#list>     
844 
845 
846                    </div> 
847 
848                        <#--  Detalhe de Curso  --> 
849 
850                        <section id="curso-info"> 
851 
852                            <div class="ssp-card-detalhe-curso__container"> 
853                                 
854                                <div class="ssp-card-detalhe-curso"> 
855 
856                                    <#list entry.getCategories()![] as category> 
857 
858                                        <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim /> 
859 
860                                            <#if normalizer.normalize(vocabularyName) == "tipo-de-curso"> 
861 
862                                                <#assign normalizedCategoryName = normalizer.normalize(category.getName()) /> 
863 
864                                                <div class="ssp-card-detalhe-curso__tag-color-tipo bg-nivel-${normalizedCategoryName}"></div> 
865 
866                                            </#if> 
867 
868                                    </#list>  
869 
870                                     
871 
872                                    <div class="container"> 
873 
874                                        <div class="ssp-card-detalhe-curso__content"> 
875 
876                                            <div> 
877 
878                                                <h1 class="ssp-card-detalhe-curso__title">${tituloCurso}</h1> 
879                                                <span class="ssp-card-detalhe-curso__description">${objetivo}</span> 
880 
881                                            </div> 
882 
883                                            <div class="ssp-card-detalhe-curso__secunday-info-content"> 
884 
885                                                <#list entry.getCategories()![] as category> 
886                                     
887 
888                                                    <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim /> 
889 
890                                                        <#if normalizer.normalize(vocabularyName) == "tipo-de-curso"> 
891                                                            <#assign normalizedCategoryName = normalizer.normalize(category.getName()) /> 
892                                                            <a class="ssp-card-detalhe-curso__secunday-info-back-link d-lg-none d-md-none" href="#">${category.getName()}</a>  
893                                                        </#if> 
894 
895                                                </#list>  
896 
897                                                <#if cargaHoraria?length != 0>      
898                                                    <p class="ssp-card-detalhe-curso__secundary-info-carga-horaria">${cargaHoraria}</p> 
899                                                </#if> 
900                                                 
901                                            </div> 
902 
903                                        </div> 
904                                         
905                                            <div class="ssp-saiba-mais-curso-accordion"> 
906 
907                                                <#--  Get no campo repeatable  --> 
908                                                <#assign topicoItemRepeatableNode = document.getRootElement().selectNodes("//dynamic-element[@field-reference='topicoItemFieldSet']") /> 
909																					 
910                                                <#--  Lista de cardsUnidades  --> 
911                                                <#list topicoItemRepeatableNode as itemTopico> 
912 
913                                                    <#--  ìcone Slider  --> 
914                                                    <#assign tituloTopico = itemTopico.selectSingleNode("dynamic-element[@field-reference='tituloTopico']").getStringValue()?trim> 
915 
916                                                    <#--  Nome da Unidade  --> 
917                                                    <#assign descTopico = itemTopico.selectSingleNode("dynamic-element[@field-reference='descTopico']").getStringValue()?trim> 
918 
919                                                    <div class="ssp-saiba-mais-curso-accordion__body">          
920                                                        <div class="ssp-saiba-mais-curso-accordion__heading">${tituloTopico}</div> 
921                                                        <div class="ssp-saiba-mais-curso-accordion__contents">${descTopico}</div> 
922                                                    </div> 
923 
924                                                </#list> 
925 
926                                            </div>                                             
927 
928                                    </div>                   
929                                                 
930                                </div> 
931                            </div>  
932 
933                             <!-- Confira as novas turmas --> 
934 
935                             <section class="ssp-section-novas-turmas" style="background: #2a2e43;"> 
936                                <div class="container"> 
937 
938                                    <h3 class="ssp-section-title ssp-card-oferta-curso__section-title" style="margin: 24px 0;">Confira as unidades com vagas disponíveis</h3> 
939 
940                                    <div class="row ssp-filters-px justify-content-center"> 
941                                        <div class="col-12 col-lg px-md-0 order-1"> 
942                                            <div class="ssp-container-selecione-unidade row no-gutters"> 
943                                              <div class="col-12"> 
944                                                <div class="ssp-container__form-select mx-auto"> 
945                                                    <label for="unidades-ofertas" class="ssp-switch-label ssp-switch-label-section mx-0 d-none d-lg-block">Selecione uma unidade:</label> 
946                                                    <select id="unidades-ofertas" class="form-control" name="unidades-ofertas"> 
947                                                        <option value="">Selecione uma unidade</option> 
948                                                    </select> 
949                                                </div> 
950                                              </div> 
951                                            </div> 
952                                        </div> 
953 
954                                        <div id="ssp-alternadores" class="col mt-5 mt-lg-0 px-md-0 order-3 order-lg-2" style="max-width: 480px;"> 
955                                            <div class="row no-gutters ssp-switch-label ssp-switch-label-section mx-0">Filtre por:</div> 
956                                            <div class="row no-gutters mt-4"> 
957                               
958                                                <div class="col-12 col-lg"> 
959                                                  <div class="d-flex justify-content-between justify-content-lg-start"> 
960                                                    <label class="ssp-switch order-2 order-lg-1"> 
961                                                      <input type="checkbox" id="chkInscricao"> 
962                                                      <span class="ssp-switch-slider round"></span> 
963                                                    </label> 
964                                                    <label for="chkInscricao" class="ssp-switch-label order-1 order-lg-2">Inscrições abertas</label>   
965                                                  </div> 
966                                                </div> 
967                                                 
968                                                <div class="ssp-switch-divider d-md-none my-4"></div> 
969                               
970                                            </div> 
971                                        </div> 
972 
973                                        <div class="col-12 order-2 order-lg-3"> 
974                                            <div class="row text-center text-lg-left"> 
975                                              <div id="msgFiltroAplicado" class="col-12 ssp-switch-label-message" style="display: none;"> 
976                                                <div class="row no-gutters"> 
977                                                  <span class="col-12 ssp-col-lg-without">Filtro aplicado com sucesso! Confira o resultado.</span> 
978                                                </div> 
979                                              </div> 
980                                            </div> 
981                                        </div> 
982                                     
983                                    </div> 
984 
985                                    <div class="ssp-ofertas__box-endereco-unidade d-none"> 
986                                        <i class="icon-map-adress"></i> 
987                                        <a href="" target="_blank" class="ssp-ofertas__endereco-unidade"></a> 
988                                    </div> 
989 
990                                </div> 
991 
992                            </section> 
993 
994                            <input type="hidden" name="codigoFT" value="${codigoFT}" /> 
995                            <input type="hidden" name="dataEfetivaSTR" value="${dataEfetivaSTR}" /> 
996														<input type="hidden" name="articleId" value="${articleId}" />											 
997                             
998 
999                            <#-- Section para listar as ofertas - 9525 -28/02/2022--> 
1000                            <section id="ssp-section-response" class="ssp-section" style="background: #2a2e43; position: relative;"> 
1001 
1002                                    <div id="turmas-container" class="container"> 
1003                                 
1004                                        <div id="informe-novas-turmas"> 
1005                                            <div style="display: flex; flex-wrap: nowrap;"> 
1006                                     
1007                                                <a class="prev-mobile d-lg-none d-xl-none nextPrevOpacity" href="#" > 
1008                                                <i class="fas fa-chevron-left"></i> 
1009                                                </a> 
1010                                     
1011                                                <h2 id="ssp-h3-turmas" class="ssp-section-title ssp-card-oferta-curso__section-title text-capitalize" style="font-weight: bold;text-transform: uppercase; display: none;">Turmas</h2> 
1012                                     
1013                                                <a href="#" class="next-mobile d-lg-none d-xl-none" > 
1014                                                <i class="fas fa-chevron-right"></i> 
1015                                                </a> 
1016                                     
1017                                            </div> 
1018                                         
1019                                     
1020                                            <div  class="oferta-slick-area oferta-slick-area--md-bleed slider-container"> 
1021                                         
1022                                            </div> 
1023                                        </div> 
1024 
1025                                        <div class="ssp-card-oferta-curso__sem-vaga d-none" style="margin: auto;"> 
1026                                     
1027                                            <h3 class="ssp-card-oferta-curso__sem-vaga-title"> 
1028                                                Poxa... Estamos sem turmas agendadas no momento. 
1029                                            </h3> 
1030                                         
1031                                            <p class="ssp-card-oferta-curso__sem-vaga-description"> 
1032                                                Mas, registre seu interesse aqui embaixo e avisamos você quando surgirem novas turmas.  
1033                                            </p> 
1034                                        </div> 
1035                                         
1036                                        <p class="ssp-card-oferta-curso__mensagem-legal" style="margin: 0px 0 0 0;">A turma pode ser cancelada ou ter alterações do número de vagas, datas e horários.<p> 
1037                                         
1038                                        <div class="oferta-slick-area_modal"> 
1039                                        </div> 
1040                                    </div> 
1041                                 
1042                                    <div id="ssp-abrir-pagina-bolsa" class="ssp-card-duvida__bolsa-estudo d-none" style="margin-top: 44px;"> 
1043 
1044                                        <p>Tem dúvidas sobre bolsas de estudo?</p> 
1045                                        <a href="/bolsas-de-estudo/como-funciona">Saiba como funciona</a> 
1046 
1047                                    </div> 
1048                                 
1049                            </section> 
1050 
1051                            <!-- Aviso para curso de aprendizagem --> 
1052                            <div id="aviso-curso-aprendizagem" class="ssp-bolsa-formulario__card-aviso-atencao d-none" style="width: 100%;"> 
1053             
1054                                <i class="fas fa-exclamation-circle ssp-bolsa-formulario__card-aviso-atencao-icon" aria-hidden="true"></i> 
1055                             
1056                                <div class="ssp-bolsa-formulario__card-aviso-texto"> 
1057                                    <p>O programa é gratuito para empresas contribuintes do Senac.</p>  
1058                                    <p>Para contratar aprendiz, preencha o formulário e entraremos em contato.</p> 
1059                                  </div> 
1060                             
1061                            </div> 
1062 
1063 
1064                        <!-- modal form de aprendizagem --> 
1065 
1066                        <#assign formId = 48097883 /> 
1067                        <!-- formInstanceId é variável de acordo com o ID do formulário --> 
1068                        <#assign formPreferences = {"displayDepth": "1", "portletSetupPortletDecoratorId": "barebone", "formInstanceId": "formId"}/> 
1069                        <section class="ssp-section ssp-section-lg-bottom" data-modal="modal"> 
1070                     
1071                            <div class="container ssp_ct_form_programe"> 
1072 
1073                                <button type="button" data-modal="close-form-modal"> 
1074                                fechar 
1075                                <i class="fas fa-times"></i> 
1076                                </button> 
1077                             
1078                                <@liferay_portlet["runtime"] 
1079                                portletName="com_liferay_dynamic_data_mapping_form_web_portlet_DDMFormPortlet" 
1080                                defaultPreferences=freeMarkerPortletPreferences.getPreferences(formPreferences) 
1081                                />   
1082                                     
1083                            </div>    
1084 
1085                        </section> 
1086 
1087    </#list> 
1088 
1089                                                                 
1090    <script> 
1091 
1092            const codigoFT = $('[name="codigoFT"]').val(); 
1093            const dataEfetiva = $('[name="dataEfetivaSTR"]').val(); 
1094            const articleId = $('[name="articleId"]').val(); 
1095            var ofertasMap = new Map(); 
1096            var groupId = themeDisplay.getScopeGroupId(); 
1097            var startOfertaParam = 0; 
1098            var endOfertaParam = 16; 
1099            var regIndex = new RegExp('\{index\}', 'g'); 
1100 
1101            var objsTela = { 
1102                    unidades: [], 
1103                    categoriesIds:[] 
1104            }; 
1105 
1106            var urlSearchCursoInfo = '/o/senac-content-services/cursosInfoDetalhe/{groupId}/{cursosInfo}?inscricaoAberta={inscricaoAberta}&bolsaAberta={bolsaAberta}'; 
1107            var urlUnidadeInfoDetalhe = '/o/senac-content-services/unidadeInfoDetalhe/{companyId}/{codigoUnidade}'; 
1108            var urlSearchOferta = '/o/senac-oferta-services/ofertasPorCategoryIds/' + groupId 
1109 
1110            $(document).ready(function(){ 
1111                 
1112 
1113                const urlParams = new URLSearchParams(window.location.search); 
1114                $('#chkInscricao').prop("checked", urlParams.get('inscricao') == 'true'); 
1115                $('#chkInscricao').change(ev => selectFilter('inscricao', $('#chkInscricao')) ); 
1116 
1117                loadUnidades(true,"") 
1118 
1119                $(".next-mobile").on("click",function(e){  
1120                    e.preventDefault();  
1121                         
1122                    acoesMobileSliderOfertas("left"); 
1123                }); 
1124                     
1125                $(".prev-mobile").on("click",function(e){  
1126                    e.preventDefault();  
1127                     
1128                    acoesMobileSliderOfertas("right");	 
1129                }); 
1130                     
1131                    //ação de drag do card de ofertas no mobile 
1132                $('.oferta-slick-area').on('swipe', function(event, slick, direction){ 
1133                    acoesMobileSliderOfertas(direction); 
1134                }); 
1135 
1136                // Modal Aprendizagem 
1137                let modalFormAprendizagem = document.querySelector('[data-modal="modal"]') 
1138                if(modalFormAprendizagem){ 
1139                // Create dinamic close buttom form 
1140                let btnCloseModalForm = document.querySelector('[data-modal="close-form-modal"]') 
1141                 
1142                btnCloseModalForm.addEventListener('click',closeModalFormAprendizagem) 
1143                 
1144
1145         
1146                $(".oferta-slick-area").on("click", ".btnModalAprendizagem", function (){ 
1147                openModalFormAprendizagem(); 
1148                }) 
1149 
1150            }); 
1151 
1152        $(".ssp-saiba-mais-curso-accordion").on("click", ".ssp-saiba-mais-curso-accordion__heading", function() { 
1153 
1154            $(this).toggleClass("active").next().slideToggle(); 
1155 
1156            $(".sp-saiba-mais-curso-accordion__contents").not($(this).next()).slideUp(300); 
1157                         
1158            $(this).siblings().removeClass("active"); 
1159        }); 
1160 
1161        function acoesMobileSliderOfertas(direcao){ 
1162             
1163            if(direcao == "right"){ 
1164            $("a.slick-prev").click();  
1165             
1166            if($('.slick-current').attr('data-slick-index') == "0") 
1167                $('.prev-mobile').addClass('nextPrevOpacity'); 
1168             
1169            if($(".next-mobile").hasClass('nextPrevOpacity')) 
1170                $('.next-mobile').removeClass('nextPrevOpacity'); 
1171
1172             
1173             
1174            if(direcao == "left"){ 
1175                $("a.slick-next").click(); 
1176                 
1177                if($(".prev-mobile").hasClass('nextPrevOpacity')) 
1178                    $('.prev-mobile').removeClass('nextPrevOpacity'); 
1179                 
1180                if(carregouUltimaOferta){ 
1181                    var totalCardOfertas = $('#turmas-container .slick-area__item').length; 
1182                    var currentSliderIndex = parseInt($('.slick-current').attr('data-slick-index'));   
1183 
1184                    //o card do meio é o último	 
1185                if(totalCardOfertas == (currentSliderIndex + 1)) 
1186                $('.next-mobile').addClass('nextPrevOpacity'); 
1187
1188
1189        }     
1190 
1191        function loadUnidades(showOptions, unidadeValue){ 
1192 
1193            //Busca as unidades do curso 
1194            const urlCursoInfo = urlSearchCursoInfo 
1195            .replace('\{groupId\}', groupId) 
1196            .replace('\{cursosInfo\}', $('[name="articleId"]').val()) 
1197            .replace('\{inscricaoAberta\}', $('#chkInscricao').prop('checked')) 
1198            .replace('\{bolsaAberta\}', false); 
1199 
1200            $.ajax({ 
1201                url:urlCursoInfo, 
1202                method:'get', 
1203                async: false, 
1204                beforeSend: function () { 
1205                loading('.oferta-slick-area'); 
1206
1207                }).done( 
1208                function(data){ 
1209                     
1210                    if(data.length > 0){ 
1211                     
1212                        const cursoInfo = JSON.parse(data); 
1213                         
1214                                                 
1215                        //GCR pediu para voltarmos no combo as unidades vinculadas e não somente as que possuem ofertas 
1216                        //const unidades = cursoInfo.unidadesComOferta; 
1217                        const unidades = cursoInfo.unidadesOfertantes; 
1218                         
1219                        objsTela.unidades = [] 
1220                        mapUnidadesIds = new Map(); 
1221                         
1222                        $.each(unidades, function(k,item){ 
1223                             
1224                            var unidade = cloneObj(item); 
1225                            unidade['categoryId'] = item['categoryId']; 
1226                            unidade['codigoUnidade'] = item['codigoUnidade']; 
1227                            unidade['nome'] = item['nomeUnidade']; 
1228                            unidade['enderecoUnidade'] =item['enderecoUnidade']; 
1229                            unidade['numero'] =item['numEnderecoUnidade']; 
1230                            unidade['complemento'] = item['complementoEnderecoUnidade']; 
1231                            unidade['bairro'] = item['bairroUnidade']; 
1232                            unidade['googlemapsUnidade'] = item['googlemapsUnidade']; 
1233                            unidade['ofertas'] = []; 
1234                            unidade['friendlyURL'] = item['friendlyURL']; 
1235                                 
1236                                objsTela.unidades.push(unidade); 
1237                                 
1238                                mapUnidadesIds.set(unidade['categoryId'], unidade['codigoUnidade']); 
1239													     console.log("items ", item) 
1240                            }); 
1241                                         
1242                        populaSelectUnidades(undefined, showOptions, unidadeValue);  
1243 
1244
1245            }); 
1246 
1247
1248 
1249        function selectFilter(paramkey, el) { 
1250            setUrlParam(paramkey, el.prop("checked")) 
1251            var unidades = objsTela.unidades; 
1252            //const currentUnidadeFriendlyURLSelected = $('#unidades-ofertas').find('option').filter(':selected').attr('data-unidade-friendly-url') 
1253 
1254            splitted = $('#unidades-ofertas').val().split("@"); 
1255            var categoryIdUnidade = splitted[0]; 
1256            var codUnidade = splitted[1]; 
1257            console.log("splitted ", splitted) 
1258            for(var i = 0; unidades.length > i ; i++){ 
1259 
1260                if(unidades[i].categoryId == categoryIdUnidade){ 
1261 
1262                    getOfertas(codigoFT, dataEfetiva, unidades[i].categoryId,  $('#chkInscricao').prop("checked")); 
1263                     
1264
1265
1266            loadUnidades(true, "") 
1267 
1268            if($('#chkInscricao').prop("checked")) $('#msgFiltroAplicado').show() 
1269            else $('#msgFiltroAplicado').hide() 
1270
1271 
1272        function setUrlParam(key, value) { 
1273			const url = new URL(window.location.href); 
1274 
1275			if(value) 
1276			  url.searchParams.set(key, value); 
1277			else 
1278			  url.searchParams.delete(key); 
1279 
1280			window.history.pushState({}, '', url.toString()) 
1281
1282 
1283        function defineCurrentUrl(ev) { 
1284            const currentUnidadeFriendlyURLSelected = $(ev.target).find('option').filter(':selected').attr('data-unidade-friendly-url') 
1285 
1286            const hasPathWeb = window.location.pathname.includes('/web') 
1287            const hasPathGuest = window.location.pathname.includes('/guest') 
1288 
1289            let currentPath = window.location.pathname 
1290            currentPath = hasPathWeb ? currentPath.substring(4) : currentPath 
1291            currentPath = hasPathGuest ? currentPath.substring(6) : currentPath 
1292 
1293            objsTela.unidadesRegistroInteresse.forEach(unidade => currentPath = currentPath.replace('/' + unidade.friendlyURL, '')) 
1294 
1295            currentPath = (currentUnidadeFriendlyURLSelected ? '/' + currentUnidadeFriendlyURLSelected : '') + currentPath 
1296            currentPath = hasPathGuest ? '/guest' + currentPath : currentPath 
1297            currentPath = hasPathWeb ? '/web' + currentPath : currentPath 
1298 
1299        if(keepURL()) 
1300            window.history.replaceState(window.history.state, '', currentPath + window.location.search) 
1301
1302 
1303         
1304 
1305        function populaSelectUnidades(unidades, showOptions, unidadeValue){ 
1306 
1307            //Oredenacao 
1308            objsTela.unidades.sort(function (a, b) { 
1309                return ordenar(a, b, 'nome'); 
1310            }); 
1311 
1312            $('#informe-novas-turmas, .ssp-ofertas__box-endereco-unidade').addClass('d-none'); 
1313            hideCardSemTurmas(true) 
1314 
1315            //console.log('Unidade Pre '+unidadePreSelecionada); 
1316 
1317            if(objsTela.unidades.length == 0){ 
1318                if(!showOptions) 
1319                    $('.ssp-container-selecione-unidade').addClass('d-none'); 
1320                $('.oferta-slick-area').empty(); 
1321                $('.prev-mobile').addClass('d-none'); 
1322                $('.next-mobile').addClass('d-none'); 
1323 
1324
1325 
1326            let unidadeFounded; 
1327 
1328            $('#unidades-ofertas').empty() 
1329 
1330            if(objsTela.unidades && objsTela.unidades.length) 
1331                $('#unidades-ofertas').append($('<option value="">Clique na unidade de interesse</option>')) 
1332            else 
1333                $('#unidades-ofertas').append($('<option value="">Nenhum resultado encontrado</option>')) 
1334 
1335            unidadeFounded = criarOptionUnidadesPorRegiao(objsTela.unidades) 
1336 
1337          /*  $.each(objsTela.unidades, function(k,unidade){ 
1338 
1339                if($('#unidades-ofertas').find('[value="'+unidade['categoryId']+'"]').length == 0){ 
1340 
1341                    var option = $('<option>'); 
1342                    option.val(unidade['categoryId']+"@"+unidade['codigoUnidade']); 
1343                    option.text(unidade['nome']); 
1344                    option.attr('data-unidade-friendly-url', unidade.friendlyURL) 
1345                 
1346                    $('#unidades-ofertas').append(option); 
1347                 
1348                     
1349
1350            }); 
1351 
1352            **/ 
1353 
1354            if(unidadeFounded){	             
1355	            $('#unidades-ofertas').val(unidadeFounded['categoryId']+"@"+unidadeFounded['codigoUnidade']); 
1356	            $('#unidades-ofertas').change(); 
1357	        }  
1358 
1359            loadAlternadores(); 
1360 
1361            $('.prev-mobile').addClass('d-none'); 
1362            $('.next-mobile').addClass('d-none'); 
1363            $('.oferta-slick-area').empty(); 
1364            
1365 
1366
1367 
1368        function ordenar(objA, objB, nomeAtributo){ 
1369            let a = (nomeAtributo) ? objA[nomeAtributo] : objA; 
1370            let b = (nomeAtributo) ? objB[nomeAtributo] : objB; 
1371 
1372            if (a > b) return 1; 
1373            if (a < b) return -1; 
1374            return 0; 
1375
1376 
1377        $('#unidades-ofertas').change(ev => { 
1378            mudarUnidade(ev) 
1379        }); 
1380 
1381 
1382        function mudarUnidade(ev){  
1383 
1384            var elem = $(ev.target); 
1385            var unidades = objsTela.unidades; 
1386 
1387            //Unidade sem value tratamento 
1388            if(!elem.val()){ 
1389                    $('#informe-novas-turmas, .ssp-ofertas__box-endereco-unidade').addClass('d-none'); 
1390 
1391                if($('#unidades-ofertas option').length <= 1) 
1392                    hideCardSemTurmas(false) 
1393                else 
1394                    hideCardSemTurmas(true)          
1395 
1396                 
1397                elem.val('') 
1398                return; 
1399            } else { 
1400                $('#informe-novas-turmas, .ssp-ofertas__box-endereco-unidade').removeClass('d-none'); 
1401 
1402                if($('#unidades-ofertas option').length <= 1) 
1403                    hideCardSemTurmas(false) 
1404                else 
1405                    hideCardSemTurmas(true)    
1406
1407 
1408            //colocamos dentro do option categoryId@codUnidade 
1409            splitted = elem.val().split("@"); 
1410            var categoryIdUnidade = splitted[0]; 
1411            var codUnidade = splitted[1]; 
1412            console.log("splitted ", splitted) 
1413            for(var i = 0; unidades.length > i ; i++){ 
1414 
1415                if(unidades[i].categoryId == categoryIdUnidade){ 
1416 
1417                    var unidade = unidades[i]; 
1418                     
1419                    //Exibe o endereco da unidade 
1420                    const urlBuscaUnidade = urlUnidadeInfoDetalhe 
1421                    .replace('\{companyId\}',themeDisplay.getCompanyId()) 
1422                    .replace('\{codigoUnidade\}', unidade.codigoUnidade); 
1423                     
1424                    $.ajax({ 
1425                            url :  urlBuscaUnidade, 
1426                            type : 'get', 
1427                            dataType: 'json', 
1428                            success: function( unidadeInfo ) { 
1429                            if(unidadeInfo != null && typeof unidadeInfo !== 'undefined'){ 
1430                                 
1431                                var endereco = concatSTR(unidadeInfo.enderecoUnidade,unidadeInfo.numEnderecoUnidade,', '); 
1432                                    endereco = concatSTR(endereco,unidadeInfo.complementoEnderecoUnidade, ' - '); 
1433                                    endereco = concatSTR(endereco,unidadeInfo.bairroUnidade, ' - '); 
1434                             
1435                                    $('.ssp-ofertas__endereco-unidade').text(endereco); 
1436                                    $('.ssp-ofertas__endereco-unidade').attr('href',unidadeInfo.googlemapsUnidade); 
1437                                    $('.ssp-ofertas__box-endereco-unidade').removeClass("d-none")   
1438
1439                            }, 
1440                            error: function(data){ 
1441                            $('.ssp-ofertas__box-endereco-unidade').addClass("d-none")     
1442                            $('.ssp-ofertas__endereco-unidade').text(''); 
1443                            $('.ssp-ofertas__endereco-unidade').attr('href','#a'); 
1444                                console.log('Unidade não encontrada'); 
1445
1446                        }) 
1447                         
1448                    getOfertas(codigoFT, dataEfetiva, unidades[i].categoryId, $('#chkInscricao').prop("checked")); 
1449                     
1450
1451            }   
1452             
1453
1454 
1455        function criarOptionUnidadesPorRegiao(unidades) { 
1456    	  let regioes = {} 
1457    	  let unidadeFounded 
1458 
1459    	  unidades.forEach(unidade => { 
1460    	    if(!regioes[unidade.codRegiaoUnidade || 'N']) 
1461    	      regioes[unidade.codRegiaoUnidade || 'N'] = [] 
1462 
1463    	    regioes[unidade.codRegiaoUnidade || 'N'].push(unidade) 
1464    	  }) 
1465 
1466    	  Array.from(['C', 'I', 'GS', 'N']) 
1467    	  .filter(key => Object.keys(regioes).includes(key)) 
1468    	  .forEach(key => { 
1469    	    const unidadesDaRegiao = regioes[key] 
1470 
1471    	    const optionDisabled = $('<option>') 
1472    	    optionDisabled.attr('label', getRegiaoName(key)) 
1473    	    optionDisabled.text(getRegiaoName(key)); 
1474    	    optionDisabled.attr('disabled', true) 
1475    	    optionDisabled.addClass('ssp-option-group') 
1476    	    $('#unidades-ofertas').append(optionDisabled) 
1477 
1478    	    $.each(unidadesDaRegiao, function(k,unidade){       
1479    	      if($('#unidades-ofertas').find('[value="'+unidade['categoryId']+'"]').length == 0){         
1480    	        var option = $('<option>'); 
1481    	        option.val(unidade['categoryId']+"@"+unidade['codigoUnidade']); 
1482    	        option.text(unidade['nome']); 
1483    	        option.attr('data-unidade-friendly-url', unidade.friendlyURL) 
1484    	        option.addClass('ssp-option') 
1485    	   
1486    	        $('#unidades-ofertas').append(option); 
1487    	     
1488    	        unidadeFounded = !unidadeFounded	           
1489
1490    	    }) 
1491    	  }) 
1492 
1493    	  return unidadeFounded 
1494
1495 
1496        function getRegiaoName(key) { 
1497    	  switch (key) { 
1498    	    case "C": 
1499    	      return "Capital"; 
1500    	    case "I":             
1501    	      return "Interior"; 
1502    	    case "GS": 
1503    	      return "Grande São Paulo e Litoral"; 
1504    	    default: 
1505    	      return "Sem Região"; 
1506
1507
1508 
1509        function loadAlternadores() { 
1510 
1511            let $alternadores = $('#ssp-alternadores'); 
1512            if($('#unidades-ofertas').is(":hidden") || $('#unidades-ofertas option').length <= 1) { 
1513 
1514                if(!$('#chkInscricao').prop('checked')) $alternadores.hide(); 
1515                else $alternadores.show(); 
1516             
1517            }else $alternadores.show(); 
1518 
1519
1520 
1521        function hideCardSemTurmas(hide){ 
1522            if(hide){ 
1523                $('.ssp-card-oferta-curso__sem-vaga').addClass('d-none'); 
1524                $('.ssp-card-oferta-curso__mensagem-legal').css('margin', '0px 0 0 0;') 
1525            }else{ 
1526                $('.ssp-card-oferta-curso__sem-vaga').removeClass('d-none'); 
1527                $('.ssp-card-oferta-curso__mensagem-legal').css('margin', '') 
1528            }     
1529
1530 
1531            function getOfertas(codigoFT, dataEfetivaOferta, categoryId, filtrarInscricoes){ 
1532 
1533            var indiceUnidade = -1; 
1534 
1535            for(var i = 0; i < objsTela.unidades.length; i++) 
1536                if(objsTela.unidades[i].categoryId == categoryId) 
1537                    indiceUnidade = i; 
1538 
1539            if(!objsTela.categoriesIds.includes(categoryId) ||  
1540                objsTela.unidades[indiceUnidade].ofertasFiltradas != filtrarInscricoes){ 
1541 
1542                objsTela.unidades[indiceUnidade]['ofertas'] = [] 
1543 
1544                var params = new URLSearchParams(); 
1545                params.set('codigoFTOferta',codigoFT) 
1546                params.set('dataEfetivaOferta',dataEfetivaOferta) 
1547                params.set('categoryIds',categoryId) 
1548                params.set('start',startOfertaParam) 
1549                params.set('end',endOfertaParam) 
1550                params.set('inscricaoAberta', filtrarInscricoes) 
1551                params.set('bolsaAberta', false) 
1552                params.set('cursoArticleId', $('[name="articleId"]').val() || ''); 
1553                 
1554                const url = urlSearchOferta + '?' + params.toString() 
1555 
1556            $.ajax({ 
1557                url:url, 
1558                method:'get', 
1559                dataType:'json', 
1560                async: false 
1561            }).done( 
1562                function(data){ 
1563                 
1564                if(data.length > 0){ 
1565                    $('.ssp-container-selecione-unidade').show(); 
1566                     
1567                    data.forEach(function(ofertaJSON,index){ 
1568 
1569                    var oferta = getOfertaObjectFromJson(ofertaJSON,index); 
1570                     
1571                    //Preenche as ofertas da unidade              
1572                    objsTela.unidades[indiceUnidade]['ofertas'].push(oferta); 
1573                     
1574 
1575                    }); 
1576
1577                objsTela.categoriesIds.push(categoryId); 
1578                populaOfertas(objsTela.unidades[indiceUnidade]['ofertas']); 
1579                objsTela.unidades[indiceUnidade].ofertasFiltradas = filtrarInscricoes; 
1580
1581
1582 
1583            //Se estiver na cache, valida as ofertas 
1584            }else{ 
1585 
1586            populaOfertas(objsTela.unidades[indiceUnidade]['ofertas']); 
1587 
1588
1589
1590 
1591        function getOfertaObjectFromJson(ofertaJSON,index){ 
1592 
1593 
1594            var oferta =  {}; 
1595                    var xml =  $($.parseXML(ofertaJSON.content)); 
1596                    oferta['ordenar'] = paramOrdem(xml); 
1597                    oferta['vagasTotal'] = xml.find('[name="vagasTotal"]').text().trim(); 
1598                    var dataInicio = xml.find('[name="dataInicioOferta"]').text().split('-'); 
1599                    var dataFim =xml.find('[name="dataFimOferta"]').text().split('-'); 
1600                    oferta['dataInicio'] = dataInicio[2].trim()+'/'+dataInicio[1].trim()+'/'+dataInicio[0].trim(); 
1601                    oferta['dataFim'] = dataFim[2].trim()+'/'+dataFim[1].trim()+'/'+dataFim[0].trim(); 
1602                    oferta['horaInicio'] = xml.find('[name="horaInicioOferta"]').text(); 
1603                    oferta['codigoOferta'] = xml.find('[name="codigoOferta"]').text().trim(); 
1604                    var dias = []; 
1605                    oferta['horaFimOferta'] = xml.find('[name="horaFimOferta"]').text().trim(); 
1606                    xml.find('[name="diasDaSemanaOferta"]').find('option').each(function(index,dia){ 
1607                        dias.push($(dia).text()); 
1608                    }); 
1609                    oferta['diasDaSemanaOferta'] = dias; 
1610                    oferta['periodoDiaOferta'] = xml.find('[name="periodoDiaOferta"]').text().trim(); 
1611                    oferta['precoCheioOferta'] = xml.find('[name="precoCheioOferta"]').text().trim(); 
1612                    oferta['precoVendaOferta'] = xml.find('[name="precoVendaOferta"]').text().trim(); 
1613                    oferta['numeroMaxParcelasOferta'] = xml.find('[name="numeroMaxParcelasOferta"]').text().trim(); 
1614                     
1615                    oferta['textoCartoesAceitos'] =  pegarTextoCartoesAceitos(xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim()); 
1616                    oferta['numParcelaCartoes'] =  pegaNumParcela(xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim()); 
1617                    oferta['precoParcelaCartoes'] =  pegaValorParcela(xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim()); 
1618                    oferta['numParcelaBoleto'] =  pegaNumParcela(xml.find('[name="formaDePagamentoBoletoOferta"]').text().trim()); 
1619                    oferta['precoParcelaBoleto'] =  pegaValorParcela(xml.find('[name="formaDePagamentoBoletoOferta"]').text().trim()); 
1620                     
1621                    oferta['precoVendaMaxParcelaOferta'] = xml.find('[name="precoVendaMaxParcelaOferta"]').text().trim(); 
1622                    oferta['formaDePagamentoOferta'] = xml.find('[name="formaDePagamentoOferta"]').text().trim(); 
1623                    oferta['botaoCompraOferta'] = xml.find('[name="botaoCompraOferta"]').text().trim(); 
1624                    oferta['vagasParaCompraOferta'] = xml.find('[name="vagasParaCompraOferta"]').text().trim(); 
1625                    oferta['botaoBolsaOferta'] = xml.find('[name="botaoBolsaOferta"]').text().trim(); 
1626                    oferta['vagasBolsaOferta'] = xml.find('[name="vagasBolsaOferta"]').text().trim(); 
1627                    oferta['dataAberturaBolsaOferta'] = xml.find('[name="dataAberturaBolsaOferta"]').text().trim(); 
1628                    oferta['horaAberturaBolsaOferta'] = xml.find('[name="horaAberturaBolsaOferta"]').text().trim(); 
1629                    oferta['espacoExterno'] = xml.find('[name="espacoExterno"]').text().trim(); 
1630                    oferta['localEspacoExterno'] = xml.find('[name="localEspacoExterno"]').text().trim(); 
1631                    oferta['ruaEspacoExterno'] = xml.find('[name="ruaEspacoExterno"]').text().trim(); 
1632                    oferta['numeroEspacoExterno'] = xml.find('[name="numeroEspacoExterno"]').text().trim(); 
1633                    oferta['complementoEspacoExterno'] = xml.find('[name="complementoEspacoExterno"]').text().trim(); 
1634                    oferta['bairroEspacoExterno'] = xml.find('[name="bairroEspacoExterno"]').text().trim(); 
1635                    oferta['cidadeEspacoExterno'] = xml.find('[name="cidadeEspacoExterno"]').text().trim(); 
1636                    oferta['ufEspacoExterno'] = xml.find('[name="ufEspacoExterno"]').text().trim(); 
1637                    oferta['cepEspacoExterno'] = xml.find('[name="cepEspacoExterno"]').text().trim(); 
1638                    oferta['qtdeTotalVagas'] = xml.find('[name="qtdeTotalVagas"]').text().trim(); 
1639                    oferta['qtdeTotalVagasPSG'] = xml.find('[name="qtdeTotalVagasPSG"]').text().trim(); 
1640                    oferta['horariosAllOferta'] = xml.find('[name="horariosAllOferta"]').text().trim(); 
1641                    oferta['formaDePagamentoCartaoOferta'] = xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim(); 
1642                    oferta['formaDePagamentoBoletoOferta'] = xml.find('[name="formaDePagamentoBoletoOferta"]').text().trim(); 
1643                    oferta['dtLimiteMatricula'] = xml.find('[name="dtLimiteMatricula"]').text().trim(); 
1644                    oferta['dataAberturaMatricula'] = xml.find('[name="dataAberturaMatricula"]').text().trim(); 
1645                    oferta['etapa'] = xml.find('[name="etapa"]').text().trim(); 
1646                     
1647                    return oferta;  
1648
1649 
1650        function populaOfertas(ofertas){ 
1651 
1652            objsTela.ofertas = ofertas; 
1653 
1654            if(ofertas && ofertas.length)  
1655            $('#ssp-h3-turmas').show() 
1656            else  
1657            $('#ssp-h3-turmas').hide() 
1658             
1659             
1660            if(ofertas.length == 0){ 
1661             
1662                if($('#unidades-ofertas').val() || $('#chkInscricao').prop('checked') || $('#chkBolsa').prop('checked')) 
1663                    hideCardSemTurmas(false) 
1664                 
1665                $('.oferta-slick-area').empty(); 
1666                $('.prev-mobile').addClass('d-none'); 
1667                $('.next-mobile').addClass('d-none'); 
1668                 
1669                 
1670                return; 
1671            }else{ 
1672                hideCardSemTurmas(true) 
1673                $('.prev-mobile, .next-mobile').removeClass('d-none'); 
1674
1675             
1676             
1677            $('.oferta-slick-area').empty(); 
1678            ofertas = ofertas.sort(function(a, b){ 
1679                return ordenar(a, b, 'ordenar'); 
1680            }); 
1681            // executa a class do slick slider 
1682            $('.oferta-slick-area').removeClass('slick-initialized slick-slider slick-dotted'); 
1683             
1684            //busca o codigoUnidade para o link do ecommerce 
1685             
1686            var selectedUnidade = $('#unidades-ofertas').val().split('@')[0]; 
1687            for(var i=0;objsTela.unidades.length > i ;i++){ 
1688                if(selectedUnidade == objsTela.unidades[i].categoryId) 
1689                    codigoUnidade = objsTela.unidades[i].codigoUnidade; 
1690
1691             
1692             
1693            for(var i=0;ofertas.length > i ;i++){ 
1694 
1695                var oferta = ofertas[i]; 
1696                 
1697                //guardando a oferta no map para chamar ajax com infos de bolsa em tempo real 
1698                oferta['indice'] = i; 
1699                ofertasMap.set(oferta.codigoOferta, oferta); 
1700                montaHTMLOferta(oferta, i, codigoUnidade, false);  
1701                montaHTMLModalLocalRealizacao(oferta, i);  
1702                verificaCursoAprendizagem(i); 
1703                associaEventoBtnLocalRealizacao(i); 
1704                associaEventosFecharModal(i); 
1705                     
1706
1707 
1708            sliderOfertas(); 
1709
1710 
1711        function montaHTMLOferta(oferta, index, codigoUnidade, posLoad){ 
1712 
1713            var retornoDiasHorarios = processaDiasHorariosOferta(oferta.horariosAllOferta); 
1714            diasSemanaHTML = ""; 
1715 
1716            for(var diaDaOferta of retornoDiasHorarios){ 
1717                diasSemanaHTML += htmlSlickAreaDiasSemana.replace('\{diasSemana\}',diaDaOferta.dias); 
1718                diasSemanaHTML = diasSemanaHTML.replace('\{horasSemana\}',diaDaOferta.horario) 
1719            }    
1720 
1721            var ofertaHTML = ""; 
1722            ofertaHTML = htmlSlickArea(index, oferta, diasSemanaHTML, codigoUnidade) 
1723             
1724            if(!posLoad) 
1725                $('.oferta-slick-area').append(ofertaHTML); 
1726            else{ 
1727                $('.oferta-slick-area').slick('slickAdd', ofertaHTML);       
1728
1729             
1730            ajustaTextoDiasHorarioOferta(oferta.codigoOferta); 
1731             
1732            if(turmasIniciadas(oferta.dataInicio)) 
1733                $("#aviso-turma-iniciada-"+index).show(); 
1734 
1735            //remove os botões/itens de compra/bolsa caso seja preciso 
1736            $('.oferta-slick-area').find('.d-none-btn').remove(); 
1737
1738 
1739        function processaDiasHorariosOferta(horariosAllOferta){ 
1740 
1741            var dias = horariosAllOferta.trim().split(','); 
1742            let arrayDiasSemana = [{"Seg":"Segunda"},{"Ter":"Terça"},{"Qua":"Quarta"},{"Qui":"Quinta"},{"Sex":"Sexta"},{"Sab":"Sábado"},{"Dom":"Domingo"}] 
1743 
1744            var arrayDia = []; 
1745            if(dias.length >= 1){ 
1746                for(var k=0; dias.length > k; k++){ 
1747 
1748                    var diasSplit = dias[k].trim().split(' '); 
1749                    var diasSemana = diasSplit.shift() 
1750                    var ultimaPos = diasSplit.length-1; 
1751                    var horasStr = diasSplit[0] + ' às ' + diasSplit[ultimaPos]  
1752                    arrayDia.push({horasStr,diasSemana}); 
1753
1754
1755 
1756            arrayDia = groupByArray(arrayDia, 'horasStr','diasSemana'); 
1757            arrayDia = orderByArray(arrayDia,arrayDiasSemana); 
1758             
1759            var ret = diaHorarioOfertaFormatado(arrayDia,arrayDiasSemana); 
1760                return ret; 
1761
1762 
1763        //cria um array de objetos Agrupando de acordo ao campo informado como chave.  
1764        //@arr = Array multidimensional que tenha os campos key e valueAdd 
1765        //@key = campo que será chave nesse array 
1766        //@valueAdd = campo que será agrupado caso tenha a mesma informação passada no campo key 
1767        const groupByArray = (arr, key,valueAdd) => { 
1768                const initialValue = []; 
1769                const retornoValue = []; 
1770                arr.forEach((acc, cval) => { 
1771                    const myAttribute = cval[key]; 
1772                    acc[key] in retornoValue ? retornoValue[acc[key]].push(acc[valueAdd]):retornoValue[acc[key]]=[acc[valueAdd]]; 
1773                    return acc; 
1774                    }, initialValue); 
1775            return retornoValue; 
1776        }; 
1777 
1778 
1779        //Cria um array de objetos a partir do primeiro array inserido e ordenados de acordo a ordem do segundo array informado.  
1780        //@arrayOrdena = Array de objetos que tenha os campos que precisa ser ordenados 
1781        //@ordem = array com a sequencia que queira ordenar - ex: seg, ter, qua, qua 
1782        const orderByArray = (arrayOrdena, ordem) => { 
1783 
1784            let diasSem = []; 
1785            const arrayOrdenado = []; 
1786            let controle; 
1787             
1788            //percorre cada campo existente no ordem e busca o mesmo no arrayOrdena, encontrando insere no arrayOrdenado 
1789            for(let campo of ordem){	 
1790                Object.entries(arrayOrdena).forEach(([key, value]) => { 
1791                    for(let diaOferta of value){ 
1792                        if(diaOferta===Object.keys(campo)[0]){ 
1793                            arrayOrdenado[key]=arrayOrdena[key]; 
1794
1795
1796                }) 
1797
1798            return arrayOrdenado; 
1799        }; 
1800 
1801        function diaHorarioOfertaFormatado(arrayAgrupadoEOrdenado, arrayDiasDaSemana){ 
1802 
1803            var stringAux = "";		 
1804            var listRetorno = []; 
1805                 
1806            Object.entries(arrayAgrupadoEOrdenado).forEach(([key, value]) => {		 
1807 
1808                var sequencial = diasSequenciaisOuAlternados(value, arrayDiasDaSemana); 
1809                var stringAux = "";		 
1810                var diaOferta = {}; 
1811 
1812                if(sequencial){ 
1813                    switch (value.length) { 
1814                        case 1: 
1815                            stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+": "; 
1816                            diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula 
1817                            diaOferta.horario = key; 
1818                        break; 
1819                        case 2: 
1820                            stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+" e "+findValueInObject(arrayDiasDaSemana,value[value.length-1])+": "; 
1821                            diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula 
1822                            diaOferta.horario = key; 
1823                        break; 
1824                        default: 
1825                                stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+" a "+findValueInObject(arrayDiasDaSemana,value[value.length-1])+": "; 
1826                             
1827                            diaOferta.dias =  stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula 
1828                            diaOferta.horario = key; 
1829                        break; 
1830                    }	 
1831                }else{ 
1832                    switch (value.length) { 
1833                        case 2: 
1834                            stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+" e "+findValueInObject(arrayDiasDaSemana,value[value.length-1])+": "; 
1835                            diaOferta.dias =  stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula 
1836                            diaOferta.horario = key; 
1837                        break; 
1838                        default: 
1839                            var ct = 0; 
1840                            var stringDias=""; 
1841                            for(let v of value){ 
1842                                ct++; 
1843                                ct==value.length ? stringDias=stringDias.substring(0,stringDias.length - 2)+" e "+findValueInObject(arrayDiasDaSemana,v) : stringDias+=findValueInObject(arrayDiasDaSemana,v)+", "; 
1844
1845                                stringAux = stringAux+stringDias+": "; 
1846                            diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula 
1847                            diaOferta.horario = key; 
1848                        break; 
1849
1850
1851 
1852                listRetorno.push(diaOferta); 
1853            }) 
1854            return listRetorno; 
1855        }; 
1856 
1857        //retorna o valor de um objeto dentro de um array 
1858        //@objetoBusca = array de objetos que sera buscado o valor 
1859        //@keyBusca = nome do campo a ser buscada no objeto para pegar o seu valor 
1860        function findValueInObject(objetoBusca, keyBusca){ 
1861            var retorno = ""; 
1862            Object.entries(objetoBusca).forEach(([horario, dias]) => { 
1863                Object.entries(dias).forEach(([key,val]) => { 
1864                    if(key.trim()==keyBusca.trim()){ 
1865                        retorno = val; 
1866
1867                }); 
1868            }); 
1869            return retorno; 
1870
1871 
1872        //Recebe um objeto com valores dos dias da semana e define se sao dias seguidos ou alternados.  
1873        //@arrayComDiasDaSemana = array com os dias da semana a serem validados - exemplo ['Qua','Qui','Sex'] 
1874        //@keyBusca = nome do campo a ser buscada no objeto para pegar o seu valor 
1875        function diasSequenciaisOuAlternados(arrayComDiasDaSemana, arrayDiasDaSemana){ 
1876             
1877            let arrayValidador = []; 
1878             
1879            //cria um array com o index dos dias das semanas encontrados [0 = seg, 1 = ter ... 6 = dom] 
1880            for(let diaOferta of arrayComDiasDaSemana){ 
1881                for(let i = 0; i < arrayDiasDaSemana.length; i++){ 
1882                    if(diaOferta === Object.keys(arrayDiasDaSemana[i])[0]){ 
1883                        arrayValidador[i] = true; 
1884                    }				 
1885
1886
1887 
1888            let keyCompair = 99; 
1889            var sequencial = true; 
1890 
1891            //verifica quais posições foram criadas no array, e se os valores delas estão em sequencia. 
1892            for(let keyValidator of Object.keys(arrayValidador)){ 
1893                keyValidator = parseInt(keyValidator); 
1894                if(keyCompair!==99){ 
1895                    if(keyValidator===keyCompair){ 
1896                        sequencial = true; 
1897                    }else{ 
1898                        sequencial = false; 
1899                        break; 
1900
1901
1902                keyCompair = keyValidator+1; 
1903
1904            return sequencial; 
1905
1906 
1907        function concatSTR(str1, str2, separador){ 
1908 
1909            if(str2){ 
1910 
1911            return str1+separador+str2; 
1912
1913            return str1; 
1914
1915 
1916        //Distribui dia e horario com quebra de linha entre eles ou nao dependendo da resolução de tela e tamanho da string 
1917        function ajustaTextoDiasHorarioOferta(codOferta){ 
1918 
1919            var classOferta = ".codigoOferta_"+codOferta;  
1920            let oferta = $(classOferta); 
1921 
1922            let ofertaDiasSemana = $(oferta).find('*[data-dia-hora="dias-semana"]'); 
1923 
1924            let widthDevice = window.screen.width; 
1925            let tamLimDesktop = 185; 
1926             
1927            if(widthDevice <= 1024){ 
1928                tamLimDesktop = 180; 
1929
1930             
1931            ofertaDiasSemana.each(function(index){ 
1932 
1933                             
1934                let widthDiaSemana = $(this).width(); 
1935             
1936                let contentDiaHora = $(this).parent().parent().parent(); 
1937                 
1938                if(!(widthDiaSemana <= tamLimDesktop)){ 
1939                    $(this).css("display","block"); 
1940
1941             
1942                if(ofertaDiasSemana.length == parseInt(index+1)){ 
1943                    contentDiaHora.css("opacity","1"); 
1944
1945 
1946                })  
1947
1948 
1949        function turmasIniciadas(dataInicioCurso){ 
1950 
1951            var hoje = new Date();  
1952            var dataInicioPartes = dataInicioCurso.split('/');  
1953            var dataInicioCursoOferta = new Date(dataInicioPartes[2], dataInicioPartes[1] - 1, dataInicioPartes[0] , hoje.getHours(),hoje.getMinutes(),hoje.getSeconds(),hoje.getMilliseconds()); 
1954 
1955            return dataInicioCursoOferta.getTime() <= hoje.getTime(); 
1956
1957 
1958        function paramOrdem(xml){ 
1959            return xml.find('[name="dataInicioOferta"]').text(); 
1960
1961 
1962        function pegarTextoCartoesAceitos(campo){ 
1963            indice = campo.indexOf(' em até '); 
1964            inicio = 0; 
1965            fim = indice; 
1966             
1967            return campo.substring(inicio, fim); 
1968
1969 
1970        function pegaNumParcela(campo){ 
1971 
1972            indice = campo.indexOf('até '); 
1973            inicio = indice + 4; 
1974            fim = indice +  6; 
1975             
1976            return campo.substring(inicio, fim); 
1977             
1978
1979 
1980        function pegaValorParcela(campo){ 
1981             
1982            indice = campo.indexOf('R$'); 
1983            inicio = indice+2;     
1984            valorAmericano = campo.substring(inicio) 
1985             
1986            return formataValor(valorAmericano); 
1987             
1988
1989 
1990        function formataValor(valor){ 
1991 
1992            if(!valor.toString().includes(".")){ 
1993                valor = parseFloat(valor).toLocaleString('pt-BR')+",00"; 
1994            }else{ 
1995                valor = parseFloat(valor).toLocaleString('pt-BR'); 
1996                 
1997                if(valor.split(",").length == 2){ 
1998                 
1999                if(valor.split(",")[1].length == 1) 
2000                    valor += "0"; 
2001                 
2002                }else 
2003                valor += ",00"; 
2004
2005             
2006            return valor; 
2007
2008 
2009        function verificaCursoAprendizagem(i){ 
2010        //Esconde elementsos quando o curso é aprendizagem 
2011            if($('[name="codigoFT"]').val() == codigoFT){ 
2012                $('#btnComprar_'+i).remove(); 
2013                $('#container_investimento_'+i).remove(); 
2014                $('#container_forma_pgto_'+i).remove(); 
2015                 
2016                var avisoAprendizagem = $('#aviso-curso-aprendizagem').clone(); 
2017                let btnFormAprendizagem = '<button class="btn btn-lg btn-success w-100 mt-3 btnModalAprendizagem" data-modal="open-modal" style="font-size:16px;background:#1FC923;font-weight: 600;">Preencher formulário</button>' 
2018                avisoAprendizagem.removeAttr('id'); 
2019                avisoAprendizagem.removeClass('d-none'); 
2020                $('.card_oferta_'+i+ ' .ssp-card-oferta-curso').append(avisoAprendizagem); 
2021                $('.card_oferta_'+i+ ' .ssp-card-oferta-curso').append(btnFormAprendizagem); 
2022
2023
2024 
2025        function associaEventoBtnLocalRealizacao(i){ 
2026            var btnLocalRealizacao = document.getElementById("btnLocalRealizacao_"+i); 
2027             
2028            if(btnLocalRealizacao!=null){ 
2029                btnLocalRealizacao.onclick = function(ev) { 
2030                        event.preventDefault(); 
2031                    var elem = $(ev.target); 
2032                    var _modal = document.getElementById( 
2033                        'modalLocalRealizacao_'+elem.data('index')); 
2034                    _modal.style.display = "flex"; 
2035
2036
2037
2038 
2039        var htmlModalLocalRealizacao = '<div id="modalLocalRealizacao_{index}" class="ssp-modal">' 
2040            htmlModalLocalRealizacao += '<div class="ssp-modal-local-realizacao">' 
2041            htmlModalLocalRealizacao += '<div class="ssp-modal-local-realizacao__title-content">' 
2042 
2043            htmlModalLocalRealizacao += '{tituloLocalRealizacao}' 
2044                 
2045            htmlModalLocalRealizacao += '<i class="ssp-card-modal-local-realizacao__btn-close_{index} ssp-card-modal-forma-pagamento__btn-close"></i>' 
2046            htmlModalLocalRealizacao += '</div>' 
2047            htmlModalLocalRealizacao += '<div class="ssp-modal-local-realizacao__texto">' 
2048            htmlModalLocalRealizacao += '<p class="{classeTextoInfoLocalRealizacao}">A unidade {nomeUnidade} realizará as aulas em outro endereço, conforme informações abaixo:</p>' 
2049            htmlModalLocalRealizacao += '<p><span class="ssp-modal-local-realizacao__subtitle localEspacoExternoTexto_{index}">{localEspacoExterno}</span></p>' 
2050            htmlModalLocalRealizacao += '<address>' 
2051            htmlModalLocalRealizacao += '<span id="endereco_realizacao_{index}" class="{classeEnderecoRealizacao}">{ruaEspacoExterno}, {numeroEspacoExterno} {complementoEspacoExterno}<br></span>' 
2052            htmlModalLocalRealizacao += '<span id="bairro_realizacao_{index}" class="{classeBairroRealizacao}">Bairro: {bairroEspacoExterno}<br></span>' 
2053            htmlModalLocalRealizacao += '<span id="cidade_realizacao_{index}" class="{classeCidadeRealizacao}">Cidade: {cidadeEspacoExterno} - SP<br></span>' 
2054            htmlModalLocalRealizacao += '<span id="cep_realizacao_{index}" class="{classeCepRealizacao}">CEP: {cepEspacoExterno}</span>' 
2055            htmlModalLocalRealizacao += '</address>' 
2056            htmlModalLocalRealizacao += '<div class="btn ssp-modal-local-realizacao__btn-content">' 
2057            htmlModalLocalRealizacao += '<a class="btn ssp-modal-local-realizacao__btn {classeEntendi} ssp-modal-local-realizacao__btn_{index}" href="#a">Entendi</a>' 
2058            htmlModalLocalRealizacao +='</div>' 
2059            htmlModalLocalRealizacao +='</div>' 
2060            htmlModalLocalRealizacao +='</div>' 
2061            htmlModalLocalRealizacao +='</div>'; 
2062 
2063        var htmlSlickAreaDiasSemana = '<div class="ssp-card-oferta-curso__dia-hora-item">' 
2064            htmlSlickAreaDiasSemana +='<p class="ssp-card-oferta-curso__dia-hora-item__dia">'  
2065            htmlSlickAreaDiasSemana += '<span data-dia-hora="dias-semana">{diasSemana}</span>' 
2066            htmlSlickAreaDiasSemana += '<span data-dia-hora="horário">{horasSemana}</span>' 
2067            htmlSlickAreaDiasSemana += '</p>' 
2068            htmlSlickAreaDiasSemana += '</div>'; 
2069 
2070        function htmlSlickArea(index, oferta, diasSemanaHTML, codigoUnidade) { 
2071            const btnLocalReal = function(oferta){ 
2072             
2073            var btn = `<div class="container-local-realizacao ` + (oferta.espacoExterno == 'true' ? '' : 'd-none-btn') + `">`; 
2074             
2075            btn += `<a id="btnLocalRealizacao_` + index + `" data-index="` + index + `" class="ssp-card-oferta-curso__local-realizacao-content__title" href="#"><i class="fas fa-user"></i>Onde as aulas vão acontecer?</a>`; 
2076             
2077            btn += `</div>`; 
2078                 
2079            return btn; 
2080             
2081
2082 
2083            // Card Oferta 
2084             
2085            let result = ` 
2086                <div class="slick-area__item card_oferta_` + index + ` codigoOferta_` + oferta.codigoOferta + ` ` + `"> 
2087 
2088                <div class="ssp-card-oferta-curso"> 
2089 
2090                    <div class="content-data-dias"> 
2091 
2092                    <div class="ssp-card-oferta__info-turma-iniciada" id="aviso-turma-iniciada-` + index + `" style="display:none"> 
2093                        <h6 style="color:white;background-color:#ff7157;border-radius: 5px;padding: 8px 0px;width: 60%;font-size: 12px;margin-top: 0;"><strong>Turma iniciada, comece já!</strong></h6> 
2094                    </div> 
2095 
2096                    <div class="ssp-card-oferta__info-turma-content"> 
2097                        <h6 class="ssp-card-oferta__info-turma">Informações da turma</h6> 
2098                    </div> 
2099 
2100                    <div> 
2101                        <small class="ssp-card-oferta-curso__title-item">Período:</small> 
2102                        <h6 class="ssp-card-oferta-curso__item-data-periodo item-data-periodo_` + index + `">` + formataPeriodo(oferta.dataInicio, oferta.dataFim) + `</h6> 
2103                    </div> 
2104 
2105                    <div class="content-horario-dias-semana"> 
2106 
2107                        <div class="horario"> 
2108                        <small class="ssp-card-oferta-curso__title-item">Horário e dias das aulas:</small> 
2109                        </div> ` + 
2110                     
2111                        `<div class="ssp-card-oferta-curso__dia-hora_content"> 
2112                        ` + diasSemanaHTML + ` 
2113                        </div> 
2114 
2115                    </div> 
2116 
2117            ` + btnLocalReal(oferta) 
2118 
2119 
2120            return result 
2121
2122 
2123        function montaHTMLModalLocalRealizacao(oferta, index){ 
2124      
2125            var tituloLocalRealizacao =  '<i class="ssp-modal__local-realizacao-content__icon-wifi"></i> <i class="ssp-modal__local-realizacao-content__icon-chalkboard-teacher"></i> <h6 class="ssp-modal-local-realizacao__title"> ONDE AS AULAS VÃO ACONTECER?</h6>'; 
2126                     
2127            var localRealizacaoHTMLModal = htmlModalLocalRealizacao 
2128                .replace('\{nomeUnidade\}',$('#unidades-ofertas option:selected').text()) 
2129                .replace('\{localEspacoExterno\}', oferta.localEspacoExterno ) 
2130                .replace('\{classeTextoInfoLocalRealizacao\}', oferta.ruaEspacoExterno != "" ? "" : "d-none") 
2131                .replace('\{classeEnderecoRealizacao\}', oferta.ruaEspacoExterno != "" ? "" : "d-none") 
2132                .replace('\{ruaEspacoExterno\}',oferta.ruaEspacoExterno) 
2133                .replace('\{numeroEspacoExterno\}',oferta.numeroEspacoExterno) 
2134                .replace('\{complementoEspacoExterno\}',oferta.complementoEspacoExterno) 
2135                .replace('\{classeBairroRealizacao\}', oferta.bairroEspacoExterno != "" && oferta.ruaEspacoExterno != "" ? "" : "d-none") 
2136                .replace('\{bairroEspacoExterno\}',oferta.bairroEspacoExterno) 
2137                .replace('\{classeCidadeRealizacao\}', oferta.cidadeEspacoExterno != "" && oferta.ruaEspacoExterno != "" ? "" : "d-none") 
2138                .replace('\{cidadeEspacoExterno\}',oferta.cidadeEspacoExterno) 
2139                .replace('\{classeCepRealizacao\}', oferta.cepEspacoExterno != "" && oferta.ruaEspacoExterno != "" ? "" : "d-none") 
2140                .replace('\{cepEspacoExterno\}',oferta.cepEspacoExterno) 
2141                .replace(regIndex, index) 
2142                .replace('\{tituloLocalRealizacao\}', tituloLocalRealizacao) 
2143                .replace('\{classeEntendi\}', ""); 
2144 
2145                $('.oferta-slick-area_modal').append(localRealizacaoHTMLModal); 
2146                $('.oferta-slick-area_modal').find('.d-none-btn').remove(); 
2147 
2148                if(oferta.ruaEspacoExterno == "") 
2149                $('.localEspacoExternoTexto_'+index).removeClass('ssp-modal-local-realizacao__subtitle'); 
2150
2151 
2152        //Formata exibicao de datas conforme especificacao GCR 
2153        function formataPeriodo(dataInicio, dataFim){ 
2154             
2155            var dtInicioPartes = dataInicio.split('/'); 
2156            var dtFimPartes = dataFim.split('/'); 
2157             
2158            //Não exibir o número zero antes dos números e o dia 1 como 1º 
2159            var dInicioFormatada = (parseInt(dtInicioPartes[0].trim()) == 1 ? '1º' : parseInt(dtInicioPartes[0].trim())) +'/'+parseInt(dtInicioPartes[1].trim())+'/'+dtInicioPartes[2].trim(); 
2160            var dFimFormatada = (parseInt(dtFimPartes[0].trim()) == 1 ? '1º' : parseInt(dtFimPartes[0].trim())) +'/'+parseInt(dtFimPartes[1].trim())+'/'+dtFimPartes[2].trim(); 
2161             
2162            //Quando um curso inicia e finaliza dentro do mesmo ano: 17/2 a 25/4/2020 
2163            if(dtInicioPartes[2].trim() == dtFimPartes[2].trim()){ 
2164                 
2165                dInicioFormatada = (parseInt(dtInicioPartes[0].trim()) == 1 ? '1º' : parseInt(dtInicioPartes[0].trim()))+'/'+parseInt(dtInicioPartes[1].trim()); 
2166                 
2167                //Quando um curso inicia e finaliza dentro do mesmo mês: 5 a 30/4/2020 
2168                if(dtInicioPartes[1].trim() == dtFimPartes[1].trim()) 
2169                dInicioFormatada = (parseInt(dtInicioPartes[0].trim()) == 1 ? '1º' : parseInt(dtInicioPartes[0].trim())); 
2170
2171             
2172            return dInicioFormatada + ' a ' + dFimFormatada; 
2173
2174 
2175        function strToFloat(str) { 
2176            const separator = str.includes(',') ? ',' : '.' 
2177 
2178            const numArr = str.split(separator) 
2179            const inteiro = numArr[0].replaceAll('.', '').replaceAll(',', '.') 
2180            const decimal = numArr[1] ? numArr[1].replaceAll('.', '').replaceAll(',', '.') : '' 
2181            return parseFloat(inteiro.concat('.').concat(decimal ? decimal : '0')) 
2182
2183 
2184        function associaEventosFecharModal(i){ 
2185 
2186            var closeModalLocalRealizacao = document.getElementsByClassName("ssp-card-modal-local-realizacao__btn-close_"+i)[0]; 
2187            var btnEntendiLocalRealizacao = document.getElementsByClassName("ssp-modal-local-realizacao__btn_"+i)[0]; 
2188 
2189            //event close modal 
2190            closeModalLocalRealizacao.onclick = function() { 
2191 
2192                $('[id^="modalLocalRealizacao_"]').each(function(index,modal){ 
2193                modal.style.display = "none"; 
2194                 
2195                }); 
2196
2197 
2198            btnEntendiLocalRealizacao.onclick = function() { 
2199             
2200                $('[id^="modalLocalRealizacao_"]').each(function(index,modal){ 
2201                modal.style.display = "none"; 
2202                }); 
2203
2204 
2205            // When the user clicks anywhere outside of the modal, close it 
2206            window.onclick = function(event) { 
2207 
2208                $('[id^="modalLocalRealizacao_"]').each(function(index,_modal){ 
2209                    if (event.target == _modal)  
2210                        _modal.style.display = "none"; 
2211                }); 
2212                 
2213             
2214
2215        }  
2216 
2217         //Abrir e fechar modal 
2218 
2219        function closeModalFormAprendizagem(){ 
2220            let modal = document.querySelector('[data-modal="modal"]') 
2221                     
2222            modal.classList.remove('open-modal-form') 
2223                 
2224
2225                 
2226                 
2227        function openModalFormAprendizagem(){ 
2228            let modal = document.querySelector('[data-modal="modal"]') 
2229                 
2230            modal.classList.add('open-modal-form') 
2231             
2232
2233 
2234        function cloneObj(original) { 
2235    	  return JSON.parse(JSON.stringify(original)); 
2236
2237 
2238         
2239    </script>