/**
 * @file
 * Polyfill for HTML5 date input.
 */

(function($, Modernizr, Drupal) {
  /**
   * Attach datepicker fallback on date elements.
   *
   * @type {Drupal~behavior}
   *
   * @prop {Drupal~behaviorAttach} attach
   *   Attaches the behavior. Accepts in `settings.date` an object listing
   *   elements to process, keyed by the HTML ID of the form element containing
   *   the human-readable value. Each element is an datepicker settings object.
   * @prop {Drupal~behaviorDetach} detach
   *   Detach the behavior destroying datepickers on effected elements.
   */
  Drupal.behaviors.date = {
    attach(context, settings) {
      const $context = $(context);
      // Skip if date are supported by the browser.
      if (Modernizr.inputtypes.date === true) {
        return;
      }
      $context
        .find('input[data-drupal-date-format]')
        .once('datePicker')
        .each(function() {
          const $input = $(this);
          const datepickerSettings = {};
          const dateFormat = $input.data('drupalDateFormat');
          // The date format is saved in PHP style, we need to convert to jQuery
          // datepicker.
          datepickerSettings.dateFormat = dateFormat
            .replace('Y', 'yy')
            .replace('m', 'mm')
            .replace('d', 'dd');
          // Add min and max date if set on the input.
          if ($input.attr('min')) {
            datepickerSettings.minDate = $input.attr('min');
          }
          if ($input.attr('max')) {
            datepickerSettings.maxDate = $input.attr('max');
          }
          $input.datepicker(datepickerSettings);
        });
    },
    detach(context, settings, trigger) {
      if (trigger === 'unload') {
        $(context)
          .find('input[data-drupal-date-format]')
          .findOnce('datePicker')
          .datepicker('destroy');
      }
    },
  };
})(jQuery, Modernizr, Drupal);
