(function ($, Drupal, drupalSettings) {
// Drupal behaviours name.
var behaviors_name = Math.floor(Math.random() * Date.now());  
  
Drupal.behaviors[behaviors_name] = {
  attach: function (context, settings) {
    
    var leadInfo = {
          leadID : getUniqueID()
    };
    
    // Results messages treatment.
    if (typeof drupalSettings.sd_general.lead.result != 'undefined' && drupalSettings.sd_general.lead.result.message_id != 'undefined') {
      message_obj = $('#' + drupalSettings.sd_general.lead.result.message_id).children('.messages-box');
      sid = $('#' + drupalSettings.sd_general.lead.result.message_id).data('states-id');
      
      if (drupalSettings.sd_general.lead.result.status == 'ok') {
        message_obj.siblings().hide();  
        processed_msg = drupalSettings.webforms[sid].properties.fields['form_success_message']['#message_message'];
        type_msg = 'notice';
      }
      else {
        processed_msg = drupalSettings.webforms[sid].properties.fields['form_error_message']['#message_message'];
        type_msg = 'error';
      }
      scrollIntoViewIfNeeded(message_obj[0]);
      printMessage(message_obj.attr('id'), processed_msg, type_msg);
    }
    
    function webformValidationFunction_phPo(form, messages_id) {
      // Variables initialization.
      var states_id = form.data('states-id');
      var full_error = '';
      var required_counter = 0;
      var fields = [];
      var jq_fields = [];
      var ds_fields = drupalSettings.webforms[states_id].properties.fields;
      var ds_error_messages_type = drupalSettings.webforms[states_id].properties.config.data.error_messages_type;
      var show_field_errors = drupalSettings.webforms[states_id].properties.config.data.red_errors;
      var ds_translations = drupalSettings.webforms[states_id].properties.translations;
      
      // Start validation process.
      Object.keys(ds_fields).forEach(function(field_name) {
        // Check if field is a textarea for getting in a different way.
        if (ds_fields[field_name]['#type'] == 'textarea') {
          fields[field_name] = $('textarea[name=' + field_name + ']', form)[0]; 
          jq_fields[field_name] = $('textarea[name=' + field_name + ']', form); 
        }
        else if (ds_fields[field_name]['#type'] == 'select') {
          fields[field_name] = $('select[name=' + field_name + ']', form)[0]; 
          jq_fields[field_name] = $('select[name=' + field_name + ']', form); 
        }
        else {
          fields[field_name] = $('input[name=' + field_name + ']', form)[0];
          jq_fields[field_name] = $('input[name=' + field_name + ']', form); 
        }
        
        if (ds_fields[field_name]['#required'] == true) {
          if (fields[field_name].validity.valueMissing) {
            fields[field_name].setCustomValidity('');

            if (ds_error_messages_type == 'non_generic') {
              // Get required error message.
              full_error += ds_fields[field_name]['#required_error'] + '<br/>';
            }
            else if (ds_error_messages_type == 'generic') {
              required_counter++;
            }

            if (show_field_errors) {
              jq_fields[field_name].addClass("error");
            }  
          }
          else {
            jq_fields[field_name].removeClass("error");
          }
        }
        
        // Check if field has a pattern to check it.
        if (ds_fields[field_name]['#pattern']) {
          if (fields[field_name].validity.patternMismatch) {
            fields[field_name].setCustomValidity('');
            // Get pattern error message.
            full_error += ds_fields[field_name]['#pattern_error'] + '<br/>';
            // Check if we have to highlight fields with errors.
            if (show_field_errors) {
              jq_fields[field_name].addClass("error");
            }
          }
          else if (!fields[field_name].validity.valueMissing) {
            jq_fields[field_name].removeClass("error");
          }  
        }
        
        // Check if field has a max and minlenght to check it.
        if (ds_fields[field_name]['#minlength'] || ds_fields[field_name]['#maxlength']) {
          if (fields[field_name].value && !fields[field_name].validity.patternMismatch 
              && (fields[field_name].value.length < ds_fields[field_name]['#minlength']  || fields[field_name].value.length > ds_fields[field_name]['#maxlength'])) {
            fields[field_name].setCustomValidity('');
            // Get pattern error message. We don't have other to show.
            full_error += ds_fields[field_name]['#pattern_error'] + '<br/>';
            
            // Check if we have to highlight fields with errors.
            if (show_field_errors) {
              jq_fields[field_name].addClass("error");
            }
          }
          else if (!fields[field_name].validity.valueMissing && !fields[field_name].validity.patternMismatch) {
            jq_fields[field_name].removeClass("error");
          }  
        }
      });
      
      // Check error messages type and validate required fields for type generic.
      if (ds_error_messages_type == 'generic' && required_counter > 0) {
        // Prepend global error messsage if needed.
        full_error = ds_translations['generic_message_error'] + '<br/>' + full_error;
      }
     
      
      // Show errors if exist.
      if (full_error) {
        printMessage(messages_id, full_error, 'error');
      }
      else {
        // API validation (phone and zipcode fields).
        var request_data = {
          'api_key' : drupalSettings.webforms[states_id].properties.config.data.api_key,
          'phone': typeof fields['phone'] !== 'undefined' ? fields['phone'].value : '',
          'postcode': typeof fields['postcode'] !== 'undefined' ? fields['postcode'].value : '',
          'country': typeof fields['country'] !== 'undefined' ? fields['country'].value : '',
        };
        
        // Generic message for fails.
        full_error = ds_translations['request_validation_error'];
      
        // Ajax validation against API for phone and postcode.
        $.ajax ({
          url: drupalSettings.webforms[states_id].properties.config.data.service_validation_url,
          type: "POST",
          dataType: "json",
          data : JSON.stringify(request_data),
          success: function (data) {
            $('#' + messages_id).show();
            // Success callback.
            if (data.status == 'error') {
              if (data.description == 'ERR_AUTHENTICATION') {
                full_error += ' (1)';
              }
              else if (data.description == 'ERR_ARGUMENT_MISSING') {
                full_error += ' (2)';
              }
              else if (data.description == 'ERR_COUNTRY') {
                full_error += ' (3)';
              }
              
              printMessage(messages_id, full_error, 'error');
            }
            else if (data.status == 'ok') {              
              if (data.phone.is_valid === false) {
                printMessage(messages_id, ds_fields['phone']['#pattern_error'], 'error');
                
                if (show_field_errors) {
                  jq_fields['phone'].addClass("error");
                }
              }
              else if (data.postcode.is_valid === false) {
                printMessage(messages_id, ds_fields['postcode']['#pattern_error'], 'error');
                
                if (show_field_errors) {
                  jq_fields['postcode'].addClass("error");
                }
              }
              else {
                if (typeof pushDataLayer === "function") {
                  //dataLayer values
                  var trackingData = new Object();
                  trackingData.event = $('input[name="eventga"]', form)[0] != undefined ? $('input[name="eventga"]', form)[0].value : '';
                  trackingData.formName = $('input[name="formnamega"]', form)[0] != undefined ? $('input[name="formnamega"]', form)[0].value : '';
                  trackingData.formStatus = $('input[name="formstatusga"]', form)[0] != undefined ? $('input[name="formstatusga"]', form)[0].value : '';
                  trackingData.leadid = leadInfo.leadID;
                  //dataLayer push function call
                  pushDataLayer(trackingData);
                }
                
                // No errors. Submit form. Block submit for multiple submits.
                $('.form-submit-button').prop('disabled', true);
                form.submit();
              }
            }
          },
          error: function() {
            // Request error.
            full_error += ' (4)';
            printMessage(messages_id, full_error, 'error');
          }
        });
      }
    }

    // Submit button click event.
    $('.webform-submission-ph-po-form .form-submit').each(function() {
      $(this).click(function(event) {
        event.preventDefault();
        event.stopPropagation();

        var form = $(this).parents('form:first');
      
        checkLeadWebInfo(form);     
             
        // terms = $('input[name=terms_of_service]', form)[0];
        // $('input[name=consent]', form)[0].value = terms;
        
        // Set messsages layer.
        messages_id = $('.messages-box', form).attr('id');
        $('input[name=message_id]', form)[0].value = form[0].id;
      
        webformValidationFunction_phPo(form, messages_id);
      });  
    });
    function getUniqueID(){
      var randomChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
      var randomNumbers = '0123456789';
      var randomString = '';
      for ( var i = 0; i < 3; i++ ) {
        randomString += randomChars.charAt(Math.floor(Math.random() * randomChars.length));
      }
      for ( var y = 0; y < 3; y++ ) {
        randomString += randomNumbers.charAt(Math.floor(Math.random() * randomNumbers.length));
      }
     
      var today = new Date();
      var dd = String(today.getDate()).padStart(2, '0');
      var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!
      var yyyy = today.getFullYear();
      var h = String(today.getHours()).padStart(2, '0');
      var m = String(today.getMinutes()).padStart(2, '0');
     
      return  yyyy + mm + dd + h + m + randomString;
    }
  }
};
})(jQuery, Drupal, drupalSettings);