text: /**
   * @file
   * JavaScript behaviors for other elements.
   */
  
  (function ($, Drupal) {
  
    'use strict';
  
    /**
     * Toggle other input (text) field.
     *
     * @param {boolean} show
     *   TRUE will display the text field. FALSE with hide and clear the text field.
     * @param {object} $element
     *   The input (text) field to be toggled.
     * @param {string} effect
     *   Effect.
     */
    function toggleOther(show, $element, effect) {
      var $input = $element.find('input');
      var hideEffect = (effect === false) ? 'hide' : 'slideUp';
      var showEffect = (effect === false) ? 'show' : 'slideDown';
  
      if (show) {
        // Limit the other inputs width to the parent's container.
        // If the parent container is not visible it's width will be 0
        // and ignored.
        var width = $element.parent().width();
        if (width) {
          $element.width(width);
        }
  
        // Display the element.
        $element[showEffect]();
        // If not initializing, then focus the other element.
        if (effect !== false) {
          $input.focus();
        }
        // Require the input.
        $input.prop('required', true).attr('aria-required', 'true');
        // Restore the input's value.
        var value = $input.data('webform-value');
        if (typeof value !== 'undefined') {
          $input.val(value);
          var input = $input.get(0);
          // Move cursor to the beginning of the other text input.
          // @see https://stackoverflow.com/questions/21177489/selectionstart-selectionend-on-input-type-number-no-longer-allowed-in-chrome
          if ($.inArray(input.type, ['text', 'search', 'url', 'tel', 'password']) !== -1) {
            input.setSelectionRange(0, 0);
          }
        }
        // Refresh CodeMirror used as other element.
        $element.parent().find('.CodeMirror').each(function (index, $element) {
          $element.CodeMirror.refresh();
        });
      }
      else {
        // Hide the element.
        $element[hideEffect]();
        // Save the input's value.
        $input.data('webform-value', $input.val());
        // Empty and un-required the input.
        $input.val('').prop('required', false).removeAttr('aria-required');
      }
    }
  
    /**
     * Attach handlers to select other elements.
     *
     * @type {Drupal~behavior}
     */
    Drupal.behaviors.webformSelectOther = {
      attach: function (context) {
        $(context).find('.js-webform-select-other').once('webform-select-other').each(function () {
          var $element = $(this);
  
          var $select = $element.find('select');
          var $otherOption = $element.find('option[value="_other_"]');
          var $input = $element.find('.js-webform-select-other-input');
  
          $select.on('change', function () {
            toggleOther($otherOption.is(':selected'), $input);
          });
  
          toggleOther($otherOption.is(':selected'), $input, false);
        });
      }
    };
  
    /**
     * Attach handlers to checkboxes other elements.
     *
     * @type {Drupal~behavior}
     */
    Drupal.behaviors.webformCheckboxesOther = {
      attach: function (context) {
        $(context).find('.js-webform-checkboxes-other').once('webform-checkboxes-other').each(function () {
          var $element = $(this);
          var $checkbox = $element.find('input[value="_other_"]');
          var $input = $element.find('.js-webform-checkboxes-other-input');
  
          $checkbox.on('change', function () {
            toggleOther(this.checked, $input);
          });
  
          toggleOther($checkbox.is(':checked'), $input, false);
        });
      }
    };
  
    /**
     * Attach handlers to radios other elements.
     *
     * @type {Drupal~behavior}
     */
    Drupal.behaviors.webformRadiosOther = {
      attach: function (context) {
        $(context).find('.js-webform-radios-other').once('webform-radios-other').each(function () {
          var $element = $(this);
  
          var $radios = $element.find('input[type="radio"]');
          var $input = $element.find('.js-webform-radios-other-input');
  
          $radios.on('change', function () {
            toggleOther(($radios.filter(':checked').val() === '_other_'), $input);
          });
  
          toggleOther(($radios.filter(':checked').val() === '_other_'), $input, false);
        });
      }
    };
  
    /**
     * Attach handlers to buttons other elements.
     *
     * @type {Drupal~behavior}
     */
    Drupal.behaviors.webformButtonsOther = {
      attach: function (context) {
        $(context).find('.js-webform-buttons-other').once('webform-buttons-other').each(function () {
          var $element = $(this);
  
          var $buttons = $element.find('input[type="radio"]');
          var $input = $element.find('.js-webform-buttons-other-input');
          var $container = $(this).find('.js-webform-webform-buttons');
  
          // Create set onchange handler.
          $container.change(function () {
            toggleOther(($(this).find(':radio:checked').val() === '_other_'), $input);
          });
  
          toggleOther(($buttons.filter(':checked').val() === '_other_'), $input, false);
        });
      }
    };
  
  })(jQuery, Drupal);
  ;
  