<table id="perm_defs" class="ifOpened">
 [if-any offer_edit_perms displayed_extra_perms]
  <tr><th colspan="2">Standard permissions</th></tr>
 [end]

 [include "people-detail-row-part.ezt" role_perms.View member_perms.View "View" "View issues"]
 [include "people-detail-row-part.ezt" role_perms.Commit member_perms.Commit "Commit" "Full project member"]

 [include "people-detail-row-part.ezt" role_perms.CreateIssue member_perms.CreateIssue "CreateIssue" "Enter a new issue"]
 [include "people-detail-row-part.ezt" role_perms.AddIssueComment member_perms.AddIssueComment "AddIssueComment" "Add a comment to an issue"]
 [include "people-detail-row-part.ezt" role_perms.EditIssue member_perms.EditIssue "EditIssue" "Edit any attribute of an issue"]
 [include "people-detail-row-part.ezt" role_perms.EditIssueOwner member_perms.EditIssueOwner "EditIssueOwner" "- Edit the owner of an issue"]
 [include "people-detail-row-part.ezt" role_perms.EditIssueSummary member_perms.EditIssueSummary "EditIssueSummary" "- Edit the summary of an issue"]
 [include "people-detail-row-part.ezt" role_perms.EditIssueStatus member_perms.EditIssueStatus "EditIssueStatus" "- Edit the status of an issue"]
 [include "people-detail-row-part.ezt" role_perms.EditIssueCc member_perms.EditIssueCc "EditIssueCc" "- Edit the CC list of an issue"]
 [include "people-detail-row-part.ezt" role_perms.DeleteIssue member_perms.DeleteIssue "DeleteIssue" "Delete/undelete an issue"]

 [include "people-detail-row-part.ezt" role_perms.DeleteAny member_perms.DeleteAny "DeleteAny" "Delete comments by anyone"]
 [include "people-detail-row-part.ezt" role_perms.EditAnyMemberNotes member_perms.EditAnyMemberNotes "EditAnyMemberNotes" "Edit anyone's member notes"]



 [if-any offer_edit_perms displayed_extra_perms]
  <tr><th colspan="2">Custom permissions</th></tr>
 [end]

 [if-any offer_edit_perms]
  <tr>
   <td id="displayed_extra_perms" colspan="2">
   <div style="width:12em">
    [for displayed_extra_perms]
        <input style="width:100%" name="extra_perms"
               value="[displayed_extra_perms]">
    [end]
     <input style="width:100%" name="extra_perms"
            id="first_extra_perms"
            value="" autocomplete="off">
   </div>
   </td>
  </tr>
 [else]
   [for displayed_extra_perms]
    <tr>
     <td>
      <input type="checkbox" checked="checked" disabled="disabled">
      [displayed_extra_perms]
     </td>
     <td></td>
    </tr>
   [end]
 [end]

</table>

<script type="text/javascript" nonce="[nonce]">
runOnLoad(function() {
  function _addInput(event) {
    if (event.target.value == "") {
      return;
    }
    var area = event.target.parentNode;
    var newInput = document.createElement("input");
    newInput.style.width = "100%";
    newInput.name = event.target.name;
    newInput.onfocus = function(e) {
        _acrob(null);
        _acof(e);
    };
    newInput.setAttribute("autocomplete", "off");
    newInput.addEventListener("keyup", _addInput);
    area.appendChild(newInput);
    area.appendChild(document.createElement("br"));

    // Make it only fire once.
    event.target.removeEventListener("keyup", _addInput);
  }

  if ($("first_extra_perms"))
    $("first_extra_perms").addEventListener("keyup", _addInput);
});
</script>
