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 957, 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 957, 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                        <div class="${prefix}-header-curso__tag-formato bg-nivel-jovem-aprendiz"> 
818                            <span>Jovem Aprendiz</span> 
819                        </div> 
820 
821                    </div> 
822 
823                        <#--  Detalhe de Curso  --> 
824 
825                        <section id="curso-info"> 
826 
827                            <div class="ssp-card-detalhe-curso__container"> 
828                                 
829                                <div class="ssp-card-detalhe-curso"> 
830 
831                                    <div class="ssp-card-detalhe-curso__tag-color-tipo bg-nivel-jovem-aprendiz"></div> 
832 
833                                    <div class="container"> 
834 
835                                        <div class="ssp-card-detalhe-curso__content"> 
836 
837                                            <div> 
838 
839                                                <h1 class="ssp-card-detalhe-curso__title">${tituloCurso}</h1> 
840                                                <span class="ssp-card-detalhe-curso__description">${objetivo}</span> 
841 
842                                            </div> 
843 
844                                            <div class="ssp-card-detalhe-curso__secunday-info-content"> 
845 
846                                                <#list entry.getCategories()![] as category> 
847                                     
848 
849                                                    <#assign vocabularyName = vocabularyLocalService.getVocabulary(category.getVocabularyId()).getTitle("pt-br")?trim /> 
850 
851                                                        <#if normalizer.normalize(vocabularyName) == "tipo-de-curso"> 
852                                                            <#assign normalizedCategoryName = normalizer.normalize(category.getName()) /> 
853                                                            <a class="ssp-card-detalhe-curso__secunday-info-back-link d-lg-none d-md-none" href="#">${category.getName()}</a>  
854                                                        </#if> 
855 
856                                                </#list>  
857 
858                                                <#if cargaHoraria?length != 0>      
859                                                    <p class="ssp-card-detalhe-curso__secundary-info-carga-horaria">${cargaHoraria}</p> 
860                                                </#if> 
861                                                 
862                                            </div> 
863 
864                                        </div> 
865                                         
866                                            <div class="ssp-saiba-mais-curso-accordion"> 
867 
868                                                <#--  Get no campo repeatable  --> 
869                                                <#assign topicoItemRepeatableNode = document.getRootElement().selectNodes("//dynamic-element[@field-reference='topicoItemFieldSet']") /> 
870																					 
871                                                <#--  Lista de cardsUnidades  --> 
872                                                <#list topicoItemRepeatableNode as itemTopico> 
873 
874                                                    <#--  ìcone Slider  --> 
875                                                    <#assign tituloTopico = itemTopico.selectSingleNode("dynamic-element[@field-reference='tituloTopico']").getStringValue()?trim> 
876 
877                                                    <#--  Nome da Unidade  --> 
878                                                    <#assign descTopico = itemTopico.selectSingleNode("dynamic-element[@field-reference='descTopico']").getStringValue()?trim> 
879 
880                                                    <div class="ssp-saiba-mais-curso-accordion__body">          
881                                                        <div class="ssp-saiba-mais-curso-accordion__heading">${tituloTopico}</div> 
882                                                        <div class="ssp-saiba-mais-curso-accordion__contents">${descTopico}</div> 
883                                                    </div> 
884 
885                                                </#list> 
886 
887                                            </div>                                             
888 
889                                    </div>                   
890                                                 
891                                </div> 
892                            </div>  
893 
894                             <!-- Confira as novas turmas --> 
895 
896                             <section class="ssp-section-novas-turmas" style="background: #2a2e43;"> 
897                                <div class="container"> 
898 
899                                    <h3 class="ssp-section-title ssp-card-oferta-curso__section-title" style="margin: 24px 0;">Confira as unidades com vagas disponíveis</h3> 
900 
901                                    <div class="row ssp-filters-px justify-content-center"> 
902                                        <div class="col-12 col-lg px-md-0 order-1"> 
903                                            <div class="ssp-container-selecione-unidade row no-gutters"> 
904                                              <div class="col-12"> 
905                                                <div class="ssp-container__form-select mx-auto"> 
906                                                    <label for="unidades-ofertas" class="ssp-switch-label ssp-switch-label-section mx-0 d-none d-lg-block">Selecione uma unidade:</label> 
907                                                    <select id="unidades-ofertas" class="form-control" name="unidades-ofertas"> 
908                                                        <option value="">Selecione uma unidade</option> 
909                                                    </select> 
910                                                </div> 
911                                              </div> 
912                                            </div> 
913                                        </div> 
914 
915                                        <div id="ssp-alternadores" class="col mt-5 mt-lg-0 px-md-0 order-3 order-lg-2" style="max-width: 480px;"> 
916                                            <div class="row no-gutters ssp-switch-label ssp-switch-label-section mx-0">Filtre por:</div> 
917                                            <div class="row no-gutters mt-4"> 
918                               
919                                                <div class="col-12 col-lg"> 
920                                                  <div class="d-flex justify-content-between justify-content-lg-start"> 
921                                                    <label class="ssp-switch order-2 order-lg-1"> 
922                                                      <input type="checkbox" id="chkInscricao"> 
923                                                      <span class="ssp-switch-slider round"></span> 
924                                                    </label> 
925                                                    <label for="chkInscricao" class="ssp-switch-label order-1 order-lg-2">Inscrições abertas</label>   
926                                                  </div> 
927                                                </div> 
928                                                 
929                                                <div class="ssp-switch-divider d-md-none my-4"></div> 
930                               
931                                            </div> 
932                                        </div> 
933 
934                                        <div class="col-12 order-2 order-lg-3"> 
935                                            <div class="row text-center text-lg-left"> 
936                                              <div id="msgFiltroAplicado" class="col-12 ssp-switch-label-message" style="display: none;"> 
937                                                <div class="row no-gutters"> 
938                                                  <span class="col-12 ssp-col-lg-without">Filtro aplicado com sucesso! Confira o resultado.</span> 
939                                                </div> 
940                                              </div> 
941                                            </div> 
942                                        </div> 
943                                     
944                                    </div> 
945 
946                                    <div class="ssp-ofertas__box-endereco-unidade d-none"> 
947                                        <i class="icon-map-adress"></i> 
948                                        <a href="" target="_blank" class="ssp-ofertas__endereco-unidade"></a> 
949                                    </div> 
950 
951                                </div> 
952 
953                            </section> 
954 
955                            <input type="hidden" name="codigoFT" value="${codigoFT}" /> 
956                            <input type="hidden" name="dataEfetivaSTR" value="${dataEfetivaSTR}" /> 
957														<input type="hidden" name="articleId" value="${articleId}" />											 
958                             
959 
960                            <#-- Section para listar as ofertas - 9525 -28/02/2022--> 
961                            <section id="ssp-section-response" class="ssp-section" style="background: #2a2e43; position: relative;"> 
962 
963                                    <div id="turmas-container" class="container"> 
964                                 
965                                        <div id="informe-novas-turmas"> 
966                                            <div style="display: flex; flex-wrap: nowrap;"> 
967                                     
968                                                <a class="prev-mobile d-lg-none d-xl-none nextPrevOpacity" href="#" > 
969                                                <i class="fas fa-chevron-left"></i> 
970                                                </a> 
971                                     
972                                                <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> 
973                                     
974                                                <a href="#" class="next-mobile d-lg-none d-xl-none" > 
975                                                <i class="fas fa-chevron-right"></i> 
976                                                </a> 
977                                     
978                                            </div> 
979                                         
980                                     
981                                            <div  class="oferta-slick-area oferta-slick-area--md-bleed slider-container"> 
982                                         
983                                            </div> 
984                                        </div> 
985 
986                                        <div class="ssp-card-oferta-curso__sem-vaga d-none" style="margin: auto;"> 
987                                     
988                                            <h3 class="ssp-card-oferta-curso__sem-vaga-title"> 
989                                                Poxa... Estamos sem turmas agendadas no momento. 
990                                            </h3> 
991                                         
992                                            <p class="ssp-card-oferta-curso__sem-vaga-description"> 
993                                                Mas, registre seu interesse aqui embaixo e avisamos você quando surgirem novas turmas.  
994                                            </p> 
995                                        </div> 
996                                         
997                                        <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> 
998                                         
999                                        <div class="oferta-slick-area_modal"> 
1000                                        </div> 
1001                                    </div> 
1002                                 
1003                                    <div id="ssp-abrir-pagina-bolsa" class="ssp-card-duvida__bolsa-estudo d-none" style="margin-top: 44px;"> 
1004 
1005                                        <p>Tem dúvidas sobre bolsas de estudo?</p> 
1006                                        <a href="/bolsas-de-estudo/como-funciona">Saiba como funciona</a> 
1007 
1008                                    </div> 
1009                                 
1010                            </section> 
1011 
1012                            <!-- Aviso para curso de aprendizagem --> 
1013                            <div id="aviso-curso-aprendizagem" class="ssp-bolsa-formulario__card-aviso-atencao d-none" style="width: 100%;"> 
1014             
1015                                <i class="fas fa-exclamation-circle ssp-bolsa-formulario__card-aviso-atencao-icon" aria-hidden="true"></i> 
1016                             
1017                                <div class="ssp-bolsa-formulario__card-aviso-texto"> 
1018                                    <p>Para contratar aprendiz, preencha o formulário e entraremos em contato.</p> 
1019                                  </div> 
1020                             
1021                            </div> 
1022 
1023 
1024                        <!-- modal form de aprendizagem --> 
1025 
1026                        <#assign resources = themeDisplay.getPortalURL() /> 
1027                        <link href="${resources}/documents/d/global/css-formulario-aprendizagem" rel="stylesheet" type="text/css"> 
1028 
1029                        <dialog id="modal-form" class="ssp-modal-ds"> 
1030 
1031                            <button type="button" data-modal="close-form-modal"> 
1032                                Fechar 
1033                                <i class="fas fa-times"></i> 
1034                            </button> 
1035 
1036                        </dialog> 
1037 
1038    </#list> 
1039 
1040                                                                 
1041    <script> 
1042 
1043            const codigoFT = $('[name="codigoFT"]').val(); 
1044            const dataEfetiva = $('[name="dataEfetivaSTR"]').val(); 
1045            const articleId = $('[name="articleId"]').val(); 
1046            var ofertasMap = new Map(); 
1047            var groupId = themeDisplay.getScopeGroupId(); 
1048            var startOfertaParam = 0; 
1049            var endOfertaParam = 16; 
1050            var regIndex = new RegExp('\{index\}', 'g'); 
1051 
1052            var objsTela = { 
1053                    unidades: [], 
1054                    categoriesIds:[] 
1055            }; 
1056 
1057            var urlSearchCursoInfo = '/o/senac-content-services/cursosInfoDetalhe/{groupId}/{cursosInfo}?inscricaoAberta={inscricaoAberta}&bolsaAberta={bolsaAberta}'; 
1058            var urlUnidadeInfoDetalhe = '/o/senac-content-services/unidadeInfoDetalhe/{companyId}/{codigoUnidade}'; 
1059            var urlSearchOferta = '/o/senac-oferta-services/ofertasPorCategoryIds/' + groupId 
1060 
1061            $(document).ready(function(){ 
1062                 
1063 
1064                const urlParams = new URLSearchParams(window.location.search); 
1065                $('#chkInscricao').prop("checked", urlParams.get('inscricao') == 'true'); 
1066                $('#chkInscricao').change(ev => selectFilter('inscricao', $('#chkInscricao')) ); 
1067 
1068                loadUnidades(true,"") 
1069 
1070                $(".next-mobile").on("click",function(e){  
1071                    e.preventDefault();  
1072                         
1073                    acoesMobileSliderOfertas("left"); 
1074                }); 
1075                     
1076                $(".prev-mobile").on("click",function(e){  
1077                    e.preventDefault();  
1078                     
1079                    acoesMobileSliderOfertas("right");	 
1080                }); 
1081                     
1082                    //ação de drag do card de ofertas no mobile 
1083                $('.oferta-slick-area').on('swipe', function(event, slick, direction){ 
1084                    acoesMobileSliderOfertas(direction); 
1085                }); 
1086 
1087                // Modal Aprendizagem 
1088                let modalFormAprendizagem = document.querySelector('[data-modal="modal"]') 
1089                if(modalFormAprendizagem){ 
1090                // Create dinamic close buttom form 
1091                let btnCloseModalForm = document.querySelector('[data-modal="close-form-modal"]') 
1092                 
1093                btnCloseModalForm.addEventListener('click',closeModalFormAprendizagem) 
1094                 
1095
1096         
1097                $(".oferta-slick-area").on("click", ".btnModalAprendizagem", openModalFormAprendizagem); 
1098 
1099            }); 
1100 
1101        $(".ssp-saiba-mais-curso-accordion").on("click", ".ssp-saiba-mais-curso-accordion__heading", function() { 
1102 
1103            $(this).toggleClass("active").next().slideToggle(); 
1104 
1105            $(".sp-saiba-mais-curso-accordion__contents").not($(this).next()).slideUp(300); 
1106                         
1107            $(this).siblings().removeClass("active"); 
1108        }); 
1109 
1110        function acoesMobileSliderOfertas(direcao){ 
1111             
1112            if(direcao == "right"){ 
1113            $("a.slick-prev").click();  
1114             
1115            if($('.slick-current').attr('data-slick-index') == "0") 
1116                $('.prev-mobile').addClass('nextPrevOpacity'); 
1117             
1118            if($(".next-mobile").hasClass('nextPrevOpacity')) 
1119                $('.next-mobile').removeClass('nextPrevOpacity'); 
1120
1121             
1122             
1123            if(direcao == "left"){ 
1124                $("a.slick-next").click(); 
1125                 
1126                if($(".prev-mobile").hasClass('nextPrevOpacity')) 
1127                    $('.prev-mobile').removeClass('nextPrevOpacity'); 
1128                 
1129                if(carregouUltimaOferta){ 
1130                    var totalCardOfertas = $('#turmas-container .slick-area__item').length; 
1131                    var currentSliderIndex = parseInt($('.slick-current').attr('data-slick-index'));   
1132 
1133                    //o card do meio é o último	 
1134                if(totalCardOfertas == (currentSliderIndex + 1)) 
1135                $('.next-mobile').addClass('nextPrevOpacity'); 
1136
1137
1138        }     
1139 
1140        function loadUnidades(showOptions, unidadeValue){ 
1141 
1142            //Busca as unidades do curso 
1143            const urlCursoInfo = urlSearchCursoInfo 
1144            .replace('\{groupId\}', groupId) 
1145            .replace('\{cursosInfo\}', $('[name="articleId"]').val()) 
1146            .replace('\{inscricaoAberta\}', $('#chkInscricao').prop('checked')) 
1147            .replace('\{bolsaAberta\}', false); 
1148 
1149            $.ajax({ 
1150                url:urlCursoInfo, 
1151                method:'get', 
1152                async: false, 
1153                beforeSend: function () { 
1154                loading('.oferta-slick-area'); 
1155
1156                }).done( 
1157                function(data){ 
1158                     
1159                    if(data.length > 0){ 
1160                     
1161                        const cursoInfo = JSON.parse(data); 
1162                         
1163                                                 
1164                        //GCR pediu para voltarmos no combo as unidades vinculadas e não somente as que possuem ofertas 
1165                        //const unidades = cursoInfo.unidadesComOferta; 
1166                        const unidades = cursoInfo.unidadesOfertantes; 
1167                         
1168                        objsTela.unidades = [] 
1169                        mapUnidadesIds = new Map(); 
1170                         
1171                        $.each(unidades, function(k,item){ 
1172                             
1173                            var unidade = cloneObj(item); 
1174                            unidade['categoryId'] = item['categoryId']; 
1175                            unidade['codigoUnidade'] = item['codigoUnidade']; 
1176                            unidade['nome'] = item['nomeUnidade']; 
1177                            unidade['enderecoUnidade'] =item['enderecoUnidade']; 
1178                            unidade['numero'] =item['numEnderecoUnidade']; 
1179                            unidade['complemento'] = item['complementoEnderecoUnidade']; 
1180                            unidade['bairro'] = item['bairroUnidade']; 
1181                            unidade['googlemapsUnidade'] = item['googlemapsUnidade']; 
1182                            unidade['ofertas'] = []; 
1183                            unidade['friendlyURL'] = item['friendlyURL']; 
1184                                 
1185                                objsTela.unidades.push(unidade); 
1186                                 
1187                                mapUnidadesIds.set(unidade['categoryId'], unidade['codigoUnidade']); 
1188													     console.log("items ", item) 
1189                            }); 
1190                                         
1191                        populaSelectUnidades(undefined, showOptions, unidadeValue);  
1192 
1193
1194            }); 
1195 
1196
1197 
1198        function selectFilter(paramkey, el) { 
1199            setUrlParam(paramkey, el.prop("checked")) 
1200            var unidades = objsTela.unidades; 
1201            //const currentUnidadeFriendlyURLSelected = $('#unidades-ofertas').find('option').filter(':selected').attr('data-unidade-friendly-url') 
1202 
1203            splitted = $('#unidades-ofertas').val().split("@"); 
1204            var categoryIdUnidade = splitted[0]; 
1205            var codUnidade = splitted[1]; 
1206            console.log("splitted ", splitted) 
1207            for(var i = 0; unidades.length > i ; i++){ 
1208 
1209                if(unidades[i].categoryId == categoryIdUnidade){ 
1210 
1211                    getOfertas(codigoFT, dataEfetiva, unidades[i].categoryId,  $('#chkInscricao').prop("checked")); 
1212                     
1213
1214
1215            loadUnidades(true, "") 
1216 
1217            if($('#chkInscricao').prop("checked")) $('#msgFiltroAplicado').show() 
1218            else $('#msgFiltroAplicado').hide() 
1219
1220 
1221        function setUrlParam(key, value) { 
1222			const url = new URL(window.location.href); 
1223 
1224			if(value) 
1225			  url.searchParams.set(key, value); 
1226			else 
1227			  url.searchParams.delete(key); 
1228 
1229			window.history.pushState({}, '', url.toString()) 
1230
1231 
1232        function defineCurrentUrl(ev) { 
1233            const currentUnidadeFriendlyURLSelected = $(ev.target).find('option').filter(':selected').attr('data-unidade-friendly-url') 
1234 
1235            const hasPathWeb = window.location.pathname.includes('/web') 
1236            const hasPathGuest = window.location.pathname.includes('/guest') 
1237 
1238            let currentPath = window.location.pathname 
1239            currentPath = hasPathWeb ? currentPath.substring(4) : currentPath 
1240            currentPath = hasPathGuest ? currentPath.substring(6) : currentPath 
1241 
1242            objsTela.unidadesRegistroInteresse.forEach(unidade => currentPath = currentPath.replace('/' + unidade.friendlyURL, '')) 
1243 
1244            currentPath = (currentUnidadeFriendlyURLSelected ? '/' + currentUnidadeFriendlyURLSelected : '') + currentPath 
1245            currentPath = hasPathGuest ? '/guest' + currentPath : currentPath 
1246            currentPath = hasPathWeb ? '/web' + currentPath : currentPath 
1247 
1248        if(keepURL()) 
1249            window.history.replaceState(window.history.state, '', currentPath + window.location.search) 
1250
1251 
1252         
1253 
1254        function populaSelectUnidades(unidades, showOptions, unidadeValue){ 
1255 
1256            //Oredenacao 
1257            objsTela.unidades.sort(function (a, b) { 
1258                return ordenar(a, b, 'nome'); 
1259            }); 
1260 
1261            $('#informe-novas-turmas, .ssp-ofertas__box-endereco-unidade').addClass('d-none'); 
1262            hideCardSemTurmas(true) 
1263 
1264            //console.log('Unidade Pre '+unidadePreSelecionada); 
1265 
1266            if(objsTela.unidades.length == 0){ 
1267                if(!showOptions) 
1268                    $('.ssp-container-selecione-unidade').addClass('d-none'); 
1269                $('.oferta-slick-area').empty(); 
1270                $('.prev-mobile').addClass('d-none'); 
1271                $('.next-mobile').addClass('d-none'); 
1272 
1273
1274 
1275            let unidadeFounded; 
1276 
1277            $('#unidades-ofertas').empty() 
1278 
1279            if(objsTela.unidades && objsTela.unidades.length) 
1280                $('#unidades-ofertas').append($('<option value="">Clique na unidade de interesse</option>')) 
1281            else 
1282                $('#unidades-ofertas').append($('<option value="">Nenhum resultado encontrado</option>')) 
1283 
1284            unidadeFounded = criarOptionUnidadesPorRegiao(objsTela.unidades) 
1285 
1286          /*  $.each(objsTela.unidades, function(k,unidade){ 
1287 
1288                if($('#unidades-ofertas').find('[value="'+unidade['categoryId']+'"]').length == 0){ 
1289 
1290                    var option = $('<option>'); 
1291                    option.val(unidade['categoryId']+"@"+unidade['codigoUnidade']); 
1292                    option.text(unidade['nome']); 
1293                    option.attr('data-unidade-friendly-url', unidade.friendlyURL) 
1294                 
1295                    $('#unidades-ofertas').append(option); 
1296                 
1297                     
1298
1299            }); 
1300 
1301            **/ 
1302 
1303            if(unidadeFounded){	             
1304	            $('#unidades-ofertas').val(unidadeFounded['categoryId']+"@"+unidadeFounded['codigoUnidade']); 
1305	            $('#unidades-ofertas').change(); 
1306	        }  
1307 
1308            loadAlternadores(); 
1309 
1310            $('.prev-mobile').addClass('d-none'); 
1311            $('.next-mobile').addClass('d-none'); 
1312            $('.oferta-slick-area').empty(); 
1313            
1314 
1315
1316 
1317        function ordenar(objA, objB, nomeAtributo){ 
1318            let a = (nomeAtributo) ? objA[nomeAtributo] : objA; 
1319            let b = (nomeAtributo) ? objB[nomeAtributo] : objB; 
1320 
1321            if (a > b) return 1; 
1322            if (a < b) return -1; 
1323            return 0; 
1324
1325 
1326        $('#unidades-ofertas').change(ev => { 
1327            mudarUnidade(ev) 
1328        }); 
1329 
1330 
1331        function mudarUnidade(ev){  
1332 
1333            var elem = $(ev.target); 
1334            var unidades = objsTela.unidades; 
1335 
1336            //Unidade sem value tratamento 
1337            if(!elem.val()){ 
1338                    $('#informe-novas-turmas, .ssp-ofertas__box-endereco-unidade').addClass('d-none'); 
1339 
1340                if($('#unidades-ofertas option').length <= 1) 
1341                    hideCardSemTurmas(false) 
1342                else 
1343                    hideCardSemTurmas(true)          
1344 
1345                 
1346                elem.val('') 
1347                return; 
1348            } else { 
1349                $('#informe-novas-turmas, .ssp-ofertas__box-endereco-unidade').removeClass('d-none'); 
1350 
1351                if($('#unidades-ofertas option').length <= 1) 
1352                    hideCardSemTurmas(false) 
1353                else 
1354                    hideCardSemTurmas(true)    
1355
1356 
1357            //colocamos dentro do option categoryId@codUnidade 
1358            splitted = elem.val().split("@"); 
1359            var categoryIdUnidade = splitted[0]; 
1360            var codUnidade = splitted[1]; 
1361            console.log("splitted ", splitted) 
1362            for(var i = 0; unidades.length > i ; i++){ 
1363 
1364                if(unidades[i].categoryId == categoryIdUnidade){ 
1365 
1366                    var unidade = unidades[i]; 
1367                     
1368                    //Exibe o endereco da unidade 
1369                    const urlBuscaUnidade = urlUnidadeInfoDetalhe 
1370                    .replace('\{companyId\}',themeDisplay.getCompanyId()) 
1371                    .replace('\{codigoUnidade\}', unidade.codigoUnidade); 
1372                     
1373                    $.ajax({ 
1374                            url :  urlBuscaUnidade, 
1375                            type : 'get', 
1376                            dataType: 'json', 
1377                            success: function( unidadeInfo ) { 
1378                            if(unidadeInfo != null && typeof unidadeInfo !== 'undefined'){ 
1379                                 
1380                                var endereco = concatSTR(unidadeInfo.enderecoUnidade,unidadeInfo.numEnderecoUnidade,', '); 
1381                                    endereco = concatSTR(endereco,unidadeInfo.complementoEnderecoUnidade, ' - '); 
1382                                    endereco = concatSTR(endereco,unidadeInfo.bairroUnidade, ' - '); 
1383                             
1384                                    $('.ssp-ofertas__endereco-unidade').text(endereco); 
1385                                    $('.ssp-ofertas__endereco-unidade').attr('href',unidadeInfo.googlemapsUnidade); 
1386                                    $('.ssp-ofertas__box-endereco-unidade').removeClass("d-none")   
1387
1388                            }, 
1389                            error: function(data){ 
1390                            $('.ssp-ofertas__box-endereco-unidade').addClass("d-none")     
1391                            $('.ssp-ofertas__endereco-unidade').text(''); 
1392                            $('.ssp-ofertas__endereco-unidade').attr('href','#a'); 
1393                                console.log('Unidade não encontrada'); 
1394
1395                        }) 
1396                         
1397                    getOfertas(codigoFT, dataEfetiva, unidades[i].categoryId, $('#chkInscricao').prop("checked")); 
1398                     
1399
1400            }   
1401             
1402
1403 
1404        function criarOptionUnidadesPorRegiao(unidades) { 
1405    	  let regioes = {} 
1406    	  let unidadeFounded 
1407 
1408    	  unidades.forEach(unidade => { 
1409    	    if(!regioes[unidade.codRegiaoUnidade || 'N']) 
1410    	      regioes[unidade.codRegiaoUnidade || 'N'] = [] 
1411 
1412    	    regioes[unidade.codRegiaoUnidade || 'N'].push(unidade) 
1413    	  }) 
1414 
1415    	  Array.from(['C', 'I', 'GS', 'N']) 
1416    	  .filter(key => Object.keys(regioes).includes(key)) 
1417    	  .forEach(key => { 
1418    	    const unidadesDaRegiao = regioes[key] 
1419 
1420    	    const optionDisabled = $('<option>') 
1421    	    optionDisabled.attr('label', getRegiaoName(key)) 
1422    	    optionDisabled.text(getRegiaoName(key)); 
1423    	    optionDisabled.attr('disabled', true) 
1424    	    optionDisabled.addClass('ssp-option-group') 
1425    	    $('#unidades-ofertas').append(optionDisabled) 
1426 
1427    	    $.each(unidadesDaRegiao, function(k,unidade){       
1428    	      if($('#unidades-ofertas').find('[value="'+unidade['categoryId']+'"]').length == 0){         
1429    	        var option = $('<option>'); 
1430    	        option.val(unidade['categoryId']+"@"+unidade['codigoUnidade']); 
1431    	        option.text(unidade['nome']); 
1432    	        option.attr('data-unidade-friendly-url', unidade.friendlyURL) 
1433    	        option.addClass('ssp-option') 
1434    	   
1435    	        $('#unidades-ofertas').append(option); 
1436    	     
1437    	        unidadeFounded = !unidadeFounded	           
1438
1439    	    }) 
1440    	  }) 
1441 
1442    	  return unidadeFounded 
1443
1444 
1445        function getRegiaoName(key) { 
1446    	  switch (key) { 
1447    	    case "C": 
1448    	      return "Capital"; 
1449    	    case "I":             
1450    	      return "Interior"; 
1451    	    case "GS": 
1452    	      return "Grande São Paulo e Litoral"; 
1453    	    default: 
1454    	      return "Sem Região"; 
1455
1456
1457 
1458        function loadAlternadores() { 
1459 
1460            let $alternadores = $('#ssp-alternadores'); 
1461            if($('#unidades-ofertas').is(":hidden") || $('#unidades-ofertas option').length <= 1) { 
1462 
1463                if(!$('#chkInscricao').prop('checked')) $alternadores.hide(); 
1464                else $alternadores.show(); 
1465             
1466            }else $alternadores.show(); 
1467 
1468
1469 
1470        function hideCardSemTurmas(hide){ 
1471            if(hide){ 
1472                $('.ssp-card-oferta-curso__sem-vaga').addClass('d-none'); 
1473                $('.ssp-card-oferta-curso__mensagem-legal').css('margin', '0px 0 0 0;') 
1474            }else{ 
1475                $('.ssp-card-oferta-curso__sem-vaga').removeClass('d-none'); 
1476                $('.ssp-card-oferta-curso__mensagem-legal').css('margin', '') 
1477            }     
1478
1479 
1480            function getOfertas(codigoFT, dataEfetivaOferta, categoryId, filtrarInscricoes){ 
1481 
1482            var indiceUnidade = -1; 
1483 
1484            for(var i = 0; i < objsTela.unidades.length; i++) 
1485                if(objsTela.unidades[i].categoryId == categoryId) 
1486                    indiceUnidade = i; 
1487 
1488            if(!objsTela.categoriesIds.includes(categoryId) ||  
1489                objsTela.unidades[indiceUnidade].ofertasFiltradas != filtrarInscricoes){ 
1490 
1491                objsTela.unidades[indiceUnidade]['ofertas'] = [] 
1492 
1493                var params = new URLSearchParams(); 
1494                params.set('codigoFTOferta',codigoFT) 
1495                params.set('dataEfetivaOferta',dataEfetivaOferta) 
1496                params.set('categoryIds',categoryId) 
1497                params.set('start',startOfertaParam) 
1498                params.set('end',endOfertaParam) 
1499                params.set('inscricaoAberta', filtrarInscricoes) 
1500                params.set('bolsaAberta', false) 
1501                params.set('cursoArticleId', $('[name="articleId"]').val() || ''); 
1502                 
1503                const url = urlSearchOferta + '?' + params.toString() 
1504 
1505            $.ajax({ 
1506                url:url, 
1507                method:'get', 
1508                dataType:'json', 
1509                async: false 
1510            }).done( 
1511                function(data){ 
1512                 
1513                if(data.length > 0){ 
1514                    $('.ssp-container-selecione-unidade').show(); 
1515                     
1516                    data.forEach(function(ofertaJSON,index){ 
1517 
1518                    var oferta = getOfertaObjectFromJson(ofertaJSON,index); 
1519                     
1520                    //Preenche as ofertas da unidade              
1521                    objsTela.unidades[indiceUnidade]['ofertas'].push(oferta); 
1522                     
1523 
1524                    }); 
1525
1526                objsTela.categoriesIds.push(categoryId); 
1527                populaOfertas(objsTela.unidades[indiceUnidade]['ofertas']); 
1528                objsTela.unidades[indiceUnidade].ofertasFiltradas = filtrarInscricoes; 
1529
1530
1531 
1532            //Se estiver na cache, valida as ofertas 
1533            }else{ 
1534 
1535            populaOfertas(objsTela.unidades[indiceUnidade]['ofertas']); 
1536 
1537
1538
1539 
1540        function getOfertaObjectFromJson(ofertaJSON,index){ 
1541 
1542 
1543            var oferta =  {}; 
1544                    var xml =  $($.parseXML(ofertaJSON.content)); 
1545                    oferta['ordenar'] = paramOrdem(xml); 
1546                    oferta['vagasTotal'] = xml.find('[name="vagasTotal"]').text().trim(); 
1547                    var dataInicio = xml.find('[name="dataInicioOferta"]').text().split('-'); 
1548                    var dataFim =xml.find('[name="dataFimOferta"]').text().split('-'); 
1549                    oferta['dataInicio'] = dataInicio[2].trim()+'/'+dataInicio[1].trim()+'/'+dataInicio[0].trim(); 
1550                    oferta['dataFim'] = dataFim[2].trim()+'/'+dataFim[1].trim()+'/'+dataFim[0].trim(); 
1551                    oferta['horaInicio'] = xml.find('[name="horaInicioOferta"]').text(); 
1552                    oferta['codigoOferta'] = xml.find('[name="codigoOferta"]').text().trim(); 
1553                    var dias = []; 
1554                    oferta['horaFimOferta'] = xml.find('[name="horaFimOferta"]').text().trim(); 
1555                    xml.find('[name="diasDaSemanaOferta"]').find('option').each(function(index,dia){ 
1556                        dias.push($(dia).text()); 
1557                    }); 
1558                    oferta['diasDaSemanaOferta'] = dias; 
1559                    oferta['periodoDiaOferta'] = xml.find('[name="periodoDiaOferta"]').text().trim(); 
1560                    oferta['precoCheioOferta'] = xml.find('[name="precoCheioOferta"]').text().trim(); 
1561                    oferta['precoVendaOferta'] = xml.find('[name="precoVendaOferta"]').text().trim(); 
1562                    oferta['numeroMaxParcelasOferta'] = xml.find('[name="numeroMaxParcelasOferta"]').text().trim(); 
1563                     
1564                    oferta['textoCartoesAceitos'] =  pegarTextoCartoesAceitos(xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim()); 
1565                    oferta['numParcelaCartoes'] =  pegaNumParcela(xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim()); 
1566                    oferta['precoParcelaCartoes'] =  pegaValorParcela(xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim()); 
1567                    oferta['numParcelaBoleto'] =  pegaNumParcela(xml.find('[name="formaDePagamentoBoletoOferta"]').text().trim()); 
1568                    oferta['precoParcelaBoleto'] =  pegaValorParcela(xml.find('[name="formaDePagamentoBoletoOferta"]').text().trim()); 
1569                     
1570                    oferta['precoVendaMaxParcelaOferta'] = xml.find('[name="precoVendaMaxParcelaOferta"]').text().trim(); 
1571                    oferta['formaDePagamentoOferta'] = xml.find('[name="formaDePagamentoOferta"]').text().trim(); 
1572                    oferta['botaoCompraOferta'] = xml.find('[name="botaoCompraOferta"]').text().trim(); 
1573                    oferta['vagasParaCompraOferta'] = xml.find('[name="vagasParaCompraOferta"]').text().trim(); 
1574                    oferta['botaoBolsaOferta'] = xml.find('[name="botaoBolsaOferta"]').text().trim(); 
1575                    oferta['vagasBolsaOferta'] = xml.find('[name="vagasBolsaOferta"]').text().trim(); 
1576                    oferta['dataAberturaBolsaOferta'] = xml.find('[name="dataAberturaBolsaOferta"]').text().trim(); 
1577                    oferta['horaAberturaBolsaOferta'] = xml.find('[name="horaAberturaBolsaOferta"]').text().trim(); 
1578                    oferta['espacoExterno'] = xml.find('[name="espacoExterno"]').text().trim(); 
1579                    oferta['localEspacoExterno'] = xml.find('[name="localEspacoExterno"]').text().trim(); 
1580                    oferta['ruaEspacoExterno'] = xml.find('[name="ruaEspacoExterno"]').text().trim(); 
1581                    oferta['numeroEspacoExterno'] = xml.find('[name="numeroEspacoExterno"]').text().trim(); 
1582                    oferta['complementoEspacoExterno'] = xml.find('[name="complementoEspacoExterno"]').text().trim(); 
1583                    oferta['bairroEspacoExterno'] = xml.find('[name="bairroEspacoExterno"]').text().trim(); 
1584                    oferta['cidadeEspacoExterno'] = xml.find('[name="cidadeEspacoExterno"]').text().trim(); 
1585                    oferta['ufEspacoExterno'] = xml.find('[name="ufEspacoExterno"]').text().trim(); 
1586                    oferta['cepEspacoExterno'] = xml.find('[name="cepEspacoExterno"]').text().trim(); 
1587                    oferta['qtdeTotalVagas'] = xml.find('[name="qtdeTotalVagas"]').text().trim(); 
1588                    oferta['qtdeTotalVagasPSG'] = xml.find('[name="qtdeTotalVagasPSG"]').text().trim(); 
1589                    oferta['horariosAllOferta'] = xml.find('[name="horariosAllOferta"]').text().trim(); 
1590                    oferta['formaDePagamentoCartaoOferta'] = xml.find('[name="formaDePagamentoCartaoOferta"]').text().trim(); 
1591                    oferta['formaDePagamentoBoletoOferta'] = xml.find('[name="formaDePagamentoBoletoOferta"]').text().trim(); 
1592                    oferta['dtLimiteMatricula'] = xml.find('[name="dtLimiteMatricula"]').text().trim(); 
1593                    oferta['dataAberturaMatricula'] = xml.find('[name="dataAberturaMatricula"]').text().trim(); 
1594                    oferta['etapa'] = xml.find('[name="etapa"]').text().trim(); 
1595                    oferta['duracaoDescricaoOferta'] = xml.find('[name="duracaoDescricaoOferta"]').text().trim(); 
1596                     
1597                    return oferta;  
1598
1599 
1600        function populaOfertas(ofertas){ 
1601 
1602            objsTela.ofertas = ofertas; 
1603 
1604            if(ofertas && ofertas.length)  
1605            $('#ssp-h3-turmas').show() 
1606            else  
1607            $('#ssp-h3-turmas').hide() 
1608             
1609             
1610            if(ofertas.length == 0){ 
1611             
1612                if($('#unidades-ofertas').val() || $('#chkInscricao').prop('checked') || $('#chkBolsa').prop('checked')) 
1613                    hideCardSemTurmas(false) 
1614                 
1615                $('.oferta-slick-area').empty(); 
1616                $('.prev-mobile').addClass('d-none'); 
1617                $('.next-mobile').addClass('d-none'); 
1618                 
1619                 
1620                return; 
1621            }else{ 
1622                hideCardSemTurmas(true) 
1623                $('.prev-mobile, .next-mobile').removeClass('d-none'); 
1624
1625             
1626             
1627            $('.oferta-slick-area').empty(); 
1628            ofertas = ofertas.sort(function(a, b){ 
1629                return ordenar(a, b, 'ordenar'); 
1630            }); 
1631            // executa a class do slick slider 
1632            $('.oferta-slick-area').removeClass('slick-initialized slick-slider slick-dotted'); 
1633             
1634            //busca o codigoUnidade para o link do ecommerce 
1635             
1636            var selectedUnidade = $('#unidades-ofertas').val().split('@')[0]; 
1637            for(var i=0;objsTela.unidades.length > i ;i++){ 
1638                if(selectedUnidade == objsTela.unidades[i].categoryId) 
1639                    codigoUnidade = objsTela.unidades[i].codigoUnidade; 
1640
1641             
1642             
1643            for(var i=0;ofertas.length > i ;i++){ 
1644 
1645                var oferta = ofertas[i]; 
1646                 
1647                //guardando a oferta no map para chamar ajax com infos de bolsa em tempo real 
1648                oferta['indice'] = i; 
1649                ofertasMap.set(oferta.codigoOferta, oferta); 
1650                montaHTMLOferta(oferta, i, codigoUnidade, false);  
1651                montaHTMLModalLocalRealizacao(oferta, i);  
1652                verificaCursoAprendizagem(i, oferta.codigoOferta); 
1653                associaEventoBtnLocalRealizacao(i); 
1654                associaEventosFecharModal(i); 
1655                     
1656
1657 
1658            sliderOfertas(); 
1659
1660 
1661        function montaHTMLOferta(oferta, index, codigoUnidade, posLoad){ 
1662 
1663            var retornoDiasHorarios = processaDiasHorariosOferta(oferta.horariosAllOferta); 
1664            diasSemanaHTML = ""; 
1665 
1666            for(var diaDaOferta of retornoDiasHorarios){ 
1667                diasSemanaHTML += htmlSlickAreaDiasSemana.replace('\{diasSemana\}',diaDaOferta.dias); 
1668                diasSemanaHTML = diasSemanaHTML.replace('\{horasSemana\}',diaDaOferta.horario) 
1669            }    
1670 
1671            var ofertaHTML = ""; 
1672            ofertaHTML = htmlSlickArea(index, oferta, diasSemanaHTML, codigoUnidade) 
1673             
1674            if(!posLoad) 
1675                $('.oferta-slick-area').append(ofertaHTML); 
1676            else{ 
1677                $('.oferta-slick-area').slick('slickAdd', ofertaHTML);       
1678
1679             
1680            ajustaTextoDiasHorarioOferta(oferta.codigoOferta); 
1681             
1682            if(turmasIniciadas(oferta.dataInicio)) 
1683                $("#aviso-turma-iniciada-"+index).show(); 
1684 
1685            //remove os botões/itens de compra/bolsa caso seja preciso 
1686            $('.oferta-slick-area').find('.d-none-btn').remove(); 
1687
1688 
1689        function processaDiasHorariosOferta(horariosAllOferta){ 
1690 
1691            var dias = horariosAllOferta.trim().split(','); 
1692            let arrayDiasSemana = [{"Seg":"Segunda"},{"Ter":"Terça"},{"Qua":"Quarta"},{"Qui":"Quinta"},{"Sex":"Sexta"},{"Sab":"Sábado"},{"Dom":"Domingo"}] 
1693 
1694            var arrayDia = []; 
1695            if(dias.length >= 1){ 
1696                for(var k=0; dias.length > k; k++){ 
1697 
1698                    var diasSplit = dias[k].trim().split(' '); 
1699                    var diasSemana = diasSplit.shift() 
1700                    var ultimaPos = diasSplit.length-1; 
1701                    var horasStr = diasSplit[0] + ' às ' + diasSplit[ultimaPos]  
1702                    arrayDia.push({horasStr,diasSemana}); 
1703
1704
1705 
1706            arrayDia = groupByArray(arrayDia, 'horasStr','diasSemana'); 
1707            arrayDia = orderByArray(arrayDia,arrayDiasSemana); 
1708             
1709            var ret = diaHorarioOfertaFormatado(arrayDia,arrayDiasSemana); 
1710                return ret; 
1711
1712 
1713        //cria um array de objetos Agrupando de acordo ao campo informado como chave.  
1714        //@arr = Array multidimensional que tenha os campos key e valueAdd 
1715        //@key = campo que será chave nesse array 
1716        //@valueAdd = campo que será agrupado caso tenha a mesma informação passada no campo key 
1717        const groupByArray = (arr, key,valueAdd) => { 
1718                const initialValue = []; 
1719                const retornoValue = []; 
1720                arr.forEach((acc, cval) => { 
1721                    const myAttribute = cval[key]; 
1722                    acc[key] in retornoValue ? retornoValue[acc[key]].push(acc[valueAdd]):retornoValue[acc[key]]=[acc[valueAdd]]; 
1723                    return acc; 
1724                    }, initialValue); 
1725            return retornoValue; 
1726        }; 
1727 
1728 
1729        //Cria um array de objetos a partir do primeiro array inserido e ordenados de acordo a ordem do segundo array informado.  
1730        //@arrayOrdena = Array de objetos que tenha os campos que precisa ser ordenados 
1731        //@ordem = array com a sequencia que queira ordenar - ex: seg, ter, qua, qua 
1732        const orderByArray = (arrayOrdena, ordem) => { 
1733 
1734            let diasSem = []; 
1735            const arrayOrdenado = []; 
1736            let controle; 
1737             
1738            //percorre cada campo existente no ordem e busca o mesmo no arrayOrdena, encontrando insere no arrayOrdenado 
1739            for(let campo of ordem){	 
1740                Object.entries(arrayOrdena).forEach(([key, value]) => { 
1741                    for(let diaOferta of value){ 
1742                        if(diaOferta===Object.keys(campo)[0]){ 
1743                            arrayOrdenado[key]=arrayOrdena[key]; 
1744
1745
1746                }) 
1747
1748            return arrayOrdenado; 
1749        }; 
1750 
1751        function diaHorarioOfertaFormatado(arrayAgrupadoEOrdenado, arrayDiasDaSemana){ 
1752 
1753            var stringAux = "";		 
1754            var listRetorno = []; 
1755                 
1756            Object.entries(arrayAgrupadoEOrdenado).forEach(([key, value]) => {		 
1757 
1758                var sequencial = diasSequenciaisOuAlternados(value, arrayDiasDaSemana); 
1759                var stringAux = "";		 
1760                var diaOferta = {}; 
1761 
1762                if(sequencial){ 
1763                    switch (value.length) { 
1764                        case 1: 
1765                            stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+": "; 
1766                            diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula 
1767                            diaOferta.horario = key; 
1768                        break; 
1769                        case 2: 
1770                            stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+" e "+findValueInObject(arrayDiasDaSemana,value[value.length-1])+": "; 
1771                            diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula 
1772                            diaOferta.horario = key; 
1773                        break; 
1774                        default: 
1775                                stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+" a "+findValueInObject(arrayDiasDaSemana,value[value.length-1])+": "; 
1776                             
1777                            diaOferta.dias =  stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula 
1778                            diaOferta.horario = key; 
1779                        break; 
1780                    }	 
1781                }else{ 
1782                    switch (value.length) { 
1783                        case 2: 
1784                            stringAux = stringAux+findValueInObject(arrayDiasDaSemana,value[0])+" e "+findValueInObject(arrayDiasDaSemana,value[value.length-1])+": "; 
1785                            diaOferta.dias =  stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula 
1786                            diaOferta.horario = key; 
1787                        break; 
1788                        default: 
1789                            var ct = 0; 
1790                            var stringDias=""; 
1791                            for(let v of value){ 
1792                                ct++; 
1793                                ct==value.length ? stringDias=stringDias.substring(0,stringDias.length - 2)+" e "+findValueInObject(arrayDiasDaSemana,v) : stringDias+=findValueInObject(arrayDiasDaSemana,v)+", "; 
1794
1795                                stringAux = stringAux+stringDias+": "; 
1796                            diaOferta.dias = stringAux.charAt(0).toUpperCase() + stringAux.slice(1).toLowerCase(); // somente a primeira maiúscula 
1797                            diaOferta.horario = key; 
1798                        break; 
1799
1800
1801 
1802                listRetorno.push(diaOferta); 
1803            }) 
1804            return listRetorno; 
1805        }; 
1806 
1807        //retorna o valor de um objeto dentro de um array 
1808        //@objetoBusca = array de objetos que sera buscado o valor 
1809        //@keyBusca = nome do campo a ser buscada no objeto para pegar o seu valor 
1810        function findValueInObject(objetoBusca, keyBusca){ 
1811            var retorno = ""; 
1812            Object.entries(objetoBusca).forEach(([horario, dias]) => { 
1813                Object.entries(dias).forEach(([key,val]) => { 
1814                    if(key.trim()==keyBusca.trim()){ 
1815                        retorno = val; 
1816
1817                }); 
1818            }); 
1819            return retorno; 
1820
1821 
1822        //Recebe um objeto com valores dos dias da semana e define se sao dias seguidos ou alternados.  
1823        //@arrayComDiasDaSemana = array com os dias da semana a serem validados - exemplo ['Qua','Qui','Sex'] 
1824        //@keyBusca = nome do campo a ser buscada no objeto para pegar o seu valor 
1825        function diasSequenciaisOuAlternados(arrayComDiasDaSemana, arrayDiasDaSemana){ 
1826             
1827            let arrayValidador = []; 
1828             
1829            //cria um array com o index dos dias das semanas encontrados [0 = seg, 1 = ter ... 6 = dom] 
1830            for(let diaOferta of arrayComDiasDaSemana){ 
1831                for(let i = 0; i < arrayDiasDaSemana.length; i++){ 
1832                    if(diaOferta === Object.keys(arrayDiasDaSemana[i])[0]){ 
1833                        arrayValidador[i] = true; 
1834                    }				 
1835
1836
1837 
1838            let keyCompair = 99; 
1839            var sequencial = true; 
1840 
1841            //verifica quais posições foram criadas no array, e se os valores delas estão em sequencia. 
1842            for(let keyValidator of Object.keys(arrayValidador)){ 
1843                keyValidator = parseInt(keyValidator); 
1844                if(keyCompair!==99){ 
1845                    if(keyValidator===keyCompair){ 
1846                        sequencial = true; 
1847                    }else{ 
1848                        sequencial = false; 
1849                        break; 
1850
1851
1852                keyCompair = keyValidator+1; 
1853
1854            return sequencial; 
1855
1856 
1857        function concatSTR(str1, str2, separador){ 
1858 
1859            if(str2){ 
1860 
1861            return str1+separador+str2; 
1862
1863            return str1; 
1864
1865 
1866        //Distribui dia e horario com quebra de linha entre eles ou nao dependendo da resolução de tela e tamanho da string 
1867        function ajustaTextoDiasHorarioOferta(codOferta){ 
1868 
1869            var classOferta = ".codigoOferta_"+codOferta;  
1870            let oferta = $(classOferta); 
1871 
1872            let ofertaDiasSemana = $(oferta).find('*[data-dia-hora="dias-semana"]'); 
1873 
1874            let widthDevice = window.screen.width; 
1875            let tamLimDesktop = 185; 
1876             
1877            if(widthDevice <= 1024){ 
1878                tamLimDesktop = 180; 
1879
1880             
1881            ofertaDiasSemana.each(function(index){ 
1882 
1883                             
1884                let widthDiaSemana = $(this).width(); 
1885             
1886                let contentDiaHora = $(this).parent().parent().parent(); 
1887                 
1888                if(!(widthDiaSemana <= tamLimDesktop)){ 
1889                    $(this).css("display","block"); 
1890
1891             
1892                if(ofertaDiasSemana.length == parseInt(index+1)){ 
1893                    contentDiaHora.css("opacity","1"); 
1894
1895 
1896                })  
1897
1898 
1899        function turmasIniciadas(dataInicioCurso){ 
1900 
1901            var hoje = new Date();  
1902            var dataInicioPartes = dataInicioCurso.split('/');  
1903            var dataInicioCursoOferta = new Date(dataInicioPartes[2], dataInicioPartes[1] - 1, dataInicioPartes[0] , hoje.getHours(),hoje.getMinutes(),hoje.getSeconds(),hoje.getMilliseconds()); 
1904 
1905            return dataInicioCursoOferta.getTime() <= hoje.getTime(); 
1906
1907 
1908        function paramOrdem(xml){ 
1909            return xml.find('[name="dataInicioOferta"]').text(); 
1910
1911 
1912        function pegarTextoCartoesAceitos(campo){ 
1913            indice = campo.indexOf(' em até '); 
1914            inicio = 0; 
1915            fim = indice; 
1916             
1917            return campo.substring(inicio, fim); 
1918
1919 
1920        function pegaNumParcela(campo){ 
1921 
1922            indice = campo.indexOf('até '); 
1923            inicio = indice + 4; 
1924            fim = indice +  6; 
1925             
1926            return campo.substring(inicio, fim); 
1927             
1928
1929 
1930        function pegaValorParcela(campo){ 
1931             
1932            indice = campo.indexOf('R$'); 
1933            inicio = indice+2;     
1934            valorAmericano = campo.substring(inicio) 
1935             
1936            return formataValor(valorAmericano); 
1937             
1938
1939 
1940        function formataValor(valor){ 
1941 
1942            if(!valor.toString().includes(".")){ 
1943                valor = parseFloat(valor).toLocaleString('pt-BR')+",00"; 
1944            }else{ 
1945                valor = parseFloat(valor).toLocaleString('pt-BR'); 
1946                 
1947                if(valor.split(",").length == 2){ 
1948                 
1949                if(valor.split(",")[1].length == 1) 
1950                    valor += "0"; 
1951                 
1952                }else 
1953                valor += ",00"; 
1954
1955             
1956            return valor; 
1957
1958 
1959        function verificaCursoAprendizagem(i, codigoOferta){ 
1960        //Esconde elementsos quando o curso é aprendizagem 
1961            if($('[name="codigoFT"]').val() == codigoFT){ 
1962                $('#btnComprar_'+i).remove(); 
1963                $('#container_investimento_'+i).remove(); 
1964                $('#container_forma_pgto_'+i).remove(); 
1965                 
1966                var avisoAprendizagem = $('#aviso-curso-aprendizagem').clone(); 
1967                let btnFormAprendizagem = '<button class="btn btn-lg btn-success w-100 mt-3 btnModalAprendizagem" data-codigo-oferta="'+ codigoOferta +'" data-modal="open-modal" style="font-size:16px;background:#1FC923;font-weight: 600;">Preencher formulário</button>' 
1968                avisoAprendizagem.removeAttr('id'); 
1969                avisoAprendizagem.removeClass('d-none'); 
1970                $('.card_oferta_'+i+ ' .ssp-card-oferta-curso').append(avisoAprendizagem); 
1971                $('.card_oferta_'+i+ ' .ssp-card-oferta-curso').append(btnFormAprendizagem); 
1972
1973
1974 
1975        function associaEventoBtnLocalRealizacao(i){ 
1976            var btnLocalRealizacao = document.getElementById("btnLocalRealizacao_"+i); 
1977             
1978            if(btnLocalRealizacao!=null){ 
1979                btnLocalRealizacao.onclick = function(ev) { 
1980                        event.preventDefault(); 
1981                    var elem = $(ev.target); 
1982                    var _modal = document.getElementById( 
1983                        'modalLocalRealizacao_'+elem.data('index')); 
1984                    _modal.style.display = "flex"; 
1985
1986
1987
1988 
1989        var htmlModalLocalRealizacao = '<div id="modalLocalRealizacao_{index}" class="ssp-modal">' 
1990            htmlModalLocalRealizacao += '<div class="ssp-modal-local-realizacao">' 
1991            htmlModalLocalRealizacao += '<div class="ssp-modal-local-realizacao__title-content">' 
1992 
1993            htmlModalLocalRealizacao += '{tituloLocalRealizacao}' 
1994                 
1995            htmlModalLocalRealizacao += '<i class="ssp-card-modal-local-realizacao__btn-close_{index} ssp-card-modal-forma-pagamento__btn-close"></i>' 
1996            htmlModalLocalRealizacao += '</div>' 
1997            htmlModalLocalRealizacao += '<div class="ssp-modal-local-realizacao__texto">' 
1998            htmlModalLocalRealizacao += '<p class="{classeTextoInfoLocalRealizacao}">A unidade {nomeUnidade} realizará as aulas em outro endereço, conforme informações abaixo:</p>' 
1999            htmlModalLocalRealizacao += '<p><span class="ssp-modal-local-realizacao__subtitle localEspacoExternoTexto_{index}">{localEspacoExterno}</span></p>' 
2000            htmlModalLocalRealizacao += '<address>' 
2001            htmlModalLocalRealizacao += '<span id="endereco_realizacao_{index}" class="{classeEnderecoRealizacao}">{ruaEspacoExterno}, {numeroEspacoExterno} {complementoEspacoExterno}<br></span>' 
2002            htmlModalLocalRealizacao += '<span id="bairro_realizacao_{index}" class="{classeBairroRealizacao}">Bairro: {bairroEspacoExterno}<br></span>' 
2003            htmlModalLocalRealizacao += '<span id="cidade_realizacao_{index}" class="{classeCidadeRealizacao}">Cidade: {cidadeEspacoExterno} - SP<br></span>' 
2004            htmlModalLocalRealizacao += '<span id="cep_realizacao_{index}" class="{classeCepRealizacao}">CEP: {cepEspacoExterno}</span>' 
2005            htmlModalLocalRealizacao += '</address>' 
2006            htmlModalLocalRealizacao += '<div class="btn ssp-modal-local-realizacao__btn-content">' 
2007            htmlModalLocalRealizacao += '<a class="btn ssp-modal-local-realizacao__btn {classeEntendi} ssp-modal-local-realizacao__btn_{index}" href="#a">Entendi</a>' 
2008            htmlModalLocalRealizacao +='</div>' 
2009            htmlModalLocalRealizacao +='</div>' 
2010            htmlModalLocalRealizacao +='</div>' 
2011            htmlModalLocalRealizacao +='</div>'; 
2012 
2013        var htmlSlickAreaDiasSemana = '<div class="ssp-card-oferta-curso__dia-hora-item">' 
2014            htmlSlickAreaDiasSemana +='<p class="ssp-card-oferta-curso__dia-hora-item__dia">'  
2015            htmlSlickAreaDiasSemana += '<span data-dia-hora="dias-semana">{diasSemana}</span>' 
2016            htmlSlickAreaDiasSemana += '<span data-dia-hora="horário">{horasSemana}</span>' 
2017            htmlSlickAreaDiasSemana += '</p>' 
2018            htmlSlickAreaDiasSemana += '</div>'; 
2019 
2020        function htmlSlickArea(index, oferta, diasSemanaHTML, codigoUnidade) { 
2021            const btnLocalReal = function(oferta){ 
2022             
2023            var btn = `<div class="container-local-realizacao ` + (oferta.espacoExterno == 'true' ? '' : 'd-none-btn') + `">`; 
2024             
2025            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>`; 
2026             
2027            btn += `</div>`; 
2028                 
2029            return btn; 
2030             
2031
2032 
2033            // Card Oferta 
2034             
2035            let result = ` 
2036                <div class="slick-area__item card_oferta_` + index + ` codigoOferta_` + oferta.codigoOferta + ` ` + `"> 
2037 
2038                <div class="ssp-card-oferta-curso"> 
2039 
2040                    <div class="content-data-dias"> 
2041 
2042                    <div class="ssp-card-oferta__info-turma-iniciada" id="aviso-turma-iniciada-` + index + `" style="display:none"> 
2043                        <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> 
2044                    </div> 
2045 
2046                    <div class="ssp-card-oferta__info-turma-content"> 
2047                        <h6 class="ssp-card-oferta__info-turma">Informações da turma</h6> 
2048                    </div> 
2049 
2050                    <div> 
2051                        <small class="ssp-card-oferta-curso__title-item">Período:</small> 
2052                        <h6 class="ssp-card-oferta-curso__item-data-periodo item-data-periodo_` + index + `">` + formataPeriodo(oferta.dataInicio, oferta.dataFim) + `</h6> 
2053                    </div> 
2054 
2055                    <div class="content-horario-dias-semana"> 
2056 
2057                        <div class="horario"> 
2058                        <small class="ssp-card-oferta-curso__title-item">Horário e dias das aulas:</small> 
2059                        </div> ` + 
2060                     
2061                        `<div class="ssp-card-oferta-curso__dia-hora_content"> 
2062                        ` + diasSemanaHTML + ` 
2063                        </div> 
2064 
2065                    </div> 
2066 
2067            ` + btnLocalReal(oferta) 
2068 
2069 
2070            return result 
2071
2072 
2073        function montaHTMLModalLocalRealizacao(oferta, index){ 
2074      
2075            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>'; 
2076                     
2077            var localRealizacaoHTMLModal = htmlModalLocalRealizacao 
2078                .replace('\{nomeUnidade\}',$('#unidades-ofertas option:selected').text()) 
2079                .replace('\{localEspacoExterno\}', oferta.localEspacoExterno ) 
2080                .replace('\{classeTextoInfoLocalRealizacao\}', oferta.ruaEspacoExterno != "" ? "" : "d-none") 
2081                .replace('\{classeEnderecoRealizacao\}', oferta.ruaEspacoExterno != "" ? "" : "d-none") 
2082                .replace('\{ruaEspacoExterno\}',oferta.ruaEspacoExterno) 
2083                .replace('\{numeroEspacoExterno\}',oferta.numeroEspacoExterno) 
2084                .replace('\{complementoEspacoExterno\}',oferta.complementoEspacoExterno) 
2085                .replace('\{classeBairroRealizacao\}', oferta.bairroEspacoExterno != "" && oferta.ruaEspacoExterno != "" ? "" : "d-none") 
2086                .replace('\{bairroEspacoExterno\}',oferta.bairroEspacoExterno) 
2087                .replace('\{classeCidadeRealizacao\}', oferta.cidadeEspacoExterno != "" && oferta.ruaEspacoExterno != "" ? "" : "d-none") 
2088                .replace('\{cidadeEspacoExterno\}',oferta.cidadeEspacoExterno) 
2089                .replace('\{classeCepRealizacao\}', oferta.cepEspacoExterno != "" && oferta.ruaEspacoExterno != "" ? "" : "d-none") 
2090                .replace('\{cepEspacoExterno\}',oferta.cepEspacoExterno) 
2091                .replace(regIndex, index) 
2092                .replace('\{tituloLocalRealizacao\}', tituloLocalRealizacao) 
2093                .replace('\{classeEntendi\}', ""); 
2094 
2095                $('.oferta-slick-area_modal').append(localRealizacaoHTMLModal); 
2096                $('.oferta-slick-area_modal').find('.d-none-btn').remove(); 
2097 
2098                if(oferta.ruaEspacoExterno == "") 
2099                $('.localEspacoExternoTexto_'+index).removeClass('ssp-modal-local-realizacao__subtitle'); 
2100
2101 
2102        //Formata exibicao de datas conforme especificacao GCR 
2103        function formataPeriodo(dataInicio, dataFim){ 
2104             
2105            var dtInicioPartes = dataInicio.split('/'); 
2106            var dtFimPartes = dataFim.split('/'); 
2107             
2108            //Não exibir o número zero antes dos números e o dia 1 como 1º 
2109            var dInicioFormatada = (parseInt(dtInicioPartes[0].trim()) == 1 ? '1º' : parseInt(dtInicioPartes[0].trim())) +'/'+parseInt(dtInicioPartes[1].trim())+'/'+dtInicioPartes[2].trim(); 
2110            var dFimFormatada = (parseInt(dtFimPartes[0].trim()) == 1 ? '1º' : parseInt(dtFimPartes[0].trim())) +'/'+parseInt(dtFimPartes[1].trim())+'/'+dtFimPartes[2].trim(); 
2111             
2112            //Quando um curso inicia e finaliza dentro do mesmo ano: 17/2 a 25/4/2020 
2113            if(dtInicioPartes[2].trim() == dtFimPartes[2].trim()){ 
2114                 
2115                dInicioFormatada = (parseInt(dtInicioPartes[0].trim()) == 1 ? '1º' : parseInt(dtInicioPartes[0].trim()))+'/'+parseInt(dtInicioPartes[1].trim()); 
2116                 
2117                //Quando um curso inicia e finaliza dentro do mesmo mês: 5 a 30/4/2020 
2118                if(dtInicioPartes[1].trim() == dtFimPartes[1].trim()) 
2119                dInicioFormatada = (parseInt(dtInicioPartes[0].trim()) == 1 ? '1º' : parseInt(dtInicioPartes[0].trim())); 
2120
2121             
2122            return dInicioFormatada + ' a ' + dFimFormatada; 
2123
2124 
2125        function strToFloat(str) { 
2126            const separator = str.includes(',') ? ',' : '.' 
2127 
2128            const numArr = str.split(separator) 
2129            const inteiro = numArr[0].replaceAll('.', '').replaceAll(',', '.') 
2130            const decimal = numArr[1] ? numArr[1].replaceAll('.', '').replaceAll(',', '.') : '' 
2131            return parseFloat(inteiro.concat('.').concat(decimal ? decimal : '0')) 
2132
2133 
2134        function associaEventosFecharModal(i){ 
2135 
2136            var closeModalLocalRealizacao = document.getElementsByClassName("ssp-card-modal-local-realizacao__btn-close_"+i)[0]; 
2137            var btnEntendiLocalRealizacao = document.getElementsByClassName("ssp-modal-local-realizacao__btn_"+i)[0]; 
2138 
2139            //event close modal 
2140            closeModalLocalRealizacao.onclick = function() { 
2141 
2142                $('[id^="modalLocalRealizacao_"]').each(function(index,modal){ 
2143                modal.style.display = "none"; 
2144                 
2145                }); 
2146
2147 
2148            btnEntendiLocalRealizacao.onclick = function() { 
2149             
2150                $('[id^="modalLocalRealizacao_"]').each(function(index,modal){ 
2151                modal.style.display = "none"; 
2152                }); 
2153
2154 
2155            // When the user clicks anywhere outside of the modal, close it 
2156            window.onclick = function(event) { 
2157 
2158                $('[id^="modalLocalRealizacao_"]').each(function(index,_modal){ 
2159                    if (event.target == _modal)  
2160                        _modal.style.display = "none"; 
2161                }); 
2162                 
2163             
2164
2165        }  
2166 
2167         //Abrir e fechar modal 
2168 
2169        function closeModalFormAprendizagem(){ 
2170            let modal = document.querySelector('[data-modal="modal"]') 
2171                     
2172            modal.classList.remove('open-modal-form') 
2173                 
2174
2175                 
2176                 
2177        async function openModalFormAprendizagem(ev){ 
2178 
2179            const $container = document.getElementById('modal-form'); 
2180            if(!$container || !$container.nodeName == 'DIALOG') return; 
2181 
2182            const ofertaSel = ofertasMap.get(ev.target.getAttribute('data-codigo-oferta')); 
2183 
2184            function getUnidadeSelecionada() { 
2185                const categoryUnidade = $('#unidades-ofertas').val().split('@')[0]; 
2186                return objsTela.unidades.find(u => u.categoryId == categoryUnidade) || {}; 
2187
2188 
2189            async function request(url, { method = 'GET', headers = {}, body, beforeSend } = {}) { 
2190                const init = { method, headers, body, credentials: 'same-origin' }; 
2191                const resp = await fetch(url, init); 
2192                if (!resp.ok) throw new Error('Erro status ' + resp.status); 
2193                return resp.text(); 
2194
2195             
2196            async function loadHTMLForm () { 
2197                 
2198                if(!ofertaSel) { 
2199                    console.error('Oferta não selecionada'); 
2200                    return; 
2201
2202 
2203                if($container.querySelectorAll('form').length) { 
2204                    FormControl.changeCursoInfo(ofertaSel, getUnidadeSelecionada()); 
2205                    return; 
2206
2207                 
2208                const dateAvoidCache = Date.now();  
2209                const url = Liferay.ThemeDisplay.getPortalURL().concat('/documents/d/global/html-formulario-aprendizagem?cb=' + dateAvoidCache); 
2210 
2211                const formHTML = await request(url); 
2212 
2213                $container.innerHTML += formHTML; 
2214 
2215                let script = document.createElement('script'); 
2216                script.src = '/documents/d/global/js-aprendizagem-formulario?cb=' + dateAvoidCache; 
2217                script.async = true; 
2218 
2219                script.onload = () => { 
2220                    init(ofertaSel, getUnidadeSelecionada()); 
2221                }; 
2222 
2223                script.onerror = () => { 
2224                    console.error(`Error loading script js-aprendizagem-formulario`); 
2225                }; 
2226 
2227                document.head.appendChild(script); 
2228 
2229
2230 
2231            await loadHTMLForm(); 
2232 
2233            $container.showModal(); 
2234             
2235
2236 
2237        function cloneObj(original) { 
2238    	  return JSON.parse(JSON.stringify(original)); 
2239
2240 
2241         
2242    </script>