function render(_role, _roles) {
  HEADER_SET(ROOM_CODE, "Lynchburg", PLAYER_NAME + ":" + _role);

  //Set empty footer
  $("#footer").css("display", "none");

  if (submit_done) {
    _role = role_next;
  }

  if (_role in _roles) {
    renderRole(_roles[_role], _roles["idle"]);
    return;
  }

  if (_role === "idle") {
    //We have no role definitions yet, but the role is default idle
    var wait = $("<div></div>");
    wait.addClass("wait")
    wait.html(ERROR_WAIT);
    var loading = $("<div></div>");
    loading.addClass("lds-dual-ring");
    $("#game_content").append(wait);
    $("#game_content").append(loading);
    return;
  }

  //This is not good
  set_error(ERROR_RENDERTARGET);
}

function renderRole(_definition, _roleIdle) {
  if (_roleIdle && _definition !== _roleIdle) {
    var old_css_idle = $("#game_css_idle");

    if (old_css_idle) {
      old_css_idle.remove();
    }

    if ("css" in _roleIdle) {
      //Add idle css
      var css = $(
        "<style id='game_css_idle' type='text/css'>" +
          sanitizeCSS(_roleIdle["css"]) +
          "</style>"
      );
      $("#current_content").append(css);
    }
  }

  var old_css = $("#game_css");

  if (old_css) {
    old_css.remove();
  }

  if ("css" in _definition) {
    //Add additional css
    var css = $(
      "<style id='game_css' type='text/css'>" +
        sanitizeCSS(_definition["css"]) +
        "</style>"
    );
    $("#current_content").append(css);
  }

  var elements = _definition["elements"];

  $("#game_content").html("");

  var prompt = prompts[currentPrompt];

  for (var index in elements) {
    var element = elements[index];

    var type = element["type"];
    var c = element["class"];
    var name = element["name"];
    var label = element["label"] ? element["label"] : "";
    var value = element["value"] ? element["value"] : "";
    var length = element["length"];
    var required = element["required"];

    if(prompt) {
      var variables = prompt["variables"];
      var selections = prompt["selections"];

      if(variables) {
          for(var varname in variables) {
              while(value.indexOf("$"+varname) != -1 ){
                  value = value.replace("$"+varname, variables[varname]);
              }
          }
      }
    }

    var e;
    switch (type) {
      case "text":
        e = $("<span></span>");
        e.html(value);
        e.attr("name", name);
        e.addClass(c);
        break;
      case "input":
        var input = $(`<input class='game_input game_input_text' type='text'/>`);
        if(length) {
          input.attr("maxlength", length);
        }
        input.attr("placeholder", value);
        input.attr("name", name);
        if(required) {
            input.attr("required", "true")
        }
        input.addClass(c);
        if (!prompt) {
          input.attr("disabled", "true");
        }
        e = $(`<label><span class='label'>${label}</span> <span class='chars_left'>${length?length:''}</span></label>`);
        e = e.add(input);
        break;
      case "submit":
        e = $(
          "<input class='game_input btn btn-outline-primary' type='submit'/>"
        );
        e.val(value);
        e.attr("name", name);
        e.addClass(c);
        if (!prompt) {
          e.attr("disabled", "true");
        } else {
          e.click(function (o) {
            submit($(this));
          });
        }
        break;
        case "selection":
          e = $("<span></span>");
          if(selections && selections[name]) {
              for(select in selections[name]) {
                  var b = $("<input class='game_input' type='submit'/>");
                  b.val(selections[name][select]);
                  b.attr("name", name);
                  b.attr("selection", select);
                  b.addClass(c);
                  b.click(function(o){
                      submit($(this));
                  });
                  e.append(b);
              }
          }
          break;
      default:
        e = $("<span>Invalid Element</span>");
        e.attr("name", name);
        e.addClass(c);
        break;
    }

    var p = $("<p></p>").append(e);
    $("#game_content").append(p);

    //Wenn neue Zeichen in ein input eingetippt werden
    $('.game_input_text').keyup(function(){
      //Prüfe ob das eingetippte Zeich das Limit übersteigt -> falls ja, dann aktualisiere nicht
      var maxlength = $(this).attr("maxlength");
      if(this.value.length > maxlength){
        return false;
      }
      //Zähle die Anzeige übriger Zeichen herunter
      $(this).prev().children(".chars_left").html(maxlength-this.value.length)
    });
  }
}

function sanitizeCSS(_css) {
  return _css.replace(/</g, "");
}

function submit(_button) {
  var submit = {};
  var inputs = {};

  var input_fields = $("#game_content .game_input");

  for(index in input_fields) {
    var element = input_fields[index];
    if(!element.getAttribute) {
      continue;
    }
    switch (element.getAttribute("type")) {
      case "text":
        if(element.getAttribute("required") && element.value == "") {
          return;
        }
        break;
    }
  }

  $("#game_content .game_input").each(function (index, element) {
    element.setAttribute("disabled", "true");

    switch (element.getAttribute("type")) {
      case "text":
        inputs[element.getAttribute("name")] = element.value.replace(
          /[^\u0020\u00BF-\u1FFF\u2C00-\uD7FF\w]/g,
          ""
        );
        break;
    }
  });

  submit["submit"] = _button.attr("name");
    if(_button.attr("selection")) {
        submit["selection"] = parseInt(_button.attr("selection"));
    }
    submit["inputs"] = inputs;

  AJAX_JSON(URL_SUBMIT, submit, function (_code, _data) {
    switch (_code) {
      case 200:
        currentPrompt++;
      //Fall through:
      case 409:
        if (!prompts[currentPrompt]) {
          submit_done = true;
        }
        render(role, roles);
        break;
      case 401:
      case 410:
        content_reload();
        break;
      default:
        set_error(_data);
        break;
    }
  });
}