protected void encodeMenuItem(FacesContext context, AbstractMenu menu, MenuItem menuitem)
      throws IOException {
    ResponseWriter writer = context.getResponseWriter();
    String title = menuitem.getTitle();
    String style = menuitem.getStyle();
    boolean disabled = menuitem.isDisabled();
    String rel = menuitem.getRel();

    writer.startElement("a", null);
    writer.writeAttribute("tabindex", "-1", null);
    if (shouldRenderId(menuitem)) {
      writer.writeAttribute("id", menuitem.getClientId(), null);
    }
    if (title != null) {
      writer.writeAttribute("title", title, null);
    }

    String styleClass = this.getLinkStyleClass(menuitem);
    if (disabled) {
      styleClass = styleClass + " ui-state-disabled";
    }

    writer.writeAttribute("class", styleClass, null);

    if (style != null) {
      writer.writeAttribute("style", style, null);
    }

    if (rel != null) {
      writer.writeAttribute("rel", rel, null);
    }

    if (disabled) {
      writer.writeAttribute("href", "#", null);
      writer.writeAttribute("onclick", "return false;", null);
    } else {
      setConfirmationScript(context, menuitem);
      String onclick = menuitem.getOnclick();

      // GET
      if (menuitem.getUrl() != null || menuitem.getOutcome() != null) {
        String targetURL = getTargetURL(context, (UIOutcomeTarget) menuitem);
        writer.writeAttribute("href", targetURL, null);

        if (menuitem.getTarget() != null) {
          writer.writeAttribute("target", menuitem.getTarget(), null);
        }
      }
      // POST
      else {
        writer.writeAttribute("href", "#", null);

        UIComponent form = ComponentTraversalUtils.closestForm(context, menu);
        if (form == null) {
          throw new FacesException("MenuItem must be inside a form element");
        }

        String command;
        if (menuitem.isDynamic()) {
          String menuClientId = menu.getClientId(context);
          Map<String, List<String>> params = menuitem.getParams();
          if (params == null) {
            params = new LinkedHashMap<String, List<String>>();
          }
          List<String> idParams = new ArrayList<String>();
          idParams.add(menuitem.getId());
          params.put(menuClientId + "_menuid", idParams);

          command =
              menuitem.isAjax()
                  ? buildAjaxRequest(context, menu, (AjaxSource) menuitem, form, params)
                  : buildNonAjaxRequest(context, menu, form, menuClientId, params, true);
        } else {
          command =
              menuitem.isAjax()
                  ? buildAjaxRequest(context, (AjaxSource) menuitem, form)
                  : buildNonAjaxRequest(
                      context,
                      ((UIComponent) menuitem),
                      form,
                      ((UIComponent) menuitem).getClientId(context),
                      true);
        }

        onclick = (onclick == null) ? command : onclick + ";" + command;
      }

      if (onclick != null) {
        if (menuitem.requiresConfirmation()) {
          writer.writeAttribute("data-pfconfirmcommand", onclick, null);
          writer.writeAttribute("onclick", menuitem.getConfirmationScript(), "onclick");
        } else {
          writer.writeAttribute("onclick", onclick, null);
        }
      }
    }

    encodeMenuItemContent(context, menu, menuitem);

    writer.endElement("a");
  }