PageSourceSearch

https://covarrnet.ca/wp-content/plugins/bravepopup-pro/assets/frontend/brave.js?ver=7.1.2

js covarrnet.ca collected 2026-09-25 20:28:37 UTC 68,983 bytes, 1,329 lines download raw bytes

1var brave_isMobile = window.matchMedia("only screen and (max-width: 760px)").matches;
2var brave_isTab = window.matchMedia("screen and (max-width: 1200px) and (min-width: 760px)").matches;
3var brave_currentDevice = brave_isMobile ? 'mobile' : 'desktop';
4
5function brave_change_slide(elementID, goto, slideWidth){
6   var sliderMargin = -(goto * slideWidth)+'px'
7   var theCarousel = document.getElementById('brave_carousel__slides-'+elementID);
8   var theCarouselNav = document.getElementById('brave_carousel__navs-'+elementID);
9   
10   if(theCarousel){
11      theCarousel.style.marginLeft = sliderMargin;
12      if(theCarouselNav){
13         var allCarouselNavs = theCarouselNav.querySelectorAll(":scope li");
14         for (var i = 0; i < allCarouselNavs.length; i++) { allCarouselNavs[i].classList.remove('slide__nav__active');  }
15         document.getElementById('brave_carousel__nav-'+elementID+'_'+goto).classList.add('slide__nav__active');         
16      }
17   }
18}
19
20function brave_autochange_slide(elementID){
21   var theSlider = document.getElementById('brave_carousel__slides-'+elementID);
22   var currentslide = document.querySelector('#brave_carousel__navs-'+elementID).dataset.currentslide;
23   currentslide = parseInt(currentslide, 10)
24   var slideWidth = parseInt(theSlider.dataset.width, 10);
25   var totalSlides = parseInt(theSlider.dataset.totalslides, 10);
26
27   var carouselHovered = theSlider.dataset.hovered;
28   if(carouselHovered === 'true'){ return }
29   //console.log(elementID, currentslide, slideWidth, totalSlides);
30   
31
32   brave_change_slide(elementID, currentslide, slideWidth);
33
34   if(totalSlides === (currentslide+1)){
35      document.querySelector('#brave_carousel__navs-'+elementID).dataset.currentslide = 0;
36   }else{
37      document.querySelector('#brave_carousel__navs-'+elementID).dataset.currentslide = currentslide + 1;
38   }
39}
40
41function brave_carousel_pause(elementID, resume=false){
42   var theSlider = document.getElementById('brave_carousel__slides-'+elementID);
43   if(theSlider){
44      theSlider.dataset.hovered = true;
45      if(resume){
46         theSlider.dataset.hovered = false;
47      }
48   }
49}
50
51function brave_countdown(elementID, theDate, theHour, theMins, hideDays, auto=null) {
52   if(!theDate) { return null}
53
54   //console.log(theDate, theHour, theMins, hideDays, auto);
55   
56   var dateString = theDate;
57   var time = {hour: theHour, minutes: theMins};
58   var brave_endDate;
59   if(!auto){
60       var parts = dateString.split('/');
61       var brave_day = parseInt(parts[0], 10);
62       var brave_month = parseInt(parts[1], 10) - 1;
63       var brave_year = parseInt(parts[2], 10);
64       brave_endDate =  new Date(brave_year, brave_month, brave_day);
65       brave_endDate.setHours(time.hour);
66       brave_endDate.setMinutes(time.minutes);
67       brave_endDate.setSeconds(0);
68   }else{
69       if(auto){
70         brave_endDate =  auto;
71       }
72
73   }
74
75   var brave_startDate = new Date().getTime();
76
77   var brave_days, brave_hours, brave_minutes, brave_seconds;
78   var timeRemaining = parseInt(((brave_endDate.getTime() - brave_startDate) / 1000), 10);
79   
80   //console.log( brave_endDate.getTime(), brave_startDate, timeRemaining);
81   
82   if (timeRemaining >= 0) {
83       if(!hideDays){
84         brave_days = parseInt(timeRemaining / 86400);
85         timeRemaining = (timeRemaining % 86400);
86       }
87       
88       brave_hours = parseInt(timeRemaining / 3600);
89       timeRemaining = (timeRemaining % 3600);
90       
91       brave_minutes = parseInt(timeRemaining / 60);
92       timeRemaining = (timeRemaining % 60);
93       
94       brave_seconds = parseInt(timeRemaining);
95   }
96
97   var daySpan = document.getElementById('brave_rem_days-'+elementID);
98   var hourSpan = document.getElementById('brave_rem_hours-'+elementID);
99   var minSpan = document.getElementById('brave_rem_minutes-'+elementID);
100   var secSpan = document.getElementById('brave_rem_seconds-'+elementID);
101
102   if(daySpan){ daySpan.innerHTML = timeRemaining >= 0 ? brave_days : 0}
103   if(hourSpan){ hourSpan.innerHTML = timeRemaining >= 0 ? brave_hours : 0}
104   if(minSpan){ minSpan.innerHTML = timeRemaining >= 0 ? brave_minutes : 0}
105   if(secSpan){ secSpan.innerHTML = timeRemaining >= 0 ? brave_seconds : 0}
106
107
108
109}
110
111
112function brave_select_imageField(fieldID, optionIndex, multi=false){
113   var optionField = document.getElementById('brave_form_field'+fieldID+'_opt-'+optionIndex);
114   if(optionField){
115      if(!multi){
116         var allOptsFields = document.getElementById('brave_form_field'+fieldID).querySelectorAll('input');
117         for (var i = 0; i < allOptsFields.length; i++) { allOptsFields[i].checked = false;  document.getElementById('brave_form_field'+fieldID+'_opt-'+i).classList.remove('formfield__inner__image--selected');  }
118      }
119      var optionFieldInput = optionField.querySelector('input');
120      if(optionFieldInput && (optionFieldInput.checked === false)){   optionFieldInput.checked = true;  optionField.classList.add('formfield__inner__image--selected'); 
121      }else if(optionFieldInput && (optionFieldInput.checked === true)){ optionFieldInput.checked = false; optionField.classList.remove('formfield__inner__image--selected'); }
122   }
123}
124function brave_form_rating_unhover(fieldID){
125   var allRatingFields = document.getElementById('brave_form_field'+fieldID).querySelectorAll('.formfield__inner__ratings_star, .formfield__inner__ratings_number');
126   for (var i = 0; i < allRatingFields.length; i++) { 
127      allRatingFields[i].classList.remove('formfield__inner__ratings--hovered'); 
128   }
129}
130function brave_form_rating_hover(fieldID, optionIndex){
131   var allRatingFields = document.getElementById('brave_form_field'+fieldID).querySelectorAll('.formfield__inner__ratings_star, .formfield__inner__ratings_number');
132   for (var i = 0; i < allRatingFields.length; i++) { 
133      allRatingFields[i].classList.remove('formfield__inner__ratings--hovered');  
134      if(i <= (optionIndex-1)){
135         allRatingFields[i].classList.add('formfield__inner__ratings--hovered'); 
136      }
137   }
138}
139
140function brave_form_rate(fieldID, optionIndex, smiley=false){
141   document.getElementById('brave_form_field'+fieldID).dataset.rated = optionIndex;
142   var allRatingFields = document.getElementById('brave_form_field'+fieldID).querySelectorAll('.formfield__inner__ratings_star, .formfield__inner__ratings_number, .formfield__inner__ratings_smiley');
143   for (var i = 0; i < allRatingFields.length; i++) { 
144      allRatingFields[i].classList.remove('formfield__inner__ratings--selected');
145      if(!smiley && (i <= (optionIndex-1))){    allRatingFields[i].querySelector('input').checked = true; allRatingFields[i].classList.add('formfield__inner__ratings--selected');   }
146      
147      if(smiley && (i === (optionIndex-1))){    
148         allRatingFields[i].querySelector('input').checked = true; 
149         allRatingFields[i].classList.add('formfield__inner__ratings--selected');   
150      }
151   }
152}
153function brave_form_goBack(formID, totalSteps){
154   var currentStep = document.querySelector('#brave_form_'+formID+' .brave_form_fields').dataset.step;
155   var formBackButton = document.querySelector('#brave_form_'+formID+' .brave_form_stepBack');
156   var goto = currentStep - 1;
157   document.querySelector('#brave_form_'+formID+' .brave_form_fields').dataset.step = goto;
158
159
160   //Change The Popup and Form Height if specified
161   brave_form_changeHeight(formID, goto);
162
163   if(goto === 0 ){   
164      formBackButton.classList.add('brave_form_stepBack--hide');
165   }else{
166      formBackButton.classList.remove('brave_form_stepBack--hide');
167   }
168
169   // //Go to Prev Step
170   var allformSteps = document.querySelectorAll('#brave_form_'+formID+' .brave_form_fields_step');
171   for (var i = 0; i < allformSteps.length; i++) {   
172      if(i ===goto){
173         allformSteps[i].classList.add('brave_form_fields_step--show'); 
174
175      }else{
176         allformSteps[i].classList.remove('brave_form_fields_step--show');   
177      }
178   }
179   if(goto === (totalSteps - 1) ){
180      document.querySelector('#brave_form_'+formID+' .brave_form_button').classList.remove('brave_form_button--hide');   
181   }else{
182      document.querySelector('#brave_form_'+formID+' .brave_form_button').classList.add('brave_form_button--hide'); 
183   }
184}
185
186function brave_form_gotoStep(formID, totalSteps, goto){
187   //console.log('gotoStep', goto,totalSteps, goto === (totalSteps - 1));
188   
189   //Get The form Fields Values
190   var braveForm = document.getElementById('brave_form_'+formID);
191   //var formData = new FormData(braveForm);
192   //var fieldsData = JSON.parse(brave_popup_formData[formID].fields);
193   var fieldsData = brave_get_field_vals(braveForm, JSON.parse(brave_popup_formData[formID].fields))
194
195
196   var stepFieldIDs = [];
197   var currentStep = document.querySelector('#brave_form_'+formID+' .brave_form_fields_step'+(goto-1));
198   if(currentStep){
199      var allStepFields = currentStep.querySelectorAll('.brave_form_field');
200      for (var i = 0; i < allStepFields.length; i++) { 
201         if( !allStepFields[i].classList.contains('brave_form_field--step') ){
202            stepFieldIDs.push(allStepFields[i].getAttribute('id').replace('brave_form_field', ''));
203         }
204      }
205   }
206   var filteredFieldData = {};
207   stepFieldIDs.forEach(function(fieldID){
208      if(fieldsData[fieldID]){ 
209         filteredFieldData[fieldID] = fieldsData[fieldID];
210      }
211   })
212   //console.log( fieldsData, filteredFieldData);
213
214   // //Check if Form Has Errors
215   var formErrors = [];
216   Object.keys(filteredFieldData).forEach(function(fieldID){
217      var fieldError = brave_validate_fields(fieldID, filteredFieldData[fieldID]);
218      if(fieldError){ formErrors.push(fieldError); }
219      document.querySelector('#brave_form_field'+fieldID).classList.remove('brave_form_field--hasError', 'brave_form_field--hasError-firstname', 'brave_form_field--hasError-lastname');
220   });
221   brave_display_form_error(formErrors);
222
223   if(formErrors.length > 0){ return }
224
225   //Change The Popup and Form Height if specified
226   brave_form_changeHeight(formID, goto);
227
228   // //Go to NextStep
229   var allformSteps = document.querySelectorAll('#brave_form_'+formID+' .brave_form_fields_step');
230   for (var i = 0; i < allformSteps.length; i++) {   
231      if(i ===goto){
232         document.querySelector('#brave_form_'+formID+' .brave_form_fields').dataset.step = goto;
233         allformSteps[i].classList.add('brave_form_fields_step--show');   
234         document.querySelector('#brave_form_'+formID+' .brave_form_fields').style.height = allformSteps[i].offsetHeight+'px';
235         var formBackButton = document.querySelector('#brave_form_'+formID+' .brave_form_stepBack');
236         if(formBackButton){ formBackButton.classList.remove('brave_form_stepBack--hide'); }
237      }else{
238         allformSteps[i].classList.remove('brave_form_fields_step--show');   
239      }
240   }
241   //console.log(goto, totalSteps);
242   
243   if(goto === (totalSteps - 1) ){
244      setTimeout(() => {
245         document.querySelector('#brave_form_'+formID+' .brave_form_button').classList.remove('brave_form_button--hide');  
246      }, 250);
247   }
248
249}
250
251function brave_form_changeHeight(formID, goto){
252   var changesFormHeight = brave_popup_formData[formID].changesFormHeight || false;
253   if(changesFormHeight){
254      var braveForm = document.getElementById('brave_element-'+formID);
255      var parentPopupStep = braveForm.closest('.brave_popup__step');
256      var initialHeight = brave_popup_formData[formID].heightData[0];
257      var diffHeight = brave_popup_formData[formID].heightData[goto] - initialHeight;
258      var newFormHeight = brave_popup_formData[formID].heightData[goto] || initialHeight;
259      braveForm.style.height = (parseInt(newFormHeight, 10))+'px';
260
261      if(parentPopupStep){
262         var parentPopupHeight = parentPopupStep.dataset.height;
263         //console.log(goto, parentPopupHeight, diffHeight, initialHeight, brave_popup_formData[formID].heightData[goto], brave_popup_formData[formID].heightData);
264         parentPopupStep.querySelector('.brave_popup__step__inner').style.height =  (parseInt(parentPopupHeight, 10) + diffHeight)+'px';
265      }
266   }
267   //console.log( changesFormHeight, newFormHeight, initialHeight, diffHeight);
268}
269
270function brave_get_field_vals(braveForm, fieldOpts){
271   var fieldsData = fieldOpts;
272   for( var i=0; i<braveForm.elements.length; i++ ){
273      var fieldName = braveForm.elements[i].name.replace('[]', '');
274      var fieldOpts = fieldsData[fieldName] || {};
275      var fieldValue = braveForm.elements[i].value;
276      //console.log(fieldName, fieldOpts, fieldValue);
277      if(fieldOpts && fieldOpts.type && (fieldOpts.type ==='checkbox' || (fieldOpts.type ==='select' && fieldOpts.multi) || (fieldOpts.type ==='image' && fieldOpts.multi)) ){
278         var checkedVal = document.querySelectorAll('#brave_form_field'+fieldName+' input:checked, #brave_form_field'+fieldName+' option:checked');
279         fieldValue = Array.from(checkedVal).map(el => el.value);
280         if(fieldOpts.required && (fieldValue.length === 0 || fieldValue.includes('none')) ){ fieldValue =''; }
281      }
282      if(fieldsData[fieldName]){
283         fieldsData[fieldName].value = fieldValue;
284      }
285   }
286   return fieldsData;
287}
288
289function brave_submit_form(event, settings){
290   event.preventDefault();
291   var braveForm = document.getElementById('brave_form_'+settings.formID);
292   var fieldsData = brave_get_field_vals(braveForm, JSON.parse(settings.fields))
293
294   //Check if has Errrors
295   var formErrors = [];
296   Object.keys(fieldsData).forEach(function(fieldID){
297      var fieldError = brave_validate_fields(fieldID, fieldsData[fieldID]);
298      if(fieldError){ formErrors.push(fieldError); }
299      document.querySelector('#brave_form_field'+fieldID).classList.remove('brave_form_field--hasError', 'brave_form_field--hasError-firstname', 'brave_form_field--hasError-lastname');
300   });
301   brave_display_form_error(formErrors);
302
303   var finalFieldsData = {};
304
305   Object.keys(fieldsData).forEach(function(fieldID){  if(fieldsData[fieldID]) {  finalFieldsData[fieldID] = fieldsData[fieldID].value; }});
306
307   console.log(formErrors);
308   //console.log('FORM ERRORS: ', formErrors);
309
310   if(formErrors.length === 0){
311      //console.log('NO ERRORS Sending to Backend!');
312      //SEND Data
313      var ajaxurl = bravepop_global.ajaxURL;
314      var security = document.getElementById('brave_form_security'+settings.formID).value;
315      if(!security || !ajaxurl) { return console.log('Security Failed or Ajax URL Missing!!!!', security, ajaxurl); }
316      var finalData = { formData: JSON.stringify(finalFieldsData), popupID: settings.popupID, formID: settings.formID, stepID: settings.stepID, device: settings.device, security: security, action: 'bravepop_form_submission' };
317      var brave_form = document.getElementById('brave_form_'+settings.formID);
318      var brave_login_loader = document.getElementById('brave_form_loading_'+settings.formID);
319      if(brave_login_loader){  brave_login_loader.classList.add('brave_form_loading--show'); }
320      if(brave_form){ brave_form.classList.add('brave_form_form--loading');  }
321
322      //console.log(finalData);
323      brave_ajax_send(ajaxurl, finalData, function(status, sentData){
324         //Remove The sending Status
325         if(brave_login_loader){  brave_login_loader.classList.remove('brave_form_loading--show'); }
326         if(brave_form){ brave_form.classList.remove('brave_form_form--loading');  }
327
328         var response = JSON.parse(sentData);
329         console.log(status, response);
330
331         localStorage.setItem('brave_popup_'+settings.popupID+'_formsubmitted', true);
332
333         var braveFormSubmitEvent = new CustomEvent('brave_form_submitted', { detail: {popupId: parseInt(settings.popupID, 10), formId: settings.formID, formData: JSON.stringify(finalFieldsData)} });
334         document.dispatchEvent(braveFormSubmitEvent);
335
336         //Send Ga Event
337         if(settings.track){
338            var formTrackingSettings = JSON.parse(settings.track);
339            if( formTrackingSettings && formTrackingSettings.enable && formTrackingSettings.eventCategory && formTrackingSettings.eventAction){
340               brave_send_ga_event(formTrackingSettings.eventCategory, formTrackingSettings.eventAction, formTrackingSettings.eventLabel || '');
341            }
342         }
343
344         //Perform Goal
345         if(brave_popup_formData[settings.formID] && brave_popup_formData[settings.formID].goal){
346            brave_complete_goal(settings.popupID, 'form');
347         }
348
349         //Show Content
350         if(response.sent && response.primaryAction === 'content' && response.contentMessage ){
351            if(brave_form){ brave_form.classList.add('brave_form_form--hide');  }
352            document.getElementById('brave_form_custom_content'+settings.formID).innerHTML = response.contentMessage;
353            //Auto Close Popup
354            if(response.autoclose && response.autoclosetime){
355               setTimeout(() => {
356                  brave_close_popup(settings.popupID);
357               }, parseInt(response.autoclosetime) * 1000);
358            }
359            //Also Download File
360            if(response.download && response.downloadURL){
361               var downloadURI = response.downloadURL; var filename =  response.downloadURL.substring( response.downloadURL.lastIndexOf('/')+1);
362               var link = document.createElement('a');
363               if (typeof link.download === 'string') {
364                     document.body.appendChild(link); // Firefox requires the link to be in the body
365                     link.download = filename;
366                     link.href = downloadURI;
367                     link.target = '_blank';
368                     link.click();
369                     document.body.removeChild(link); // remove the link when done
370               } else {
371                     location.replace(downloadURI);
372               }
373            }
374         }
375
376         //Redirect User
377         if(response.sent && response.primaryAction === 'redirect' && response.redirectURL ){
378            if(brave_form){ brave_form.classList.add('brave_form_form--hide');  }
379            document.getElementById('brave_form_custom_content'+settings.formID).innerHTML = response.redirectMessage;
380            var redirectTime = response.redirectAfter ? (response.redirectAfter *1000) : 6000;
381            setTimeout(() => {
382               window.location.href = response.redirectURL;
383            }, redirectTime);
384         }
385
386         //Go to Step
387         if(response.sent && response.primaryAction === 'step' && response.step && settings.popupID ){
388            var formStep = parseInt(response.step, 10);
389            formStep = formStep === 0 ? 0 : formStep - 1;
390            brave_open_popup(settings.popupID, formStep);
391         }
392
393
394      });
395   }
396
397}
398
399function brave_display_form_error(formErrors){
400      console.log(formErrors);
401      
402      //Display The Errors
403      if(formErrors.length > 0){
404         formErrors.forEach(function(error){
405            if(error.fieldType && error.fieldType ==='name'){
406               if(error.firstname){
407                  document.querySelector('#brave_form_field'+error.id).classList.add('brave_form_field--hasError-firstname');
408                  document.querySelector('#brave_form_field'+error.id+' .brave_form_field_error--firstname').innerHTML = error.message;
409               }
410               if(error.lastname){
411                  document.querySelector('#brave_form_field'+error.id).classList.add('brave_form_field--hasError-lastname');
412                  document.querySelector('#brave_form_field'+error.id+' .brave_form_field_error--lastname').innerHTML = error.message;
413               }
414   
415            }else{
416               document.querySelector('#brave_form_field'+error.id).classList.add('brave_form_field--hasError');
417               document.querySelector('#brave_form_field'+error.id+' .brave_form_field_error').innerHTML = error.message;
418            }
419         });
420      }
421}
422
423
424function brave_validate_fields(fieldID, field){
425   if(!field){ return }
426
427   if(!field.value && field.required) { 
428      return {id: fieldID, type: 'required', message: bravepop_global.field_required}
429   }
430   if(field.required && (field.type==='input' || field.type==='textarea' || field.type==='date' ) ) { 
431      if(!field.value.trim()){
432         return {id: fieldID, type: 'required', message: bravepop_global.field_required}
433      }
434   }
435
436   if(field.type==='input' && field.validation === 'name' && field.required) { 
437      if(!field.value[0] || !field.value[1]){
438         return {id: fieldID, type: 'required', fieldType: 'name', message: bravepop_global.field_required, firstname: !field.value[0] ? true : false, lastname:  !field.value[1] ? true : false}
439      }
440   }
441
442   if(field.value && field.required && field.type==='select' && field.value === 'none') { 
443      return {id: fieldID, type: 'required', message: bravepop_global.field_required}
444   }
445
446   //Check HTML or Empty Value
447   if(field.value && ((field.type==='input' && field.validation === 'text') || field.type==='textarea' || field.type==='date'  ) ) { 
448
449      if(brave_hasHTML(field.value)){
450         return {id: fieldID, type: 'ho_html', message: bravepop_global.no_html_allowed};
451      }
452   }
453
454   //Validate number
455   if(field.value && field.type==='input' && field.validation === 'number' ) { 
456      if(brave_isNumber(field.value) === false){
457         return {id: fieldID, type: 'invalid', message: bravepop_global.invalid_number};
458      }
459   }
460   //Validate url
461   if(field.value && field.type==='input' && field.validation === 'url' ) { 
462      if(brave_isURL(field.value) === false){
463         return {id: fieldID, type: 'invalid', message: bravepop_global.invalid_url};
464      }
465   }
466
467   //Validate email
468   if(field.value && field.type==='input' && field.validation === 'email' ) { 
469      if(brave_isEmail(field.value) === false){
470         return {id: fieldID, type: 'invalid', message: bravepop_global.invalid_email};
471      }
472   }
473
474   //Validate Date
475   if(field.value && field.type==='date' ) { 
476      if(brave_isDate(field.value) === false){
477         return {id: fieldID, type: 'invalid', message: bravepop_global.invalid_date};
478      }
479   }
480
481}
482
483function brave_hasHTML(value) {
484   var doc = new DOMParser().parseFromString(value, "text/html");
485   return Array.from(doc.body.childNodes).some(node => node.nodeType === 1);
486}
487
488function brave_isNumber(value) {
489   var numberFormat = RegExp(/^[a-zA-Z]+$/);
490   return numberFormat.test(value) ? false : true;
491}
492
493function brave_isEmail(value) {
494   var mailformat = RegExp(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,8})+$/);
495   return mailformat.test(value) ? true : false;
496}
497
498function brave_isURL(value) {
499   var urlFormat = RegExp(/(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g);
500   return urlFormat.test(value) ? true : false;
501}
502
503function brave_isDate(value) {
504   var dateFormat = RegExp(/^\d{2}([./-])\d{2}\1\d{4}$/);
505   var matchedDate = dateFormat.test(value);
506   return matchedDate && matchedDate[0] ? true : false;
507}
508
509
510function brave_ajax_send(ajaxurl, aja
510xData, callbackFunction){
511   //console.log(ajaxData);
512   var array = [];
513   Object.keys(ajaxData).forEach(function(element) {
514      array.push(  encodeURIComponent(element) + "=" + encodeURIComponent(ajaxData[element]) ) 
515   });
516   var dataToSend = array.join("&");
517   
518   var request = new XMLHttpRequest();
519   request.open('POST', ajaxurl, true);
520   request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded' );
521   request.onload = function () {  
522      if (this.status >= 200 && this.status < 400) { 
523         callbackFunction('success', this.response);
524      } else {   
525         callbackFunction('error', this.response);
526      }  
527   };
528   //request.onerror = function(error) {  console.log(error);   };
529   request.send(dataToSend);
530}
531
532
533function brave_action_step(popupID, currentStep, stepIndex){
534   //console.log(popupID, stepIndex);
535   var selectedPopupStep = document.querySelector('#brave_popup_'+popupID+'__step__'+stepIndex+' .brave_popup__step__'+brave_currentDevice)
536   var noMobileContent = selectedPopupStep && selectedPopupStep.dataset.nomobilecontent === 'true' ? true : false;
537   var currentDevice = noMobileContent ? 'desktop' : brave_currentDevice;
538   var selectedPopupStep = document.querySelector('#brave_popup_'+popupID+'__step__'+currentStep+' .brave_popup__step__'+currentDevice)
539   selectedPopupStep.dataset.open = 'false';
540   brave_open_popup(popupID, stepIndex);
541   
542}
543
544
545function brave_init_popup(popupID, popupData ){
546   //console.log(popupID, popupData);
547
548   brave_responsiveness(popupID, popupData);
549
550   //If is in Preview Mode force load the popup skinpping all the conditions
551   if(popupData.forceLoad){
552      return brave_load_popup(popupID, popupData);  
553   }
554
555   var triggerType = popupData.settings && popupData.settings.trigger && popupData.settings.trigger.triggerType ? popupData.settings.trigger.triggerType.split(',') : ['load'];
556
557   //Do not load if utm keywords dont match
558   var utmKeywords = [];
559   var containsKeyword = false;
560   if(popupData.settings && popupData.settings.placement && popupData.settings.placement.utm  && popupData.settings.placement.utmKeywords){
561      utmKeywords = popupData.settings.placement.utmKeywords.split(',');
562   } 
563   if(utmKeywords.length > 0){
564      var currentURL = window.location.href;
565      utmKeywords.forEach(function(key){
566         if(currentURL.includes(key)){   containsKeyword = true;  }
567      })
568      if(containsKeyword === false){
569         return console.log('Does Not Match UTM Keywords');
570      }
571   }
572
573   //Do not load if Popup is not in Scheduled Dates
574   if(popupData.schedule && popupData.schedule.active && popupData.schedule.type){
575      if(popupData.schedule.type === 'days' && popupData.schedule.days.length > 0){
576         var currentDay = new Date().getDay();
577         if(!popupData.schedule.days.includes(currentDay)){
578            return console.log('Popup Not Scheduled for Today!');
579         }
580      }
581      if(popupData.schedule.type === 'dates' && popupData.schedule.dates.length > 0){
582         var thecurrentDate = new Date().getTime();
583         var dateInRange = false;
584         popupData.schedule.dates.forEach(function(date){
585            var theTimes = []; var timeTypes = ['start', 'end'];
586            timeTypes.forEach(function(val){
587               var theDate = date[val].date.split('/');
588               var theHour = date[val].time && date[val].time.hour ? date[val].time.hour : '00';
589               var theMinutes = date[val].time && date[val].time.minutes ? date[val].time.minutes : '00';
590               theTimes.push(new Date(theDate[2]+'/'+theDate[1]+'/'+theDate[0]+' '+theHour+':'+theMinutes+':00').getTime());
591            })
592            if(theTimes[0] < thecurrentDate && theTimes[1] > thecurrentDate){
593               dateInRange = true;
594            }
595         });
596         if(!dateInRange){
597            return console.log('Popup Not Scheduled these dates!');
598         }
599      }
600   }
601
602   //Do not Load if Device Settings doesnt Match
603   if(popupData.settings && popupData.settings.audience && popupData.settings.audience.devices && popupData.settings.audience.devices === "desktop" && brave_currentDevice === 'mobile'){   return console.log('Device Settings doesnt Match');  }
604   if(popupData.settings && popupData.settings.audience && popupData.settings.audience.devices && popupData.settings.audience.devices === "mobile" && brave_currentDevice === 'desktop'){   return console.log('Device Settings doesnt Match');  }
605
606   //Do not load if Opened n Times already
607   var popupOpenCount = localStorage.getItem('brave_popup_'+popupID+'_viewed');
608   var popupRepeatCountType = popupData.settings && popupData.settings.frequency && popupData.settings.frequency.repeatCountType || 'lifetime';
609   var repeatCount = popupData.settings && popupData.settings.frequency && popupData.settings.frequency.repeatCount ? parseInt(popupData.settings.frequency.repeatCount, 10) : 3;
610   if(popupData.settings && popupData.settings.frequency && popupData.settings.frequency.repeat){  
611      if(popupRepeatCountType === 'lifetime' && parseInt(popupOpenCount, 10) >= repeatCount){
612         return console.log('Already Viewed '+repeatCount+' Times. Hiding..');  
613      }
614      var popupViewStat = localStorage.getItem('brave_popup_'+popupID+'_view_stat'); popupViewStat = popupViewStat ? JSON.parse(popupViewStat) : [];
615      var thecurrentDate = new Date(); var thecurrentDay = thecurrentDate.getDate(); var thecurrentMonth = thecurrentDate.getMonth(); var thecurrentYear = thecurrentDate.getFullYear();
616      var popupViewDayCount = 0; var popupViewMonthCount = 0;
617      if(popupViewStat){
618         popupViewStat.forEach(function(stat){
619            var statDate = new Date(stat); var statDay = statDate.getDate(); var statMonth = statDate.getMonth(); var statYear = statDate.getFullYear();
620            if((statDay === thecurrentDay) && (statMonth === thecurrentMonth) && (statYear === thecurrentYear)){   popupViewDayCount = popupViewDayCount + 1;   }
621            if((statMonth === thecurrentMonth) && (statYear === thecurrentYear)){   popupViewMonthCount = popupViewMonthCount + 1;   }
622         })
623      }    
624      if(popupRepeatCountType === 'day' && (parseInt(popupViewDayCount, 10) >= repeatCount)){
625         return console.log('Already Viewed '+repeatCount+' Times for today. Hiding..');  
626      }
627      if(popupRepeatCountType === 'month' && (parseInt(popupViewMonthCount, 10) >= repeatCount) ){
628         return console.log('Already Viewed '+repeatCount+' Times for this month. Hiding..');  
629      }
630   }
631
632   //Do not load if Closed n Times already
633   var popupCloseStat = localStorage.getItem('brave_popup_'+popupID+'_closed') ? JSON.parse(localStorage.getItem('brave_popup_'+popupID+'_closed')) : null;
634   if(popupData.settings && popupData.settings.frequency && popupData.settings.frequency.close && popupCloseStat && popupCloseStat.closed){   
635      var popupCloseCount = popupData.settings.frequency.closeCount ? popupData.settings.frequency.closeCount : 2; 
636      var popupCloseFor = popupData.settings.frequency.closeFor ? parseInt(popupData.settings.frequency.closeFor, 10) * 86400 * 1000 : 86400 * 1000 * 30;
637      var userCloseCount = parseInt(popupCloseStat.closed, 10);
638      var userCloseDate = parseInt(popupCloseStat.closeTime, 10);
639      var currentDate = new Date().getTime();
640      var closeTimeDiff = currentDate - userCloseDate;
641      console.log('##### CLOSING STATS',userCloseCount, popupCloseFor,closeTimeDiff, closeTimeDiff >= popupCloseFor, userCloseCount >= popupCloseCount);
642      if(closeTimeDiff <= popupCloseFor && (userCloseCount >= popupCloseCount )){
643         return console.log('Close Time Settings Do not Match');
644      }
645   }
646   //Do not Load if a Form Submitted in this Popup
647   if(popupData.settings && popupData.settings.frequency && popupData.settings.frequency.formSubmit && localStorage.getItem('brave_popup_'+popupID+'_formsubmitted')){
648      return console.log('Form in this Popup already Submitted! Hiding..');
649   }
650
651   //Do not show if goal is complete
652   if(popupData.settings && popupData.settings.frequency && popupData.settings.frequency.goalComplete && localStorage.getItem('brave_popup_'+popupID+'_goal_complete')){
653      return console.log('Popup Goal Already Completed..');
654   }
655
656   //Do not Load if Popups Countdown Timer has ended
657   if(popupData.settings && popupData.settings.frequency && popupData.settings.frequency.timerEnded && popupData.timers.length > 0 && popupData.timers[0].ended){
658      return console.log('Popup Countdown Timer Ended! Hiding..');
659   }
660
661   //Do not Load if a certain popup was not viewed/goaled/closed before
662   if(popupData.settings && popupData.settings.filters && popupData.settings.filters.popups_before && popupData.settings.filters.popups.length > 0){
663      var popupFilterFulfilled = false;
664      popupData.settings.filters.popups.forEach(function (popup) {
665         if(!popupFilterFulfilled && popup.id && popup.action){
666            var popupActionMatched = localStorage.getItem('brave_popup_'+popup.id+'_'+popup.action);
667            if(popupActionMatched){  popupFilterFulfilled = true;  }
668         }
669      })
670      if(!popupFilterFulfilled){
671         return console.log('A selected Popup was not viewed before! Hiding..');
672      }
673   }
674
675   if(triggerType.includes('load')){   brave_load_popup(popupID, popupData, 'load');   }
676
677   if(triggerType.includes('exit')){
678      if(brave_currentDevice === 'mobile'){
679         if(!popupData.settings.trigger.exitMobileFallback || (popupData.settings.trigger.exitMobileFallback && popupData.settings.trigger.exitMobileFallback.type && popupData.settings.trigger.exitMobileFallback.type === 'load')){
680            brave_load_popup(popupID, popupData,'load');
681         }
682         if(popupData.settings.trigger.exitMobileFallback && popupData.settings.trigger.exitMobileFallback.type && popupData.settings.trigger.exitMobileFallback.type === 'time'){
683            var exitMobileDelay = popupData.settings.trigger.exitMobileFallback.time || 2000;
684            setTimeout(() => {    brave_load_popup(popupID, popupData , 'time');  }, (exitMobileDelay * 1000));
685         }
686      }else{
687         document.addEventListener("mouseout", function(evt){
688            if(evt.toElement === null && evt.relatedTarget === null) {
689                brave_load_popup(popupID, popupData, 'exit');
690            }
691         });
692      }
693   }
694
695   if(triggerType.includes('scroll') || (brave_isMobile && popupData.settings.trigger.exitMobileFallback && popupData.settings.trigger.exitMobileFallback.type  && popupData.settings.trigger.exitMobileFallback.type ==='scroll')){
696      document.addEventListener("scroll", function(evt){
697         var h = document.documentElement,  b = document.body, st = 'scrollTop', sh = 'scrollHeight';
698         var scrollPercent = (h[st]||b[st]) / ((h[sh]||b[sh]) - h.clientHeight) * 100;
699         if( brave_isMobile && (popupData.settings.trigger.exitMobileFallback && popupData.settings.trigger.exitMobileFallback.type && popupData.settings.trigger.exitMobileFallback.type ==='scroll')){
700            var exitMobielScroll = popupData.settings.trigger.exitMobileFallback.scroll || 15;
701            if(scrollPercent >= exitMobielScroll){   brave_load_popup(popupID, popupData, 'scroll');   }
702         }
703         if(popupData.settings && popupData.settings.trigger.scrolltype && popupData.settings.trigger.scrolltype === 'twenty'){
704            if(scrollPercent >= 20){   brave_load_popup(popupID, popupData, 'scroll');   }
705         }
706         if(popupData.settings && popupData.settings.trigger.scrolltype && popupData.settings.trigger.scrolltype === 'half'){
707            if(scrollPercent >= 50){   brave_load_popup(popupID, popupData, 'scroll');   }
708         }
709         if(popupData.settings && popupData.settings.trigger.scrolltype && popupData.settings.trigger.scrolltype === 'end'){
710            if(scrollPercent >= 95){   brave_load_popup(popupID, popupData,  'scroll');   }
711         }
712         if(popupData.settings && popupData.settings.trigger.scrolltype && popupData.settings.trigger.scrollto && popupData.settings.trigger.scrolltype === 'custom'){
713            var scrolltoElms = document.querySelectorAll(popupData.settings.trigger.scrollto);
714            if(scrolltoElms){
715               scrolltoElms.forEach(function(scrolltoElm, index){
716                  if(scrolltoElm && brave_is_in_view(scrolltoElm)){
717                      brave_load_popup(popupID, popupData, 'scroll');  
718                  }
719               });
720            }
721         }
722      });
723   }
724
725   if(triggerType.includes('click') && popupData.settings && popupData.settings.trigger.clickElements){
726      var clickElms = document.querySelectorAll(popupData.settings.trigger.clickElements);
727      //console.log(clickElms);
728      
729      if(clickElms){
730         clickElms.forEach(function(clickElm, index){
731            clickElm.addEventListener("click", function(evt){
732               evt.preventDefault();
733               brave_load_popup(popupID, popupData, 'click');
734            });
735         });
736      }
737   }
738
739   if(triggerType.includes('time') && popupData.settings && popupData.settings.trigger.time && (popupData.settings.trigger.time.hours || popupData.settings.trigger.time.minutes || popupData.settings.trigger.time.seconds)){
740      var triggerHours = popupData.settings.trigger.time.hours ? parseInt(popupData.settings.trigger.time.hours, 10) : 0;
741      var triggerMinutes = popupData.settings.trigger.time.minutes ? parseInt(popupData.settings.trigger.time.minutes, 10) : 0;
742      var triggerSeconds = popupData.settings.trigger.time.seconds ? parseInt(popupData.settings.trigger.time.seconds, 10) : 0;
743
744      var totalTriggerDelay = (triggerHours * 3600) + (triggerMinutes * 60) + (triggerSeconds);
745      totalTriggerDelay = totalTriggerDelay * 1000;
746      //console.log(triggerHours, triggerMinutes, triggerSeconds, totalTriggerDelay);
747      
748      setTimeout(() => {
749          brave_load_popup(popupID, popupData , 'time');
750      }, totalTriggerDelay);
751
752   }
753
754
755   
756}
757
758function brave_load_popup(popupID, popupData, triggerType='load'){
759   var selectedPopup = document.getElementById('brave_popup_'+popupID);
760   var popupLoadStatus = selectedPopup ? selectedPopup.dataset.loaded : 'false';
761 
762   if(popupLoadStatus === 'false'){
763      //LOAD ASSETS
764      //--------------------
765         //Load Video Scripts
766         if(popupData.hasYoutube){
767            var YTtag = document.createElement('script'); YTtag.src = "https://www.youtube.com/iframe_api";
768            var PageFirstScript_YT = document.getElementsByTagName('script')[0]; PageFirstScript_YT.parentNode.insertBefore(YTtag, PageFirstScript_YT);
769         }
770         if(popupData.hasVimeo){
771            var VimTag = document.createElement('script'); VimTag.src = "https://player.vimeo.com/api/player.js";
772            var PageFirstScript_Vim = document.getElementsByTagName('script')[0]; PageFirstScript_Vim.parentNode.insertBefore(VimTag, PageFirstScript_Vim);
773         }
774         
775         selectedPopup.dataset.loaded = true;
776   }
777
778   //Open Popup
779   //---------------------
780   const step = popupData.forceLoad && popupData.forceStep? parseInt(popupData.forceStep, 10) - 1 : 0;
781   if(triggerType === 'exit' || triggerType === 'scroll'){
782      var triggerFulFilled = document.getElementById('brave_popup_'+popupID).dataset.triggerfulfilled;
783      if(!triggerFulFilled){
784         document.getElementById('brave_popup_'+popupID).dataset.triggerfulfilled = true;
785         brave_open_popup(popupID, step);
786      }
787   }else{
788      brave_open_popup(popupID, step);
789   }
790
791}
792
793
794function brave_open_popup(popupID, step=0){
795   var popupData = brave_popup_data[popupID];
796   var selectedPopupStep = document.querySelector('#brave_popup_'+popupID+'__step__'+step+' .brave_popup__step__'+brave_currentDevice)
797   var noMobileContent = selectedPopupStep && selectedPopupStep.dataset.nomobilecontent === 'true' ? true : false;
798   var currentDevice = noMobileContent ? 'desktop' : brave_currentDevice;
799   var selectedPopupStep = document.querySelector('#brave_popup_'+popupID+'__step__'+step+' .brave_popup__step__'+currentDevice);
800   var popupStepOpen = selectedPopupStep ? selectedPopupStep.dataset.open : 'false';
801   var stickyBar = selectedPopupStep && selectedPopupStep.dataset.layout === 'float' && selectedPopupStep.dataset.position === 'top_center' ? true : false;
802
803   console.log('Opening ', popupID, step, popupStepOpen, stickyBar, noMobileContent, currentDevice);
804   //Send Ajax View Stat Data
805   if(window.location.href.includes('brave_popup') === false ){ 
806      var viewData = { popupID: popupID, security: bravepop_global.security, action: 'bravepop_ajax_popup_viewed' };
807      brave_ajax_send(bravepop_global.ajaxURL, viewData, function(status, sentData){
808         // console.log('Popup View Updated: ', status, JSON.parse(sentData));
809      });
810   }
811   //Set Popup Viewed Cookie
812   var currentPopupStat = localStorage.getItem('brave_popup_'+popupID+'_viewed');
813   localStorage.setItem('brave_popup_'+popupID+'_viewed', currentPopupStat ? parseInt(currentPopupStat, 10) + 1 : 1);
814   var popupRepeat =popupData.settings && popupData.settings.frequency && popupData.settings.frequency.repeat
815   var popupRepeatCountType = popupData.settings && popupData.settings.frequency && popupData.settings.frequency.repeatCountType || 'lifetime';
816   if(popupRepeat && popupRepeatCountType !== 'lifetime'){
817      var theViewStat = localStorage.getItem('brave_popup_'+popupID+'_view_stat'); theViewStat = theViewStat ? JSON.parse(theViewStat) : [];
818      theViewStat.push(new Date().getTime());      
819      localStorage.setItem('brave_popup_'+popupID+'_view_stat', JSON.stringify(theViewStat));
820   }
821
822   if(popupStepOpen !== 'false'){ return }
823   if(!popupData){ return }
824
825   //Stickybar - Add html top margin
826   if(stickyBar){
827      //console.log('Apply Sticky Margin');
828      var popupHeight = selectedPopupStep.dataset.height;
829      document.documentElement.style.setProperty('margin-top', popupHeight+'px', 'important');
830   } 
831
832   //LazyLoad Images
833   var allImages = selectedPopupStep.querySelectorAll('img');
834   for (var i = 0; i < allImages.length; i++) { 
835      if(allImages[i].dataset.lazy){
836         allImages[i].src = allImages[i].dataset.lazy;
837      }
838   }
839
840   if(popupData.videoData && popupData.videoData[step] && popupData.videoData[step][currentDevice]){
841      //console.log('HAS VIDEO!!!!!!!!!!!', popupData.videoData[step][currentDevice]);
842      var videoObj = popupData.videoData[step][currentDevice];
843      var videoType = videoObj.videoType ? videoObj.videoType : 'youtube';
844      var videoURL = videoObj.videoUrl ? videoObj.videoUrl : 'youtube';
845      var videoTracking = videoObj.action && videoObj.action.track && videoObj.action.trackData ? videoObj.action.trackData : null;
846      var videoSettings = {id: videoObj.id, autoplay: videoObj.autoplay || false, controls: videoObj.controls || false, mute: videoObj.mute || false, tracking: videoTracking }
847      brave_load_video(videoType, videoURL, videoSettings);
848   }
849
850   var hasAnimation = popupData.hasAnimation ?  popupData.hasAnimation : false;
851   var advancedAnimation = popupData.advancedAnimation ?  popupData.advancedAnimation : false;
852   var hasContAnim = popupData.hasContAnim ?  popupData.hasContAnim : false;
853   var animationData = popupData.animationData ?  popupData.animationData : {};
854   var selectedStep = document.getElementById('brave_popup_'+popupID+'__step__'+step);
855   if(selectedStep){
856      var allSteps = document.querySelectorAll('#brave_popup_'+popupID+' .brave_popup__step_wrap');
857      if(allSteps){
858         allSteps.forEach(function(popStep, index){
859            popStep.classList.remove('brave_popup__step_wrap--show');
860         });
861      }
862      var braveOpenEvent = new CustomEvent('brave_popup_open', { detail: {popupId: parseInt(popupID, 10), step: step} });
863      document.dispatchEvent(braveOpenEvent);
864
865      //Open Animation
866      if(!advancedAnimation){
867         brave_open_animation(popupID, step, currentDevice);
868      }
869
870      //Advanced Animation
871      if(advancedAnimation && hasAnimation && animationData){
872         selectedStep.classList.add('brave_popup__step_wrap--show');
873         brave_animate_popup(animationData, popupID, step, 'load');
874      }
875      //Continious Animation
876      if(hasContAnim && animationData && animationData[step][currentDevice] && animationData[step][currentDevice].elements){
877         var initialDelay = (animationData[step][currentDevice].totalDuration || 0) + 1200;
878         animationData[step][currentDevice].elements.forEach(function(element){
879            //console.log(element);
880            
881            if(element && element.animation && element.animation.continious){
882               //console.log(element.id,element.animation.continious);
883               var theElement = element.id === 'popup' ? document.querySelector('#brave_popup_'+popupID+'__step__'+step+' .brave_popup__step__inner .brave_popupSections__wrap') : document.getElementById('brave_element-'+element.id);
884               var elementID = element.id === 'popup' ? popupID : element.id;
885               var contAnimType = element.animation.continious.preset || 'none';
886               var contAnimDuration = element.animation.continious.duration || 500;
887               var contAnimDelay = element.animation.continious.delay || 0;
888               if(theElement){
889                  setTimeout(() => {
890                     theElement.classList.add('brave_element-'+elementID+'_contAnim'); 
891                     if(contAnimDelay > 0){
892                        setInterval(function() {
893                           theElement.classList.add('brave_element-'+elementID+'_contAnim'); 
894                           setTimeout(function() {
895                              theElement.classList.remove('brave_element-'+elementID+'_contAnim');
896                           }, contAnimDuration);
897                        }, ((contAnimDelay > contAnimDuration) ? contAnimDelay : contAnimDuration + contAnimDelay))
898                     }
899                  }, initialDelay);
900               }
901            }
902
903         })
904
905      }
906
907   }
908   //Show Vertical Scrollbar if Necessary
909   setTimeout(() => {
910      var currentPopupDimension = selectedPopupStep.querySelector('.brave_popup__step__inner').getBoundingClientRect();
911      if((window.innerHeight < currentPopupDimension.height) && selectedPopupStep.classList.contains('brave_popup__step--boxed') && selectedPopupStep.classList.contains('position_center')){
912         selectedPopupStep.classList.add('brave_popup_exceeds_windowHeight');
913         selectedPopupStep.classList.add('brave_popup_show_scrollbar');
914         //document.body.classList.add('brave_HideBodyScroll-'+popupID);
915      }
916   }, 100);
917
918
919   //Popup AutoClose
920   if(popupData.close[0] && popupData.close[0][currentDevice] && popupData.close[0][currentDevice].autoClose && popupData.close[0][currentDevice].autoCloseDuration){
921      setTimeout(() => {
922         brave_close_popup(popupID, step)
923      }, parseInt(popupData.close[0][currentDevice].autoCloseDuration) * 1000);
924   }
925
926   //Change the Popup Step open status
927   selectedPopupStep.dataset.open = true;
928   brave_popup_data[popupID].opened = new Date().getTime();
929   //console.log('Goal Data!!!', popupData.settings);
930   //Complete Step Open Goal
931   if((popupData.settings && !popupData.settings.goalAction) || (popupData.settings && popupData.settings.goalAction && popupData.settings.goalAction.type  && popupData.settings.goalAction.type==='step' && popupData.settings.goalAction.step !== undefined )){
932      //console.log('Goal Step!!!', popupData.settings);
933   
934      var goalStep = popupData.settings.goalAction && popupData.settings.goalAction.step ? popupData.settings.goalAction.step.toString().split(',') :['0'];
935      if(goalStep.includes(step.toString()) ){
936         brave_complete_goal(popupID, 'view');
937      }
938   }
939
940   //If Code element is set to goal, attach submit event listener to complete goal
941   var allCodeElmGoals = document.querySelectorAll('.brave_element__code--goaled form');
942   if(allCodeElmGoals.length > 0){
943      for (var i = 0; i < allCodeElmGoals.length; ++i) {
944         allCodeElmGoals[i].addEventListener('submit', function () {    brave_complete_goal(popupID, 'form');    })
945       }
946   }
947
948
949}
950
951function brave_open_animation(popupID, step, currentDevice){
952   var totalDuration = brave_popup_data[popupID].animationData[step][currentDevice].totalDuration;
953   var openAnimData = brave_popup_data[popupID].animationData[step][currentDevice].elements ? brave_popup_data[popupID].animationData[step][currentDevice].elements : [];
954   var hasAnimation = brave_popup_data[popupID].hasAnimation;
955   var selectedStep = document.querySelector('#brave_popup_'+popupID+'__step__'+step);
956   
957   //console.log(popupID, step, currentDevice, openAnimData, selectedStep);
958
959   var brave_animateElement = function(elementID, selectedStep, elementDom, step, animType) {
960      selectedStep.classList.add('brave_popup__step_wrap--show');
961      if(animType === 'text'){
962         var selected_text_element =  document.querySelector('#brave_element-'+elementID+' .brave_element__text_inner');
963         var selected_text_element_HTML = selected_text_element.innerHTML;
964         var selected_text_element_content = selected_text_element.textContent;
965         var newHTLArray = selected_text_element_content.toString().split('');
966         var selected_text_element_clone = selected_text_element; 
967         
968         selected_text_element_clone.innerHTML ='';
969         for (var i=0;i<=(newHTLArray.length - 1);i++) {
970            (function(ind) {
971               setTimeout(function(){
972                  selected_text_element_clone.innerHTML = selected_text_element_clone.innerHTML+newHTLArray[ind];
973               }, 1000 + (50 * ind));
974            })(i);
975         }
976         setTimeout(function(){
977            selected_text_element_clone.innerHTML = selected_text_element_HTML;
978         }, 1000 + (50 * (newHTLArray.length -1)));
979      }else{
980         if(!elementDom.classList.contains('brave_element-'+elementID+'_'+step+'_openAnim')){ elementDom.classList.add('brave_element-'+elementID+'_'+step+'_openAnim'); }
981      }
982   }
983
984   if(hasAnimation && openAnimData.length > 0){
985      selectedStep.classList.add('brave_popup__step_wrap--show');
986      openAnimData.forEach( function(element){
987         if(element.animation && element.animation.load && element.animation.load.preset){
988            var animType = element.animation.load.preset;
989            var animDuration = element.animation.load.duration;
990            var animDelay = element.animation.load.delay || 0;
991            var elementID = element.id === 'popup' ? popupID : element.id;
992            var elementDom = element.id === 'popup' ? selectedStep.querySelector('.brave_popup__step__'+currentDevice+' .brave_popupSections__wrap') : selectedStep.querySelector('.brave_popup__step__'+currentDevice+' #brave_element-'+element.id);
993            elementDom.style.opacity = 0;
994            selectedStep.classList.remove('brave_popup__step_wrap--show');
995            if(animDelay){
996               // setTimeout(function(){    brave_animateElement(elementID, selectedStep, elementDom, step, animType);  }, animDelay);
997               brave_animateElement(elementID, selectedStep, elementDom, step, animType);
998            }else{
999               brave_animateElement(elementID, selectedStep, elementDom, step, animType);
1000            }
1001
1002            setTimeout(() => { elementDom.style.opacity = ''; }, animDelay+ animDuration - 100);
1003            setTimeout(function(){
1004               elementDom.classList.remove('brave_element-'+elementID+'_'+step+'_openAnim');
1005            }, animDelay+ animDuration + 500);
1006         }
1007      })
1008
1009   }else{
1010      selectedStep.classList.add('brave_popup__step_wrap--show');
1011   }
1012
1013}
1014
1015function brave_close_popup(popupID, step=0, gotoStep=false){
1016   var selectedStep = document.getElementById('brave_popup_'+popupID+'__step__'+step);
1017   var selectedPopupStep = selectedStep.querySelector('.brave_popup__step__'+brave_currentDevice);
1018   var noMobileContent = selectedPopupStep.dataset.nomobilecontent === 'true' ? true : false;
1019   var currentDevice = noMobileContent ? 'desktop' : brave_currentDevice;
1020   
1021   if(selectedStep){
1022      var exitAnimation = '';
1023      var currentPopupCloseStat = localStorage.getItem('brave_popup_'+popupID+'_closed') ? JSON.parse(localStorage.getItem('brave_popup_'+popupID+'_closed')) : {};
1024      var newCloseStat = {closed: currentPopupCloseStat.closed ? currentPopupCloseStat.closed + 1 : 1, closeTime: new Date().getTime()}
1025      localStorage.setItem('brave_popup_'+popupID+'_closed', JSON.stringify(newCloseStat));
1026      //Close Animation
1027      var exitAnimation = selectedStep.querySelector('.brave_popup__step__'+currentDevice).dataset.exitanimtype || '';
1028      var exitAnimationDuration = selectedStep.dataset.exitanimlength ? parseFloat(selectedStep.dataset.exitanimlength, 10) : 0.5;
1029      
1030      //Set the Popup Open status to False 
1031      var selectedPopupStep = selectedStep.querySelector('.brave_popup__step__'+currentDevice);
1032      selectedPopupStep.dataset.open = 'false';
1033
1034      //Stop All Videos
1035      if(brave_popup_videos && Object.keys(brave_popup_videos).length > 0){
1036         Object.keys(brave_popup_videos).forEach(function(playerID){
1037            if(playerID.includes('youtube') && brave_popup_videos[playerID]){   brave_popup_videos[playerID].stopVideo();  }
1038            if(playerID.includes('vimeo') && brave_popup_videos[playerID]){   brave_popup_videos[playerID].pause();  }
1039         });
1040      }
1041
1042      var braveCloseEvent = new CustomEvent('brave_popup_close', { detail: {popupId: parseInt(popupID, 10), step: step} });
1043      document.dispatchEvent(braveCloseEvent);
1044
1045      //Play Exit Animation
1046      if(exitAnimation){
1047         selectedStep.querySelector('.brave_popupSections__wrap').classList.add('brave_element-'+popupID+'_'+step+'_exitAnim');
1048         setTimeout(() => { selectedStep.classList.remove('brave_popup__step_wrap--show');}, (exitAnimationDuration * 1000));
1049         setTimeout(() => { selectedStep.querySelector('.brave_popupSections__wrap').classList.remove('brave_element-'+popupID+'_'+step+'_exitAnim'); }, (exitAnimationDuration * 1000)+500);
1050         if(selectedStep.querySelector('.brave_popup__step__'+currentDevice+' .brave_popup__step__overlay')){
1051            setTimeout(() => { 
1052               selectedStep.querySelector('.brave_popup__step__'+currentDevice+' .brave_popup__step__overlay').classList.add('brave_popup__step__overlay--hide');
1053            }, (exitAnimationDuration > 0.3 ? ((exitAnimationDuration * 1000) - 200) : 200));
1054            setTimeout(() => { selectedStep.querySelector('.brave_popup__step__'+currentDevice+' .brave_popup__step__overlay').classList.remove('brave_popup__step__overlay--hide'); }, (exitAnimationDuration * 1000)+500);
1055         }
1056      }else{
1057         selectedStep.classList.add('brave_popup__step_wrap--hide');
1058         setTimeout(() => { selectedStep.classList.remove('brave_popup__step_wrap--show');}, 500);
1059         setTimeout(() => { selectedStep.classList.remove('brave_popup__step_wrap--hide');}, 800);
1060      }
1061      
1062      //If has gotoStep Command, go there
1063      if(gotoStep !== false && gotoStep >=0){
1064         //First set the Taget Step's Open status to false
1065         var targetStep = document.getElementById('brave_popup_'+popupID+'__step__'+gotoStep);
1066         targetStep.querySelector('.brave_popup__step__desktop').dataset.open = false;
1067         targetStep.querySelector('.brave_popup__step__mobile').dataset.open = false;
1068         //Then Open the Popup
1069         brave_open_popup(popupID, gotoStep);
1070      }
1071      var stickyBar = selectedPopupStep.dataset.layout === 'float' && selectedPopupStep.dataset.position === 'top_center' ? true : false;
1072      if(stickyBar){
1073         var newHeight = document.querySelector('body.admin-bar') ? '32px' : '0px';
1074         document.documentElement.style.setProperty('margin-top', newHeight, 'important');
1075      }
1076      
1077   }
1078}
1079
1080function brave_send_ga_event(eventCategory, eventAction, eventLabel){
1081   //console.log('ga Event: ', eventCategory, eventAction, eventLabel);
1082   if ("ga" in window && eventCategory && eventAction) {
1083      var tracker = ga.getAll()[0];
1084      if (tracker){
1085         tracker.send('event', eventCategory, eventAction, eventLabel);
1086      }
1087   }
1088}
1089
1090
1091function brave_load_video(videoType, videoURL, videoSettings){
1092   //console.log(videoType, videoURL, videoSettings, videoSettings.tracking);
1093
1094   var elmID = videoSettings.id.replace(/[^a-zA-Z0-9]+/g, '');
1095   if(videoType ==='custom'){
1096      brave_popup_videos['video_'+videoType+elmID] = document.getElementById('brave_video_custom_'+videoSettings.id);
1097      if(videoSettings.autoplay){
1098         brave_play_video(videoSettings.id, 'custom', videoSettings.tracking);
1099      }
1100   }
1101
1102   if(videoType ==='youtube'){
1103      var youtube_regex = new RegExp(/^.*(youtu\.be\/|vi?\/|u\/\w\/|embed\/|\?vi?=|\\&vi?=)([^#\\&\\?]*).*/);
1104      var parsed = videoURL.match(youtube_regex);
1105      var videoID = parsed && parsed[2] ? parsed[2]:null;
1106   
1107      if(!brave_popup_videos['video_'+videoType+elmID]){
1108         setTimeout(function() {
1109            brave_popup_videos['video_'+videoType+elmID] = new YT.Player('brave_video_iframe'+elmID, {
1110               videoId: videoID,
1111               playerVars: { 'autoplay': false, 'controls': videoSettings.controls ? videoSettings.controls : true, mute: videoSettings.mute ? videoSettings.mute : false  },
1112               events: {
1113                  'onReady': function(){
1114                     return videoSettings.autoplay && brave_play_video(videoSettings.id, 'youtube', videoSettings.tracking)
1115                  }
1116               }
1117            });
1118         }, 1000);
1119      }else{
1120         if(videoSettings.autoplay) { brave_play_video(videoSettings.id, 'youtube', videoSettings.tracking); }
1121      } 
1122   }
1123
1124   if(videoType ==='vimeo'){
1125      var vimeo_regex = new RegExp(/https?:\/\/(?:www\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|)(\d+)(?:$|\/|\?)/);
1126      var parsed = videoURL.match(vimeo_regex);
1127      var videoID = parsed && parsed[3] ? parsed[3] : null;
1128      
1129      if(!brave_popup_videos['video_'+videoType+elmID]){
1130         setTimeout(function() {
1131            brave_popup_videos['video_'+videoType+elmID] = new Vimeo.Player('brave_video_iframe'+elmID, {  id: videoID, background: videoSettings.controls ===false ? true : false });
1132            setTimeout(() => {
1133               if(videoSettings.mute){
1134                  brave_popup_videos['video_'+videoType+elmID].setVolume(0);
1135               }
1136               if(videoSettings.autoplay){
1137                  brave_play_video(videoSettings.id, 'vimeo', videoSettings.tracking);
1138               }
1139            }, 2000);
1140         }, 1000);
1141      }else{
1142         if(videoSettings.autoplay) { brave_play_video(videoSettings.id, 'youtube', videoSettings.tracking); }
1143      }
1144      
1145   }
1146
1147}
1148
1149function brave_play_video(elmentID, videoType, track=null, inline=false){
1150   //console.log('brave_play_video', elmentID, videoType, track );
1151   var elmID = elmentID.replace(/[^a-zA-Z0-9]+/g, '');
1152   if(!brave_popup_videos['video_'+videoType+elmID]){ return; }
1153
1154   if(document.getElementById("brave_element-"+elmentID)){
1155      document.getElementById("brave_element-"+elmentID).classList.add('brave_element--video-show');
1156   }
1157
1158   //Custom Video Playback
1159   if(videoType === 'custom' ){
1160      brave_popup_videos['video_'+videoType+elmID].muted = true; //Video doesnt autoplay if not muted
1161      brave_popup_videos['video_'+videoType+elmID].play();
1162   }
1163   //Youtube and Vimeo Playback
1164   if(videoType === 'youtube' || videoType === 'vimeo'){
1165      if(videoType === 'youtube' && brave_popup_videos['video_'+videoType+elmID]){   brave_popup_videos['video_'+videoType+elmID].playVideo();   }
1166      if(videoType === 'vimeo' && brave_popup_videos['video_'+videoType+elmID]){     brave_popup_videos['video_'+videoType+elmID].play().then(); }
1167   }
1168
1169   //Track Video Playback
1170   if(inline && !track){
1171      var playButton = document.getElementById('brave_play_video-'+elmentID)
1172      if(playButton){
1173         var eventCategory = playButton.dataset.trackcategory || '';
1174         var eventAction = playButton.dataset.trackcategory || '';
1175         var eventLabel = playButton.dataset.tracklabel || '';
1176         track = {eventCategory: eventCategory, eventAction:eventAction, eventLabel: eventLabel}
1177      }
1178   }
1179   
1180   if(track && track.eventCategory && track.eventAction){
1181      brave_send_ga_event(track.eventCategory, track.eventAction, track.eventLabel || '');
1182   }
1183   
1184}
1185
1186function brave_complete_goal(popupID, goalType='view'){
1187   if(window.location.href.includes('brave_popup') === false ){ 
1188      var goalData = { 
1189         popupID: popupID, 
1190         pageURL: window.location, 
1191         security: bravepop_global.security, 
1192         goalType: goalType, 
1193         viewTime: brave_popup_data[popupID].opened, 
1194         goalTime: new Date().getTime(), 
1195         goalUTCTime: new Date().toUTCString(), 
1196         device: brave_currentDevice, 
1197         action: 'bravepop_ajax_popup_complete_goal' 
1198      };
1199
1200      brave_ajax_send(bravepop_global.ajaxURL, goalData, function(status, sentData){   console.log('Goal Complete!!!!!!', sentData);  });
1201      localStorage.setItem('brave_popup_'+popupID+'_goal_complete', true);
1202      var braveGoalCompletEvent = new CustomEvent('brave_goal_complete', { detail: {popupId: parseInt(popupID, 10), goalType: goalType} });
1203      document.dispatchEvent(braveGoalCompletEvent);
1204      if(brave_popup_data[popupID].settings && brave_popup_data[popupID].settings.notification && brave_popup_data[popupID].settings.notification.analyticsGoal){
1205         setTimeout(() => {
1206            //console.log('##### Send Goal Event to GA!');
1207            brave_send_ga_event('popup', 'goal', brave_popup_data[popupID].title+' ('+popupID+')' || popupID);
1208         }, 2000);
1209      }
1210   }
1211}
1212
1213function brave_load_fonts(fontArray){
1214    if(fontArray.length > 0){
1215      WebFontConfig = {
1216         google: { families: fontArray }
1217       };
1218       (function() {
1219          if(!document.getElementById('bravePopu_webfontLoader')){
1220               var wf = document.createElement('script');
1221               wf.setAttribute("id", "bravePopu_webfontLoader");
1222               wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +'://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js';
1223               wf.type = 'text/javascript';
1224               wf.async = 'true';
1225               var s = document.getElementsByTagName('script')[0];
1226               s.parentNode.insertBefore(wf, s);
1227          }
1228       })();
1229    }
1230	//return fontArray;
1231};
1232
1233function brave_is_in_view(elem) {
1234   var bounding = elem.getBoundingClientRect();
1235   return (
1236       bounding.top >= 0 &&
1237       bounding.left >= 0 &&
1238       bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
1239       bounding.right <= (window.innerWidth || document.documentElement.clientWidth)
1240   );
1241};
1242
1243window.addEventListener( 'DOMContentLoaded', brave_after_page_load );
1244function brave_after_page_load(){
1245   var allBraveFonts = []
1246   Object.keys(brave_popup_data).forEach((popID)=> {
1247      brave_popup_data[popID].fonts.forEach((fontName)=> {
1248         if(!allBraveFonts.includes(fontName)){
1249               allBraveFonts.push(fontName);
1250         }
1251      })
1252   });
1253   brave_load_fonts(allBraveFonts);
1254}
1255
1256function brave_responsiveness(popupID, popupData){
1257   //If a step has no Mobile Content is set, make the Desktop Content mobile friendly and display that instead
1258   var stepsWithNoMobile = document.querySelectorAll('.brave_popup__step--mobile-noContent');
1259   if(brave_isTab){ stepsWithNoMobile = document.querySelectorAll('.brave_popup__step_wrap'); }
1260   for (var i = 0; i < stepsWithNoMobile.length; i++) {
1261      var desktopStep =  stepsWithNoMobile[i].querySelector('.brave_popup__step__desktop');
1262      var popupLayout = desktopStep.dataset.layout;
1263      var popupPosition = popupLayout === 'landing' ? 'top_center' :desktopStep.dataset.position;
1264      var popupWidth = parseInt(desktopStep.dataset.width, 10);
1265      var popupHeight = parseInt(desktopStep.dataset.height, 10);
1266      var windowWidth = document.body.clientWidth;  //window.innerWidth
1267      var windowHeight = window.innerHeight;
1268      
1269      if(brave_currentDevice === 'mobile' || brave_isTab){
1270         if((windowWidth < popupWidth) && (popupLayout == 'boxed' || popupLayout == 'landing' ) ){
1271            var scale =  desktopStep ? windowWidth/ desktopStep.dataset.width : 0;
1272            var tansformOrigin = popupPosition.includes('top') ? 'top' : 'center';
1273            desktopStep.querySelector('.brave_popup__step__inner').style.transform = 'scale('+((scale*95)/100)+')';
1274            desktopStep.querySelector('.brave_popup__step__inner').style.transformOrigin = ((scale*95)/2)+'px '+tansformOrigin;
1275            if(windowWidth < popupWidth && windowHeight < popupHeight){
1276               desktopStep.querySelector('.brave_popup__step__inner').style.transformOrigin = 'left top';
1277               desktopStep.querySelector('.brave_popup__step__inner').style.marginTop = 0;
1278               desktopStep.querySelector('.brave_popup__step__inner').style.top = 0;
1279            }
1280            if(popupPosition.includes('center') ){
1281               var widthRemainder = windowWidth - (popupWidth * (scale*95)/100) ;
1282               var heightRemainder = windowHeight - (popupHeight * (scale*95)/100) ;
1283               desktopStep.querySelector('.brave_popup__step__inner').style.left = widthRemainder > 0 ? (widthRemainder/2)+'px' : '0';
1284               //if(popupPosition === 'center'){ desktopStep.querySelector('.brave_popup__step__inner').style.top = heightRemainder > 0 ? (heightRemainder/2)+'px' : '0'; }
1285            }
1286            // if(windowHeight < (popupHeight * (scale*95)/100) ){
1287            //    console.log('Window Height vs Popup Height', windowHeight < (popupHeight * (scale*95)/100), windowHeight , (popupHeight * (scale*95)/100) );
1288            // }
1289         }
1290         if(brave_currentDevice === 'mobile' && ((290 < popupWidth) || windowHeight < popupHeight) && (popupLayout == 'boxed' ) && (popupPosition === 'bottom_right') ){
1291            desktopStep.querySelector('.brave_popup__step__inner').style.transform = 'scale(0.8)';
1292            desktopStep.querySelector('.brave_popup__step__inner').style.transformOrigin = '100% bottom';
1293         }
1294
1295      }
1296   }
1297   //Embedded Popup Resonsiveness
1298   var selectedPopup = document.getElementById('brave_popup_'+popupID);
1299   if(brave_popup_data[popupID] && brave_popup_data[popupID].hasDesktopEmbed){  selectedPopup.classList.add('brave_popup--embedded'); selectedPopup.dataset.embedded ='true'}
1300   if(brave_isMobile && brave_popup_data[popupID] && brave_popup_data[popupID].hasMobileEmbed){  selectedPopup.classList.add('brave_popup--embedded'); selectedPopup.dataset.embedded ='true'}
1301   var theEmbbeddedPopup = document.getElementById('bravepopup_embedded_'+popupID);
1302   if(theEmbbeddedPopup && selectedPopup.dataset.embedded === 'true'){
1303      var parentElm = theEmbbeddedPopup.parentNode;
1304      //console.log('EMBEDDED POPUP!!!!',  parentElm);
1305     theEmbbeddedPopup.appendChild( document.getElementById('brave_popup_'+popupID));
1306      
1307      //If Embedded, make the Popup Responsive on desktop
1308      var allEmbeddedSteps = document.querySelectorAll('.brave_popup__step__desktop.brave_popup__step--embedded');
1309      for (var i = 0; i < allEmbeddedSteps.length; i++) {
1310         var desktopStep =  document.getElementById('brave_popup_'+popupID+'__step__'+i);
1311         //var embededStepNoMobile = desktopStep.classList.contains('brave_popup__step--mobile-noContent') ? true : false;
1312         if((!brave_isMobile || (brave_isMobile)) && desktopStep){
1313            var popupWidth = parseInt(allEmbeddedSteps[i].dataset.width, 10);
1314            var popupHeight = parseInt(allEmbeddedSteps[i].dataset.height, 10);
1315            var popup_parent_width = parentElm.clientWidth;
1316            
1317            if((popup_parent_width < popupWidth) ){
1318               var scale =  Math.min( popup_parent_width / allEmbeddedSteps[i].dataset.width);
1319               desktopStep.querySelector('.brave_popup__step__inner').style.transform = 'scale('+((scale*96)/100)+')';
1320               desktopStep.querySelector('.brave_popup__step__inner').style.transformOrigin = ((scale*96)/2)+'px center';
1321               desktopStep.querySelector('.brave_popup__step__inner').parentNode.classList.add('brave_popup__step__inner--scaled');
1322            }
1323         }
1324      }
1325
1326   }
1327}
1328
1329window.addEventListener( 'resize', brave_responsiveness );

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.