require(["AbilianWidget", "jquery"], function(Abilian, $) {
  "use strict";
  // multiple row widget
  function DynamicRowWidget(table, options) {
    var self = this;
    self.table = table;
    self.prefix = table.data("prefix");
    self.tbody = table.children("tbody");
    self.options = options;
    if (self.options == null) {
      self.options = "top";
    }
    self.currentIndex = table.find("> tbody > tr").length;
    self.table.addClass("dynamic-row-widget");
    self.addButton = $(
      '<th><span class="glyphicon glyphicon-plus"></span></th>'
    );
    self.addButton.css({ width: "1em" });
    self.addButton.click(function(e) {
      self.addRow();
      e.preventDefault();
    });

    self.minusButton = $(
      '<td><span class="glyphicon glyphicon-remove"></span></td>'
    );
    self.minusButton.click(function(e) {
      $(this)
        .closest("tr")
        .remove();
      e.preventDefault();
    });
    if (self.options.indexOf("top") > -1) {
      table.find("> thead > tr").append(self.addButton);
    }
    if (self.options.indexOf("bottom") > -1) {
      var bottom_addButton = self.addButton.clone();
      bottom_addButton.click(function(e) {
        self.addRow();
        e.preventDefault();
      });
      table.find("> tfoot > tr").append(bottom_addButton);
    }
    table.find("> tbody > tr").append(self.minusButton);

    self.templateRow = table.find("tbody > tr:first").clone(true, true);
    /* remove value except for specific controls that have constant (and
     * required) value
     */
    self.templateRow
      .find(
        "input" +
          '[type!="checkbox"]' +
          '[type!="radio"]' +
          '[data-short-name!="csrf_token"]'
      )
      .attr("value", "");
    self.templateRow.find("textarea").text("");
  }

  DynamicRowWidget.prototype = {
    addRow: function() {
      var self = this;
      var newRow = self.templateRow.clone(true, true);

      newRow.find("input").each(function() {
        var item = $(this);
        var shortName = item.data("shortName");
        var name = self.prefix + "-" + self.currentIndex;
        if (shortName) {
          name = name + "-" + shortName;
        }
        item.attr("name", name);
        item.attr("id", name);
      });
      newRow.find("select").each(function() {
        var item = $(this);
        var idSplitted = item.attr("id").split("-");

        for (var i = 0; i < idSplitted.length; i++) {
          if (!isNaN(idSplitted[i])) {
            idSplitted[i] = self.currentIndex;
          }
        }
        var name = idSplitted.join("-");
        item.attr("name", name);
        item.attr("id", name);
      });
      self.tbody.append(newRow);

      newRow
        .find(".js-widget")
        .data("cloned", true)
        .each(Abilian.initJsWidget);

      self.currentIndex += 1;
    },
  };

  function dynamicRowWidget(params) {
    var table = $(this);
    return new DynamicRowWidget(table, params);
  }

  Abilian.registerWidgetCreator("dynamicRowWidget", dynamicRowWidget);

  $.fn.dynamicRowWidget = function(options) {
    var defaults = {};
    var opts = $.extend(defaults, options);
    return this.each(function() {
      dynamicRowWidget.bind(this)(opts);
    });
  };
});
