var jsPsychSurveyHtmlForm = (function (jspsych) {
  'use strict';

  const info = {
      name: "survey-html-form",
      parameters: {
          modal: {
              type: jspsych.ParameterType.HTML_STRING,
              pretty_name: "Modal",
              default: '',
          },

          /** HTML formatted string containing all the input elements to display. Every element has to have its own distinctive name attribute. The <form> tag must not be included and is generated by the plugin. */
          html: {
              type: jspsych.ParameterType.HTML_STRING,
              pretty_name: "HTML",
              default: null,
          },
          /** HTML formatted string to display at the top of the page above all the questions. */
          preamble: {
              type: jspsych.ParameterType.HTML_STRING,
              pretty_name: "Preamble",
              default: null,
          },
          /** The text that appears on the button to finish the trial. */
          button_label: {
              type: jspsych.ParameterType.STRING,
              pretty_name: "Button label",
              default: "Continue",
          },
          /** The HTML element ID of a form field to autofocus on. */
          autofocus: {
              type: jspsych.ParameterType.STRING,
              pretty_name: "Element ID to focus",
              default: "",
          },
          /** Retrieve the data as an array e.g. [{name: "INPUT_NAME", value: "INPUT_VALUE"}, ...] instead of an object e.g. {INPUT_NAME: INPUT_VALUE, ...}. */
          dataAsArray: {
              type: jspsych.ParameterType.BOOL,
              pretty_name: "Data As Array",
              default: false,
          },
          /** Setting this to true will enable browser auto-complete or auto-fill for the form. */
          autocomplete: {
              type: jspsych.ParameterType.BOOL,
              pretty_name: "Allow autocomplete",
              default: false,
          },
      },
  };
  /**
   * **survey-html-form**
   *
   * jsPsych plugin for displaying free HTML forms and collecting responses from all input elements
   *
   * @author Jan Simson
   * @see {@link https://www.jspsych.org/plugins/jspsych-survey-html-form/ survey-html-form plugin documentation on jspsych.org}
   */
  class SurveyHtmlFormPlugin {
      constructor(jsPsych) {
          this.jsPsych = jsPsych;
      }
      trial(display_element, trial) {
          var html = "";
          // show preamble text
          if (trial.preamble !== null) {
              html +=
                  '<div id="jspsych-survey-html-form-preamble" class="jspsych-survey-html-form-preamble">' +
                      trial.preamble +
                      "</div>";
          }
          // start form
          if (trial.autocomplete) {
              html += '<form id="jspsych-survey-html-form">';
          }
          else {
              html += '<form id="jspsych-survey-html-form" autocomplete="off">';
          }
          // add form HTML / input elements
          html += trial.html;

          // add modal if we got one
          html += trial.modal;

          // add submit button
          html +=
              '<input type="submit" id="jspsych-survey-html-form-next" class="jspsych-btn form-continue jspsych-survey-html-form" value="' +
                  trial.button_label +
                  '"></input>';
          html += "</form>";
          display_element.innerHTML = html;
          if (trial.autofocus !== "") {
              var focus_elements = display_element.querySelectorAll("#" + trial.autofocus);
              if (focus_elements.length === 0) {
                  console.warn("No element found with id: " + trial.autofocus);
              }
              else if (focus_elements.length > 1) {
                  console.warn('The id "' + trial.autofocus + '" is not unique so autofocus will not work.');
              }
              else {
                  focus_elements[0].focus();
              }
          }
          display_element
              .querySelector("#jspsych-survey-html-form")
              .addEventListener("submit", (event) => {
              // don't submit form
              event.preventDefault();
              // measure response time
              var endTime = performance.now();
              var response_time = Math.round(endTime - startTime);
              var this_form = display_element.querySelector("#jspsych-survey-html-form");
              var question_data = serializeArray(this_form);
              if (!trial.dataAsArray) {
                  question_data = objectifyForm(question_data);
              }
              // save data
              var trialdata = {
                  rt: response_time,
                  response: question_data,
              };
              display_element.innerHTML = "";
              // next trial
              this.jsPsych.finishTrial(trialdata);
          });
          var startTime = performance.now();
          /**
           * Serialize all form data into an array
           * @copyright (c) 2018 Chris Ferdinandi, MIT License, https://gomakethings.com
           * @param  {Node}   form The form to serialize
           * @return {String}      The serialized form data
           */
          function serializeArray(form) {
              // Setup our serialized data
              var serialized = [];
              // Loop through each field in the form
              for (var i = 0; i < form.elements.length; i++) {
                  var field = form.elements[i];
                  // Don't serialize fields without a name, submits, buttons, file and reset inputs, and disabled fields
                  if (!field.name ||
                      field.disabled ||
                      field.type === "file" ||
                      field.type === "reset" ||
                      field.type === "submit" ||
                      field.type === "button")
                      continue;
                  // If a multi-select, get all selections
                  if (field.type === "select-multiple") {
                      for (var n = 0; n < field.options.length; n++) {
                          if (!field.options[n].selected)
                              continue;
                          serialized.push({
                              name: field.name,
                              value: field.options[n].value,
                          });
                      }
                  }
                  // Convert field data to a query string
                  else if ((field.type !== "checkbox" && field.type !== "radio") || field.checked) {
                      serialized.push({
                          name: field.name,
                          value: field.value,
                      });
                  }
              }
              return serialized;
          }
          // from https://stackoverflow.com/questions/1184624/convert-form-data-to-javascript-object-with-jquery
          function objectifyForm(formArray) {
              //serialize data function
              var returnArray = {};
              for (var i = 0; i < formArray.length; i++) {
                  returnArray[formArray[i]["name"]] = formArray[i]["value"];
              }
              return returnArray;
          }
      }
  }
  SurveyHtmlFormPlugin.info = info;

  return SurveyHtmlFormPlugin;

})(jsPsychModule);
