Changeset 2079

Show
Ignore:
Timestamp:
02/26/09 22:58:56
Author:
johnsa
Message:

access form refactored, moved to common resources

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/deployment/resources/javascript/bedework/bedeworkAccess.js

    r2021 r2079  
    11/* Bedework Access control form functions 
    22 
    3    Bedework uses to methods to set access control.  The first and older method 
    4    is to send a single access control string per principal in one 
    5    request/response cycle.  The second and more current method (which is 
    6    required in the event form) is to build a javascript object representing 
    7    the acls on an item (e.g. an event), manipulate the object with the GUI, and send 
    8    all the acls in a single request parameter.  Both methods are currently used. 
    9    Method one is used for calendar access, method two for event access.  In time 
    10    we will probably move all access control to use method two. 
     3   Bedework sets access control by building a javascript object representing 
     4   the acls on an item (e.g. an event), manipulating the object with the GUI, and 
     5   sending all the acls in a single request parameter.  We would like to replace 
     6   this approach with wizards that ask the user what they want to do (and hide 
     7   the acls). 
    118 
    129/* ********************************************************************** 
     
    5249var otherStr = "other"; 
    5350var grantStr = "grant"; 
     51var denyStr = "deny" 
    5452var allStr = "all"; 
    5553 
    56 var deleteStr = "remove"; 
     54var bwAclWidgetDeleteStr = "remove"; 
     55var bwAclWidgetEntryStr = "Entry"; 
     56var bwAclWidgetAccessStr = "Access"; 
     57var bwAclWidgetInheritedStr = "Inherited from"; 
     58 
     59// note that resourcesRoot is passed in from the html head section defined in the xslt 
     60var trashIcon = '<img src="' + resourcesRoot  + '/resources/trashIcon.gif" width="13" height="13" border="0" alt="remove"/>'; 
     61var userIcon = '<img src="' + resourcesRoot  + '/resources/userIcon.gif" width="13" height="13" border="0" alt="user"/>'; 
     62var groupIcon = '<img src="' + resourcesRoot  + '/resources/groupIcon.gif" width="13" height="13" border="0" alt="group"/>'; 
    5763 
    5864// How granted accesses appear 
     
    106112/* We shouldn't use the word local - it probably doesn't mean too much and it might actually be 
    107113   inherited from something called /local for example */ 
    108 var inheritedStr = "Not inherited"; 
     114var inheritedStr = "not inherited"; 
    109115 
    110116// ************************** 
     
    176182  hv.push(new howVals("W", "apcbStysuN", "<D:write/>", howWriteVal, howDenyWriteVal)); 
    177183  hv.push(new howVals("a", "", "<D:write-acl/>", howWriteAclVal, howDenyWriteAclVal)); 
    178   hv.push(new howVals("p", "", "<D: write-properties/>", howWritePropertiesVal, howDenyWritePropertiesVal)); 
     184  hv.push(new howVals("p", "", "<D:write-properties/>", howWritePropertiesVal, howDenyWritePropertiesVal)); 
    179185  hv.push(new howVals("c", "", "<D:write-content/>", howWriteContentVal, howDenyWriteContentVal)); 
    180186 
     
    223229        formObj.howItem[i].disabled = true; 
    224230        // now iterate over corresponding radio buttons for each howItem 
    225         for (j = 0; j < formObj[formObj.howItem[i].value].length; j++) { 
    226           formObj[formObj.howItem[i].value][j].disabled = true; 
     231        for (j = 0; j < formObj[formObj.howItem[i].id].length; j++) { 
     232          formObj[formObj.howItem[i].id][j].disabled = true; 
    227233        } 
    228234      } else { 
     
    237243function toggleAllowDenyFlag(chkBoxObj,formObj) { 
    238244  if (chkBoxObj.checked == true) { 
    239     activateAllowDenyFlag(chkBoxObj.value, formObj, false); 
     245    activateAllowDenyFlag(chkBoxObj.id, formObj, false); 
    240246  } else { 
    241     activateAllowDenyFlag(chkBoxObj.value, formObj, true); 
     247    activateAllowDenyFlag(chkBoxObj.id, formObj, true); 
    242248  } 
    243249} 
     
    246252function activateAllowDenyFlag(val,formObj,disabledFlag) { 
    247253  for (i = 0; i < formObj[val].length; i++) { 
    248     formObj[val][i].disabled = disabledFlag; 
    249   } 
    250 
    251  
    252 // Gather up the how values on access form submission and set the how field 
    253 // (method 1) or return the value (method 2). 
     254    if (formObj[val][i].type == "radio") { //skip the checkbox with matching id 
     255      formObj[val][i].disabled = disabledFlag; 
     256    } 
     257  } 
     258
     259 
     260// Gather up the how values on access form submission and return the value. 
    254261// If in "basic" mode: 
    255262//   Set the value of how to the value of the basicHowItem radio button. 
     
    259266//   The allow/deny flag contains the final values to be returned with 
    260267//   the "-" switch if we set the value to deny (e.g. "A" or "-A", "R" or "-R"). 
    261 // Method: there are two methods used with this function; method one sets 
    262 //   the "how" field in the form used to update a single principal.  Method 
    263 //   two returns the assembled how string to the calling function. 
    264 function setAccessHow(formObj,method) { 
     268function setAccessHow(formObj) { 
    265269  var howString = ""; 
    266270  if (formObj.setappvar[0].checked == true) { // "basic" mode is selected 
     
    273277    for (i = 0; i < formObj.howItem.length; i++) { 
    274278      if (formObj.howItem[i].checked == true) { 
    275         var howItemVal = formObj.howItem[i].value; // get the howItem value and 
    276         for (j = 0; j < formObj[howItemVal].length; j++) { // look up the value from the corresponding allow/deny flag 
    277           if (formObj[howItemVal][j].checked == true) { 
    278             howString += formObj[howItemVal][j].value; 
     279        var howItemId = formObj.howItem[i].id; // get the howItem id and 
     280        for (j = 0; j < formObj[howItemId].length; j++) { // look up the value from the corresponding allow/deny flag 
     281          if ((formObj[howItemId][j].checked == true) && (formObj[howItemId][j].type == "radio")) { 
     282            howString += formObj[howItemId][j].value; 
    279283          } 
    280284        } 
     
    282286    } 
    283287  } 
    284   if (method == 2) { 
    285     return howString; 
    286   } else { 
    287     formObj.how.value = howString; 
    288   } 
     288  return howString; 
    289289} 
    290290 
     
    325325  this.format = function() { 
    326326    if (whoType == "user") { 
     327      return userIcon + " " + who; 
     328    } 
     329 
     330    if (whoType == "group") { 
     331      return groupIcon + " " + who; 
     332    } 
     333 
     334    if (whoType == "resource") { 
     335      return who; 
     336    } 
     337 
     338    if (whoType == "auth") { 
     339      return groupIcon + " " + authenticatedStr; 
     340    } 
     341 
     342    if (whoType == "unauth") { 
     343      return groupIcon + " " + unauthenticatedStr; 
     344    } 
     345 
     346    if (whoType == "owner") { 
     347      return userIcon + " " + ownerStr; 
     348    } 
     349 
     350    if (whoType == "other") { 
     351      return groupIcon + " " + otherStr; 
     352    } 
     353 
     354    if (whoType == "all") { 
     355      return groupIcon + " " + allStr; 
     356    } 
     357 
     358    return "***************" + whoType; 
     359  } 
     360 
     361  // format the who string for xml representation 
     362  this.formatXml = function() { 
     363    if (whoType == "user") { 
    327364      return who; 
    328365    } 
     
    360397 
    361398  this.toXml = function() { 
    362     var w = this.format(); 
     399    var w = this.formatXml(); 
    363400 
    364401    if (whoType == "other") { 
     
    390427 
    391428  this.equals = function(pr) { 
    392     //alert("this=" + this.toString() + " pr=" + pr.toString()); 
    393  
    394429    if (this.whoType != pr.whoType) { 
    395430      return false; 
    396431    } 
    397  
    398432    return this.who == pr.who; 
    399433  } 
    400434} 
    401435 
    402 /* METHOD TWO FUNCTIONS*/ 
    403 // Access Control Entry (ACE) object 
    404  
     436/* Access Control Entry (ACE) object 
     437 */ 
    405438function bwAce(who, whoType, how, inherited, invert) { 
    406439  this.principal = new bwPrincipal(who, whoType); 
     
    425458      var h = how[i]; 
    426459      var negated = false; 
     460      var grantDenyStr = grantStr; 
    427461      if (h == "-") { 
    428462        negated = true; 
     463        grantDenyStr = denyStr; 
    429464        i++; 
    430465        h = how[i]; 
    431466      } 
    432467 
    433       formattedHow += hows.getHows(h).getDispVal(negated) + " "; 
     468      formattedHow += '<span class="' + grantDenyStr + '">' + hows.getHows(h).getDispVal(negated) + '</span>'; 
     469      if (i != how.length-1) { 
     470        formattedHow += ', '; 
     471      } 
    434472    } 
    435473 
     
    505543  // row: current row in table 
    506544  // aceI: index of the ace 
    507   this.toFormRow = function(row, aceI) { 
    508     row.insertCell(0).appendChild(document.createTextNode(this.principal.format())); 
    509     row.insertCell(1).appendChild(document.createTextNode(this.formatHow())); 
     545  // id: id of widget output block in the html 
     546  this.toFormRow = function(row, aceI, id) { 
     547    var td_0 = row.insertCell(0); 
     548    td_0.innerHTML = this.principal.format(); 
     549    var td_1 = row.insertCell(1); 
     550    td_1.innerHTML = this.formatHow(); 
    510551    row.insertCell(2).appendChild(document.createTextNode(this.formatInherited())); 
    511552    var td_3 = row.insertCell(3); 
    512553    if (this.inherited == "") { 
    513       td_3.innerHTML = "<a href=\"javascript:bwAcl.deleteAce('" + aceI + "')\">" + deleteStr + "</a>"; 
     554      td_3.innerHTML = "<a href=\"javascript:bwAcl.deleteAce('" + aceI + "','" + id + "')\">" + trashIcon + " " + bwAclWidgetDeleteStr + "</a>"; 
    514555    } 
    515556  } 
     
    551592 
    552593  // Update the list - expects the browser form object 
    553   this.update = function(formObj) { 
     594  this.update = function(formObj,id) { 
    554595    // get the type of ace being set 
    555596    var type; 
     
    568609 
    569610    // get the how string from the form 
    570     var how = setAccessHow(formObj, 2); 
     611    var how = setAccessHow(formObj); 
    571612 
    572613    //alert("About to update who=" + formObj.who.value + 
     
    581622 
    582623    // redraw the display 
    583     this.display(); 
    584   } 
    585  
    586   this.deleteAce = function(index) { 
     624    this.display(id); 
     625  } 
     626 
     627  this.deleteAce = function(index,id) { 
    587628    var ace = aces[index]; 
    588629    var replace = false; 
     
    607648 
    608649    // redraw the display 
    609     this.display(); 
    610   } 
    611  
    612   // update the ACL table displayed on screen 
    613   this.display = function() { 
     650    this.display(id); 
     651  } 
     652 
     653  // build the ACL widget displayed on screen in the given id 
     654  this.display = function(id) { 
    614655    try { 
     656 
     657      var aclWidget = document.getElementById(id); 
     658      aclWidget.innerHTML = ""; 
     659 
     660      var bwCurrentAccess = document.createElement("table"); 
     661      bwCurrentAccess.className = "common scheduling"; 
     662      bwCurrentAccess.id = "bwCurrentAccess"; 
     663      bwCurrentAccess.createTHead(); 
     664      bwCurrAccessHead = bwCurrentAccess.tHead.insertRow(0); 
     665      bwCurrAccessHead.innerHTML = '<th>' + bwAclWidgetEntryStr + '</th>' +  '<th>' + bwAclWidgetAccessStr + '</th>' + '<th>' + bwAclWidgetInheritedStr + '</th><th></th>'; 
     666      var bwCurrAccessTBody = document.createElement("tbody"); 
     667      bwCurrentAccess.appendChild(bwCurrAccessTBody); 
     668 
     669      // finally, write the table back to the display 
     670      aclWidget.appendChild(bwCurrentAccess); 
     671 
    615672      // get the table body 
    616673      var aclTableBody = document.getElementById("bwCurrentAccess").tBodies[0]; 
    617674 
    618675      // remove existing rows 
    619       for (i = aclTableBody.rows.length - 1; i >= 0; i--) { 
    620         aclTableBody.deleteRow(i); 
    621      
    622  
    623       // recreate the table rows 
     676      //for (i = aclTableBody.rows.length - 1; i >= 0; i--) { 
     677      //  aclTableBody.deleteRow(i); 
     678      //
     679 
     680      // create the table rows 
    624681      for (var j = 0; j < aces.length; j++) { 
    625682        var curAce = aces[j]; 
    626683        var tr = aclTableBody.insertRow(j); 
    627684 
    628         curAce.toFormRow(tr, j); 
    629       } 
     685        curAce.toFormRow(tr, j, id); 
     686      } 
     687 
    630688    } catch (e) { 
    631689      alert(e); 
  • trunk/deployment/webuser/webapp/resources/demoskins/default/default/default.css

    r2074 r2079  
    17891789  padding: 0; 
    17901790} 
    1791 #bedework #shareFormTable td { 
     1791#bedework #accessFormTable td { 
    17921792  border: 1px solid #666; 
    17931793  padding: 0 0 0.5em 0; 
    17941794} 
    1795 #bedework #shareFormTable h5 { 
     1795#bedework #accessFormTable h5 { 
    17961796  background: #e5e5e5; 
    17971797  color: black; 
     
    17991799  padding: 4px; 
    18001800} 
    1801 #bedework #shareFormTable #accessRightsToggle { 
     1801#bedework #accessFormTable #accessRightsToggle { 
    18021802  float: right; 
    18031803  font-weight: normal; 
    18041804  font-size: 0.8em; 
    18051805} 
    1806 #bedework #shareFormTable .whoTypes { 
     1806#bedework #accessFormTable .whoTypes { 
    18071807  margin: 1em; 
    18081808} 
  • trunk/deployment/webuser/webapp/resources/demoskins/default/default/default.xsl

    r2078 r2079  
    5353  <xsl:include href="../../../bedework-common/default/default/messages.xsl"/> 
    5454  <xsl:include href="../../../bedework-common/default/default/util.xsl"/> 
     55  <xsl:include href="../../../bedework-common/default/default/entityAccessForm.xsl"/> 
    5556 
    5657  <!-- DEFINE GLOBAL CONSTANTS --> 
     
    404405    <xsl:if test="/bedework/page='modCalendar' or 
    405406                  /bedework/page='modSchedulingPrefs'"> 
    406       <script type="text/javascript" src="{$resourcesRoot}/resources/bedeworkAccess.js">&#160;</script> 
     407      <script type="text/javascript" src="/bedework-common/javascript/bedework/bedeworkAccess.js">&#160;</script> 
    407408      <!-- initialize calendar acls, if present --> 
    408409      <xsl:if test="/bedework/currentCalendar/acl/ace"> 
     
    449450      <script type="text/javascript" src="{$resourcesRoot}/resources/bedeworkEventForm.js">&#160;</script> 
    450451      <script type="text/javascript" src="{$resourcesRoot}/resources/bedeworkXProperties.js">&#160;</script> 
    451       <script type="text/javascript" src="{$resourcesRoot}/resources/bedeworkAccess.js">&#160;</script> 
     452      <script type="text/javascript" src="/bedework-common/javascript/bedework/bedeworkAccess.js">&#160;</script> 
    452453      <!-- initialize event acls, if present --> 
    453454      <xsl:if test="/bedework/editableAccess/access/acl/ace"> 
     
    49154916 
    49164917      <div id="sharingBox"> 
     4918        <h3>Current Access:</h3> 
    49174919        <div id="bwCurrentAccessWidget">&#160;</div> 
    49184920        <script type="text/javascript"> 
     
    77197721  </xsl:template> 
    77207722 
    7721   <xsl:template name="entityAccessForm"> 
    7722     <xsl:param name="type"/><!-- optional: currently used for inbox and outbox to conditionally display scheduling access --> 
    7723     <xsl:param name="acl"/><!-- required: nodeset of entity acls used to initialize javascript object. --> 
    7724     <xsl:param name="outputId"/><!-- required: id of the current access block display to update --> 
    7725  
    7726     <table cellpadding="0" id="shareFormTable" class="common"> 
    7727       <tr> 
    7728         <th colspan="2" class="commonHeader">Add:</th> 
    7729       </tr> 
    7730       <tr> 
    7731         <td> 
    7732           <h5>Who:</h5> 
    7733           <div class="whoTypes"> 
    7734             <input type="text" name="who" size="20"/><br/> 
    7735             <input type="radio" value="user" name="whoType" checked="checked"/> user 
    7736             <input type="radio" value="group" name="whoType"/> group 
    7737             <p>OR</p> 
    7738             <p> 
    7739               <input type="radio" value="owner" name="whoType"/> owner<br/> 
    7740               <input type="radio" value="auth" name="whoType"/> authenticated<br/> 
    7741               <input type="radio" value="unauth" name="whoType"/> unauthenticated<br/> 
    7742               <input type="radio" value="all" name="whoType"/> all users 
    7743             </p> 
    7744             <input type="button" name="updateACLs" value="add entry" onclick="bwAcl.update(this.form,'{$outputId}')"/> 
    7745           </div> 
    7746         </td> 
    7747         <td> 
    7748           <h5> 
    7749             <span id="accessRightsToggle"> 
    7750               <xsl:choose> 
    7751                 <xsl:when test="/bedework/appvar[key='accessRightsToggle']/value='advanced'"> 
    7752                   <input type="radio" name="setappvar" value="accessRightsToggle(basic)" onclick="changeClass('howList','visible');changeClass('howTable','invisible');"/>basic 
    7753                   <input type="radio" name="setappvar" value="accessRightsToggle(advanced)" checked="checked" onclick="changeClass('howList','invisible');changeClass('howTable','visible');"/>advanced 
    7754                 </xsl:when> 
    7755                 <xsl:otherwise> 
    7756                   <input type="radio" name="setappvar" value="accessRightsToggle(basic)" checked="checked" onclick="changeClass('howList','visible');changeClass('howTable','invisible');"/>basic 
    7757                   <input type="radio" name="setappvar" value="accessRightsToggle(advanced)" onclick="changeClass('howList','invisible');changeClass('howTable','visible');"/>advanced 
    7758                 </xsl:otherwise> 
    7759               </xsl:choose> 
    7760             </span> 
    7761             Rights: 
    7762           </h5> 
    7763           <input type="hidden" name="how" value="" id="bwCurrentHow"/> 
    7764           <!-- field 'acl' will receive xml for method 2 --> 
    7765           <input type="hidden" name="acl" value="" id="bwCurrentAcl" /> 
    7766           <!-- Advanced Access Rights: --> 
    7767           <!-- the "how" field is set by iterating over the howItems below --> 
    7768           <table id="howTable" class="invisible" cellspacing="0"> 
    7769             <xsl:if test="/bedework/appvar[key='accessRightsToggle']/value='advanced'"> 
    7770               <xsl:attribute name="class">visible</xsl:attribute> 
    7771             </xsl:if> 
    7772             <tr> 
    7773               <th>access type</th> 
    7774               <th>allow</th> 
    7775               <th>deny</th> 
    7776             </tr> 
    7777             <tr> 
    7778               <td class="level1"> 
    7779                 <input type="checkbox" value="A" id="accessAll" name="howItem" onclick="setupAccessForm(this, this.form); toggleAllowDenyFlag(this, this.form)"/>All 
    7780               </td> 
    7781               <td> 
    7782                 <input type="radio" value="A" name="accessAll" checked="checked" disabled="disabled"/> 
    7783               </td> 
    7784               <td> 
    7785                 <input type="radio" value="-A" name="accessAll" disabled="disabled"/> 
    7786               </td> 
    7787             </tr> 
    7788             <tr> 
    7789               <td class="level2"> 
    7790                 <input type="checkbox" value="R" id="accessRead" name="howItem" onclick="setupAccessForm(this, this.form); toggleAllowDenyFlag(this, this.form)" checked="checked"/> Read 
    7791               </td> 
    7792               <td> 
    7793                 <input type="radio" value="R" name="accessRead" checked="checked"/> 
    7794               </td> 
    7795               <td> 
    7796                 <input type="radio" value="-R" name="accessRead"/> 
    7797               </td> 
    7798             </tr> 
    7799             <tr> 
    7800               <td class="level3"> 
    7801                 <input type="checkbox" value="r" id="r" name="howItem" disabled="disabled" onclick="toggleAllowDenyFlag(this, this.form)"/> read ACL 
    7802               </td> 
    7803               <td> 
    7804                 <input type="radio" value="r" name="r" checked="checked" disabled="disabled"/> 
    7805               </td> 
    7806               <td> 
    7807                 <input type="radio" value="-r" name="r" disabled="disabled"/> 
    7808               </td> 
    7809             </tr> 
    7810             <tr> 
    7811               <td class="level3"> 
    7812                 <input type="checkbox" value="P" id="accessPriv" name="howItem" disabled="disabled" onclick="toggleAllowDenyFlag(this, this.form)"/> read current user privilege set 
    7813               </td> 
    7814               <td> 
    7815                 <input type="radio" value="P" name="accessPriv" checked="checked" disabled="disabled"/> 
    7816               </td> 
    7817               <td> 
    7818                 <input type="radio" value="-P" name="accessPriv" disabled="disabled"/> 
    7819               </td> 
    7820             </tr> 
    7821             <tr> 
    7822               <td class="level3"> 
    7823                 <input type="checkbox" value="F" id="F" name="howItem" disabled="disabled" onclick="toggleAllowDenyFlag(this, this.form)"/> read freebusy 
    7824               </td> 
    7825               <td> 
    7826                 <input type="radio" value="F" name="F" checked="checked" disabled="disabled"/> 
    7827               </td> 
    7828               <td> 
    7829                 <input type="radio" value="-F" name="F" disabled="disabled"/> 
    7830               </td> 
    7831             </tr> 
    7832             <tr> 
    7833               <td class="level2"> 
    7834                 <input type="checkbox" value="W" id="W" name="howItem" onclick="setupAccessForm(this, this.form); toggleAllowDenyFlag(this, this.form)"/> Write 
    7835               </td> 
    7836               <td> 
    7837                 <input type="radio" value="W" name="W" checked="checked" disabled="disabled"/> 
    7838               </td> 
    7839               <td> 
    7840                 <input type="radio" value="-W" name="W" disabled="disabled"/> 
    7841               </td> 
    7842             </tr> 
    7843             <tr> 
    7844               <td class="level3"> 
    7845                 <input type="checkbox" value="a" id="a" name="howItem" onclick="toggleAllowDenyFlag(this, this.form)"/> write ACL 
    7846               </td> 
    7847               <td> 
    7848                 <input type="radio" value="a" name="a" checked="checked" disabled="disabled"/> 
    7849               </td> 
    7850               <td> 
    7851                 <input type="radio" value="-a" name="a" disabled="disabled"/> 
    7852               </td> 
    7853             </tr> 
    7854             <tr> 
    7855               <td class="level3"> 
    7856                 <input type="checkbox" value="p" id="p" name="howItem" onclick="toggleAllowDenyFlag(this, this.form)"/> write properties 
    7857               </td> 
    7858               <td> 
    7859                 <input type="radio" value="p" name="p" checked="checked" disabled="disabled"/> 
    7860               </td> 
    7861               <td> 
    7862                 <input type="radio" value="-p" name="p" disabled="disabled"/> 
    7863               </td> 
    7864             </tr> 
    7865             <tr> 
    7866               <td class="level3"> 
    7867                 <input type="checkbox" value="c" id="c" name="howItem" onclick="toggleAllowDenyFlag(this, this.form)"/> write content 
    7868               </td> 
    7869               <td> 
    7870                 <input type="radio" value="c" name="c" checked="checked" disabled="disabled"/> 
    7871               </td> 
    7872               <td> 
    7873                 <input type="radio" value="-c" name="c" disabled="disabled"/> 
    7874               </td> 
    7875             </tr> 
    7876             <tr> 
    7877               <td class="level3"> 
    7878                 <input type="checkbox" value="b" id="b" name="howItem" onclick="setupAccessForm(this, this.form); toggleAllowDenyFlag(this, this.form)"/> create (bind) 
    7879               </td> 
    7880               <td> 
    7881                 <input type="radio" value="b" name="b" checked="checked" disabled="disabled"/> 
    7882               </td> 
    7883               <td> 
    7884                 <input type="radio" value="-b" name="b" disabled="disabled"/> 
    7885               </td> 
    7886             </tr> 
    7887             <xsl:if test="$type = 'inbox' or $type = 'outbox'"> 
    7888               <tr> 
    7889                 <td class="level4"> 
    7890                   <input type="checkbox" value="S" id="accessSchedule" name="howItem" onclick="setupAccessForm(this, this.form); toggleAllowDenyFlag(this, this.form)"/> schedule 
    7891                 </td> 
    7892               <td> 
    7893                 <input type="radio" value="S" name="accessSchedule" checked="checked" disabled="disabled"/> 
    7894               </td> 
    7895               <td> 
    7896                 <input type="radio" value="-S" name="accessSchedule" disabled="disabled"/> 
    7897               </td> 
    7898               </tr> 
    7899               <tr> 
    7900                 <td class="level5"> 
    7901                   <input type="checkbox" value="t" id="t" name="howItem" onclick="toggleAllowDenyFlag(this, this.form)"/> schedule request 
    7902                 </td> 
    7903               <td> 
    7904                 <input type="radio" value="t" name="t" checked="checked" disabled="disabled"/> 
    7905               </td> 
    7906               <td> 
    7907                 <input type="radio" value="-t" name="t" disabled="disabled"/> 
    7908               </td> 
    7909               </tr> 
    7910               <tr> 
    7911                 <td class="level5"> 
    7912                   <input type="checkbox" value="y" id="y" name="howItem" onclick="toggleAllowDenyFlag(this, this.form)"/> schedule reply 
    7913                 </td> 
    7914               <td> 
    7915                 <input type="radio" value="y" name="y" checked="checked" disabled="disabled"/> 
    7916               </td> 
    7917               <td> 
    7918                 <input type="radio" value="-y" name="y" disabled="disabled"/> 
    7919               </td> 
    7920               </tr> 
    7921               <tr> 
    7922                 <td class="level5"> 
    7923                   <input type="checkbox" value="s" id="s" name="howItem" onclick="toggleAllowDenyFlag(this, this.form)"/> schedule free-busy 
    7924                 </td> 
    7925               <td> 
    7926                 <input type="radio" value="s" name="s" checked="checked" disabled="disabled"/> 
    7927               </td> 
    7928               <td> 
    7929                 <input type="radio" value="-s" name="s" disabled="disabled"/> 
    7930               </td> 
    7931               </tr> 
    7932             </xsl:if> 
    7933             <tr> 
    7934               <td class="level3"> 
    7935                  <input type="checkbox" value="u" id="u" name="howItem" onclick="toggleAllowDenyFlag(this, this.form)"/> delete (unbind) 
    7936               </td> 
    7937               <td> 
    7938                 <input type="radio" value="u" name="u" checked="checked" disabled="disabled"/> 
    7939               </td> 
    7940               <td> 
    7941                 <input type="radio" value="-u" name="u" disabled="disabled"/> 
    7942               </td> 
    7943             </tr> 
    7944             <!--<tr> 
    7945               <td class="level1"> 
    7946                 <input type="checkbox" value="N" name="howItem" onclick="setupAccessForm(this, this.form)"/> None 
    7947               </td> 
    7948               <td> 
    7949               </td> 
    7950               <td> 
    7951               </td> 
    7952             </tr>--> 
    7953           </table> 
    7954           <!-- Simple Access Rights: --> 
    7955           <!-- the "how" field is set by getting the selected basicHowItem --> 
    7956           <ul id="howList"> 
    7957             <xsl:if test="/bedework/appvar[key='accessRightsToggle']/value='advanced'"> 
    7958               <xsl:attribute name="class">invisible</xsl:attribute> 
    7959             </xsl:if> 
    7960             <li> 
    7961               <input type="radio" value="A" name="basicHowItem"/>All 
    7962             </li> 
    7963             <li> 
    7964               <input type="radio" value="R" name="basicHowItem" checked="checked"/>Read only 
    7965             </li> 
    7966           </ul> 
    7967         </td> 
    7968       </tr> 
    7969     </table> 
    7970   </xsl:template> 
    7971  
    79727723  <xsl:template match="acl" mode="currentAccess"> 
    79737724    <h3>Current Access:</h3>