<!--
  ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements.  See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership.  The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License.  You may obtain a copy of the License at
  ~
  ~   http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied.  See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License.
  -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>Continuum</title>

  <link rel="stylesheet" type="text/css" href="continuum_files/tigris.css" media="screen">
  <link rel="stylesheet" type="text/css" href="continuum_files/print.css" media="print">

  <script src="continuum_files/tigris.js" type="text/javascript"></script></head>

<body onload="focus()" class="composite">

<div id="banner">
  <table border="1" cellpadding="8" cellspacing="0" width="100%">
    <tbody><tr>
      <td>
        <a href="http://www.apache.org/">
          Your company logo here
        </a>
      </td>
      <td>
        <a href="http://maven.apache.org/continuum">
          <img src="continuum_files/continuum_logo_75.gif" alt="Continuum" align="right" border="0">
        </a>
      </td>
    </tr>
    </tbody></table>
</div>

<div id="breadcrumbs">
  <div style="float: right">
    <a href="http://maven.apache.org/continuum">Continuum</a> |
    <a href="http://maven.apache.org/">Maven</a> |
    <a href="http://www.apache.org/">Apache</a>
  </div>

  <div>
    Logged in as: <b>Brett Porter</b> | <a href="userProfile.html">Profile</a> | <a href="login.html">Log out</a>
  </div>
</div>

<table id="main" border="0" cellpadding="4" cellspacing="0" width="100%">
<tbody><tr valign="top">
<td id="leftcol" width="30%">
  <div id="navcolum">
    <div id="projectmenu" class="toolgroup">
      <div class="label">Continuum</div>

      <div class="body">
        <div><a href="index.html">Show Projects</a></div>

        <div><a href="schedule.html">View Build Schedule</a></div>
      </div>
    </div>

    <div id="projecttools" class="toolgroup">
      <div class="label">Add Project</div>

      <div class="body">
        <div><a href="addMaven2Project.html">Maven 2.0+ Project</a></div>

        <div><a href="addMaven1Project.html">Maven 1.x Project</a></div>

        <div><a href="addAntProject.html">Ant Project</a></div>

        <div><a href="addShellProject.html">Shell Project</a></div>
      </div>
    </div>

    <div id="projectimport" class="toolgroup">
      <div class="label">Import Project</div>

      <div class="body">
        <div>
          <a href="addCruiseControlProject.html">CruiseControl</a>
        </div>
      </div>
    </div>

    <div style="margin-top: 5em; color: #555; border: 1px dashed black; padding: 1em;">
      <p>Notes:</p>
      <ul>
        <li>Note that only the administrator and user should be able to access this page</li>
        <li>Only the administrator should be able to edit the permissions</li>
        <li>Should permissions relate to POM roles? How can we really do that securely?</li>
        <li>Under roles, if user has rights to edit the role, then the edit list renders</li>
      </ul>
    </div>
  </div>
</td>
<td>
<div id="bodycol">
<div class="app">

<div id="axial" class="h3">
<h3>User Profile</h3>

<div class="axial">
  <table border="1" cellspacing="2" cellpadding="3" width="100%">

    <tr class="b">
      <th>Full Name</th>
      <td>Brett Porter</td>
    </tr>
    <tr class="b">
      <th>Email</th>
      <td>brett@apache.org</td>
    </tr>
  </table>
  <div class="functnbar3">
    <table>
      <tr>
        <td>
          <form method="post" action="editUser.html">

            <input type="hidden" name="action" value="cam"/>
            <input type="hidden" name="cid" value="checkoutProject"/>
            <input type="hidden" name="id" value="43"/>
            <input type="submit" name="edit-project" value="Edit"/>
          </form>
        </td>
      </tr>
    </table>
  </div>
</div>


<h3>Permissions</h3>
<table border="1" cellspacing="2" cellpadding="3" width="100%">
  <tr>

    <th>Permission</th>
    <th width="10%">&nbsp;</th>
  </tr>
  <tr class="b">
    <td>Administrator</td>
    <td><a href="#">Delete</a></td>
  </tr>
  <tr class="b">
    <td>Build Monkey</td>
    <td><a href="#">Delete</a></td>
  </tr>
</table>
<div class="functnbar3">
  <table>
    <tr>
      <td>
        <form method="post" action="#">

          <input type="hidden" name="action" value="cam"/>
          <input type="hidden" name="cid" value="checkoutProject"/>
          <input type="hidden" name="id" value="43"/>
          <select>
            <option>Administrator</option>
            <option>Build Monkey</option>
          </select>
          <input type="submit" name="add-developer" value="Add"/>
        </form>
      </td>
    </tr>
  </table>
</div>

<h3>Notification Addresses</h3>
<table border="1" cellspacing="2" cellpadding="3" width="100%">
  <tr>

    <th>Type</th>
    <th>Address</th>
    <th width="10%">&nbsp;</th>
  </tr>
  <tr class="b">
    <td>Mail</td>
    <td>brett@apache.org</td>
    <td>&nbsp;</td>
  </tr>
  <tr class="b">
    <td>Yahoo</td>
    <td>brettporter</td>
    <td><a href="addUserNotifier.html">Edit</a> | <a href="#">Delete</a></td>
  </tr>
  <tr class="b">
    <td>IRC</td>
    <td>irc.codehaus.org brett</td>
    <td><a href="addUserNotifier.html">Edit</a> | <a href="#">Delete</a></td>
  </tr>

</table>
<div class="functnbar3">
  <table>
    <tr>
      <td>
        <form method="post" action="addUserNotifier.html">

          <input type="hidden" name="action" value="cam"/>
          <input type="hidden" name="cid" value="checkoutProject"/>
          <input type="hidden" name="id" value="43"/>
          <input type="submit" name="add-notifier" value="Add"/>
        </form>
      </td>
    </tr>
  </table>
</div>

<h3>Assigned Roles</h3>
<table border="1" cellspacing="2" cellpadding="3" width="100%">
  <tr>

    <th>Project</th>
    <th>Role</th>
    <th>&nbsp;</td>
  </tr>
  <tr class="b">
    <td>Plexus</td>
    <td>admin<br/>user</td>
    <td><a href="editRoles.html">Edit</a></td>
  </tr>
  <tr class="b">
    <td>Maven</td>
    <td>admin<br/>user</td>   
    <td><a href="editRoles.html">Edit</a></td>
  </tr>
  <tr class="b">
    <td>Maven Plugins</td>
    <td>user</td>
    <td>&nbsp;</td>
  </tr>

</table>
<div class="functnbar3">
  <table>
    <tr>
      <td>
       
      </td>
    </tr>
  </table>
</div>

</div>
</div>
</div>
</td>
</tr>
</tbody></table>

<div id="footer">
  <table border="0" cellpadding="4" cellspacing="0">
    <tbody><tr>
      <td>
        Continuum &#169; 2005 Apache Software Foundation
      </td>
    </tr>
    </tbody></table>
</div>

</body></html>