muc-room-affiliations.jsp 19.5 KB
Newer Older
Gaston Dombiak's avatar
Gaston Dombiak committed
1 2 3 4
<%--
  -	$Revision$
  -	$Date$
  -
5
  - Copyright (C) 2004-2008 Jive Software. All rights reserved.
Gaston Dombiak's avatar
Gaston Dombiak committed
6
  -
7 8 9 10 11 12 13 14 15 16 17 18
  - Licensed 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.

Gaston Dombiak's avatar
Gaston Dombiak committed
19 20
--%>

21 22 23 24
<%@ page import="org.dom4j.Element,
                 org.jivesoftware.openfire.muc.ConflictException,
                 org.jivesoftware.openfire.muc.MUCRoom,
                 org.jivesoftware.openfire.muc.NotAllowedException,
25 26 27
                 org.jivesoftware.openfire.group.Group,
                 org.jivesoftware.openfire.group.GroupJID,
                 org.jivesoftware.openfire.group.GroupManager,
28
                 org.jivesoftware.util.ParamUtils,
Sven Tantau's avatar
Sven Tantau committed
29
                 org.jivesoftware.util.StringUtils,
30
                 org.xmpp.packet.IQ"
Gaston Dombiak's avatar
Gaston Dombiak committed
31 32
    errorPage="error.jsp"
%>
33 34
<%@ page import="org.xmpp.packet.JID" %>
<%@ page import="java.net.URLEncoder" %>
35
<%@ page import="java.net.URLDecoder" %>
36 37 38 39
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Collections" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
40
<%@ page import="org.jivesoftware.openfire.muc.CannotBeInvitedException" %>
Gaston Dombiak's avatar
Gaston Dombiak committed
41

42 43
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
44 45
<jsp:useBean id="webManager" class="org.jivesoftware.util.WebManager" />
<% webManager.init(request, response, session, application, out ); %>
Gaston Dombiak's avatar
Gaston Dombiak committed
46 47

<%  // Get parameters
48
    JID roomJID = new JID(ParamUtils.getParameter(request,"roomJID"));
Gaston Dombiak's avatar
Gaston Dombiak committed
49 50
    String affiliation = ParamUtils.getParameter(request,"affiliation");
    String userJID = ParamUtils.getParameter(request,"userJID");
51
    String roomName = roomJID.getNode();
52
    String[] groupNames = ParamUtils.getParameters(request, "groupNames");
Gaston Dombiak's avatar
Gaston Dombiak committed
53 54 55 56 57 58 59

    boolean add = request.getParameter("add") != null;
    boolean addsuccess = request.getParameter("addsuccess") != null;
    boolean deletesuccess = request.getParameter("deletesuccess") != null;
    boolean delete = ParamUtils.getBooleanParameter(request,"delete");

    // Load the room object
60
    MUCRoom room = webManager.getMultiUserChatManager().getMultiUserChatService(roomJID).getChatRoom(roomName);
Gaston Dombiak's avatar
Gaston Dombiak committed
61 62 63

    if (room == null) {
        // The requested room name does not exist so return to the list of the existing rooms
64
        response.sendRedirect("muc-room-summary.jsp?roomJID="+URLEncoder.encode(roomJID.toBareJID(), "UTF-8"));
Gaston Dombiak's avatar
Gaston Dombiak committed
65 66 67
        return;
    }

68
    Map<String,String> errors = new HashMap<String,String>();
Gaston Dombiak's avatar
Gaston Dombiak committed
69 70 71
    // Handle an add
    if (add) {
        // do validation
72
        if (userJID == null && groupNames == null) {
Gaston Dombiak's avatar
Gaston Dombiak committed
73 74 75 76 77
            errors.put("userJID","userJID");
        }

        if (errors.size() == 0) {
            try {
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
            	ArrayList<String> memberJIDs = new ArrayList<String>();
            	if (userJID != null) {
                    // Escape username
                    if (userJID.indexOf('@') == -1) {
                        String username = JID.escapeNode(userJID);
                        String domain = webManager.getXMPPServer().getServerInfo().getXMPPDomain();
                        userJID = username + '@' + domain;
                    }
                    else {
                        String username = JID.escapeNode(userJID.substring(0, userJID.indexOf('@')));
                        String rest = userJID.substring(userJID.indexOf('@'), userJID.length());
                        userJID = username + rest.trim();
                    }
                	memberJIDs.add(userJID);
            	}
            	if (groupNames != null) {
            		// create a group JID for each group
            		for (String groupName : groupNames) {
            			GroupJID groupJID = new GroupJID(URLDecoder.decode(groupName, "UTF-8"));
            			memberJIDs.add(groupJID.toString());
            		}
            	}
Gaston Dombiak's avatar
Gaston Dombiak committed
100
                IQ iq = new IQ(IQ.Type.set);
101
                Element frag = iq.setChildElement("query", "http://jabber.org/protocol/muc#admin");
102 103 104 105 106
            	for (String memberJID : memberJIDs){
                    Element item = frag.addElement("item");
                    item.addAttribute("affiliation", affiliation);
                    item.addAttribute("jid", memberJID);
            	}
107 108
                // Send the IQ packet that will modify the room's configuration
                room.getIQAdminHandler().handleIQ(iq, room.getRole());
109
                // Log the event
110 111 112
                for (String memberJID : memberJIDs) {
                	webManager.logEvent("set MUC affilation to "+affiliation+" for "+memberJID+" in "+roomName, null);
                }
Gaston Dombiak's avatar
Gaston Dombiak committed
113
                // done, return
114
                response.sendRedirect("muc-room-affiliations.jsp?addsuccess=true&roomJID="+URLEncoder.encode(roomJID.toBareJID(), "UTF-8"));
Gaston Dombiak's avatar
Gaston Dombiak committed
115 116 117 118 119 120 121 122
                return;
            }
            catch (ConflictException e) {
                errors.put("ConflictException","ConflictException");
            }
            catch (NotAllowedException e) {
                errors.put("NotAllowedException","NotAllowedException");
            }
123
            catch (CannotBeInvitedException e) {
124
                errors.put("CannotBeInvitedException", "CannotBeInvitedException");
125
            }
Gaston Dombiak's avatar
Gaston Dombiak committed
126 127 128 129 130 131 132 133 134 135 136 137
        }
    }

    if (delete) {
        // Remove the user from the allowed list
        IQ iq = new IQ(IQ.Type.set);
        Element frag = iq.setChildElement("query", "http://jabber.org/protocol/muc#admin");
        Element item = frag.addElement("item");
        item.addAttribute("affiliation", "none");
        item.addAttribute("jid", userJID);
        try {
        // Send the IQ packet that will modify the room's configuration
138
        room.getIQAdminHandler().handleIQ(iq, room.getRole());
Gaston Dombiak's avatar
Gaston Dombiak committed
139
        // done, return
140
        response.sendRedirect("muc-room-affiliations.jsp?deletesuccess=true&roomJID="+URLEncoder.encode(roomJID.toBareJID(), "UTF-8"));
Gaston Dombiak's avatar
Gaston Dombiak committed
141 142 143 144 145
        return;
        }
        catch (ConflictException e) {
            errors.put("ConflictException","ConflictException");
        }
146
        catch (CannotBeInvitedException e) {
147
                errors.put("CannotBeInvitedException", "CannotBeInvitedException");
148
        }
149
        userJID = null; // hide group/user JID
Gaston Dombiak's avatar
Gaston Dombiak committed
150 151 152
    }
%>

153 154 155 156
<html>
    <head>
        <title><fmt:message key="muc.room.affiliations.title"/></title>
        <meta name="subPageID" content="muc-room-affiliations"/>
157
        <meta name="extraParams" content="<%= "roomJID="+URLEncoder.encode(roomJID.toBareJID(), "UTF-8") %>"/>
158 159 160
        <meta name="helpPage" content="edit_group_chat_room_user_permissions.html"/>
    </head>
    <body>
Gaston Dombiak's avatar
Gaston Dombiak committed
161 162

<p>
163
<fmt:message key="muc.room.affiliations.info" />
164
<b><a href="muc-room-edit-form.jsp?roomJID=<%= URLEncoder.encode(room.getJID().toBareJID(), "UTF-8") %>"><%= room.getJID().toBareJID() %></a></b>.
165
<fmt:message key="muc.room.affiliations.info_detail" />
Gaston Dombiak's avatar
Gaston Dombiak committed
166 167 168 169 170 171 172
</p>

<%  if (errors.size() > 0) { %>

    <div class="jive-error">
    <table cellpadding="0" cellspacing="0" border="0">
    <tbody>
173
        <tr><td class="jive-icon"><img src="images/error-16x16.gif" width="16" height="16" border="0" alt=""></td>
Gaston Dombiak's avatar
Gaston Dombiak committed
174 175 176
        <td class="jive-icon-label">
        <%  if (errors.containsKey("ConflictException")) { %>

177
        <fmt:message key="muc.room.affiliations.error_removing_user" />
Gaston Dombiak's avatar
Gaston Dombiak committed
178 179 180

        <%  } else if (errors.containsKey("NotAllowedException")) { %>

181
        <fmt:message key="muc.room.affiliations.error_banning_user" />
Gaston Dombiak's avatar
Gaston Dombiak committed
182 183 184

        <%  } else { %>

185
        <fmt:message key="muc.room.affiliations.error_adding_user" />
Gaston Dombiak's avatar
Gaston Dombiak committed
186 187 188 189 190 191 192 193 194 195 196 197

        <%  } %>
        </td></tr>
    </tbody>
    </table>
    </div><br>

<%  } else if (addsuccess || deletesuccess) { %>

    <div class="jive-success">
    <table cellpadding="0" cellspacing="0" border="0">
    <tbody>
198
        <tr><td class="jive-icon"><img src="images/success-16x16.gif" width="16" height="16" border="0" alt=""></td>
Gaston Dombiak's avatar
Gaston Dombiak committed
199 200 201
        <td class="jive-icon-label">
        <%  if (addsuccess) { %>

202
            <fmt:message key="muc.room.affiliations.user_added" />
Gaston Dombiak's avatar
Gaston Dombiak committed
203 204 205

        <%  } else if (deletesuccess) { %>

206
            <fmt:message key="muc.room.affiliations.user_removed" />
Gaston Dombiak's avatar
Gaston Dombiak committed
207 208 209 210 211 212 213 214 215 216

        <%  } %>
        </td></tr>
    </tbody>
    </table>
    </div><br>

<%  } %>

<form action="muc-room-affiliations.jsp?add" method="post">
217
<input type="hidden" name="roomJID" value="<%= roomJID.toBareJID() %>">
Gaston Dombiak's avatar
Gaston Dombiak committed
218 219

<fieldset>
220
    <legend><fmt:message key="muc.room.affiliations.permission" /></legend>
Gaston Dombiak's avatar
Gaston Dombiak committed
221 222
    <div>
    <p>
223 224 225 226 227 228 229 230 231 232
    <label for="groupJIDs"><fmt:message key="muc.room.affiliations.add_group" /></label><br/>
	<select name="groupNames" size="6" multiple style="width:400px;font-family:verdana,arial,helvetica,sans-serif;font-size:8pt;" id="groupJIDs">
	<%  for (Group g : webManager.getGroupManager().getGroups()) {	%>
		<option value="<%= URLEncoder.encode(g.getName(), "UTF-8") %>"
		 <%= (StringUtils.contains(groupNames, g.getName()) ? "selected" : "") %>
		 ><%= StringUtils.escapeHTMLTags(g.getName()) %></option>
	<%  } %>
	</select>
	</p>
    <p>
233
    <label for="memberJID"><fmt:message key="muc.room.affiliations.add_jid" /></label>
234
    <input type="text" name="userJID" size="30" maxlength="255" value="<%= (userJID != null ? userJID : "") %>" id="memberJID">
Gaston Dombiak's avatar
Gaston Dombiak committed
235
    <select name="affiliation">
236 237 238 239
        <option value="owner"><fmt:message key="muc.room.affiliations.owner" /></option>
        <option value="admin"><fmt:message key="muc.room.affiliations.admin" /></option>
        <option value="member"><fmt:message key="muc.room.affiliations.member" /></option>
        <option value="outcast"><fmt:message key="muc.room.affiliations.outcast" /></option>
Gaston Dombiak's avatar
Gaston Dombiak committed
240
    </select>
241
    <input type="submit" value="<fmt:message key="global.add" />">
Gaston Dombiak's avatar
Gaston Dombiak committed
242 243 244 245 246 247
    </p>

    <div class="jive-table" style="width:400px;">
    <table cellpadding="0" cellspacing="0" border="0" width="100%">
    <thead>
        <tr>
248
            <th colspan="2"><fmt:message key="muc.room.affiliations.user" /></th>
249
            <th width="1%"><fmt:message key="global.delete" /></th>
Gaston Dombiak's avatar
Gaston Dombiak committed
250 251 252 253 254
        </tr>
    </thead>
    <tbody>
    <%-- Add owners section --%>
            <tr>
255
                <td colspan="2"><b><fmt:message key="muc.room.affiliations.room_owner" /></b></td>
Gaston Dombiak's avatar
Gaston Dombiak committed
256 257 258 259 260
                <td>&nbsp;</td>
            </tr>

        <%  if (room.getOwners().isEmpty()) { %>
            <tr>
261
                <td colspan="2" align="center"><i><fmt:message key="muc.room.affiliations.no_users" /></i></td>
Gaston Dombiak's avatar
Gaston Dombiak committed
262 263 264 265
                <td>&nbsp;</td>
            </tr>
        <%  }
            else {
266
                ArrayList<JID> owners = new ArrayList<JID>(room.getOwners());
Matt Tucker's avatar
Matt Tucker committed
267
                Collections.sort(owners);
268
                for (JID user : owners) {
269
                	boolean isGroup = GroupJID.isGroup(user);
270
                	String username = JID.unescapeNode(user.getNode());
271
                    String userDisplay = isGroup ? ((GroupJID)user).getGroupName() : username + '@' + user.getDomain();
Gaston Dombiak's avatar
Gaston Dombiak committed
272 273 274 275
        %>
            <tr>
                <td>&nbsp;</td>
                <td>
276 277 278 279 280 281 282
                  <% if (isGroup) { %>
                	<img src="images/group.gif" width="16" height="16" align="top" title="<fmt:message key="muc.room.affiliations.group" />" alt="<fmt:message key="muc.room.affiliations.group" />"/>
                  <% } else { %>
                	<img src="images/user.gif" width="16" height="16" align="top" title="<fmt:message key="muc.room.affiliations.user" />" alt="<fmt:message key="muc.room.affiliations.user" />"/>
                  <% } %>
                    <a href="<%= isGroup ? "group-edit.jsp?group=" + URLEncoder.encode(userDisplay) : "user-properties.jsp?username=" + URLEncoder.encode(user.getNode()) %>">
                    <%= StringUtils.escapeHTMLTags(userDisplay) %></a>
Gaston Dombiak's avatar
Gaston Dombiak committed
283 284
                </td>
                <td width="1%" align="center">
Sven Tantau's avatar
Sven Tantau committed
285
                    <a href="muc-room-affiliations.jsp?roomJID=<%= URLEncoder.encode(roomJID.toBareJID(), "UTF-8") %>&userJID=<%= URLEncoder.encode(user.toString()) %>&delete=true&affiliation=owner"
286
                     title="<fmt:message key="global.click_delete" />"
287
                     onclick="return confirm('<fmt:message key="muc.room.affiliations.confirm_removed" />');"
288
                     ><img src="images/delete-16x16.gif" width="16" height="16" border="0" alt=""></a>
Gaston Dombiak's avatar
Gaston Dombiak committed
289 290 291 292 293
                </td>
            </tr>
        <%  } } %>
    <%-- Add admins section --%>
            <tr>
294
                <td colspan="2"><b><fmt:message key="muc.room.affiliations.room_admin" /></b></td>
Gaston Dombiak's avatar
Gaston Dombiak committed
295 296 297 298 299
                <td>&nbsp;</td>
            </tr>

        <%  if (room.getAdmins().isEmpty()) { %>
            <tr>
300
                <td colspan="2" align="center"><i><fmt:message key="muc.room.affiliations.no_users" /></i></td>
Gaston Dombiak's avatar
Gaston Dombiak committed
301 302 303 304
                <td>&nbsp;</td>
            </tr>
        <%  }
            else {
305
                ArrayList<JID> admins = new ArrayList<JID>(room.getAdmins());
Matt Tucker's avatar
Matt Tucker committed
306
                Collections.sort(admins);
307
                for (JID user : admins) {
308
                	boolean isGroup = GroupJID.isGroup(user);
309
                	String username = JID.unescapeNode(user.getNode());
310
                    String userDisplay = isGroup ? ((GroupJID)user).getGroupName() : username + '@' + user.getDomain();
Gaston Dombiak's avatar
Gaston Dombiak committed
311 312 313 314
        %>
            <tr>
                <td>&nbsp;</td>
                <td>
315 316 317 318 319 320 321
                  <% if (isGroup) { %>
                	<img src="images/group.gif" width="16" height="16" align="top" title="<fmt:message key="muc.room.affiliations.group" />" alt="<fmt:message key="muc.room.affiliations.group" />"/>
                  <% } else { %>
                	<img src="images/user.gif" width="16" height="16" align="top" title="<fmt:message key="muc.room.affiliations.user" />" alt="<fmt:message key="muc.room.affiliations.user" />"/>
                  <% } %>
                    <a href="<%= isGroup ? "group-edit.jsp?group=" + URLEncoder.encode(userDisplay) : "user-properties.jsp?username=" + URLEncoder.encode(user.getNode()) %>">
                    <%= StringUtils.escapeHTMLTags(userDisplay) %></a>
Gaston Dombiak's avatar
Gaston Dombiak committed
322 323
                </td>
                <td width="1%" align="center">
Sven Tantau's avatar
Sven Tantau committed
324
                    <a href="muc-room-affiliations.jsp?roomJID=<%= URLEncoder.encode(roomJID.toBareJID(), "UTF-8") %>&userJID=<%= URLEncoder.encode(user.toString()) %>&delete=true&affiliation=admin"
325
                     title="<fmt:message key="global.click_delete" />"
326
                     onclick="return confirm('<fmt:message key="muc.room.affiliations.confirm_removed" />');"
327
                     ><img src="images/delete-16x16.gif" width="16" height="16" border="0" alt=""></a>
Gaston Dombiak's avatar
Gaston Dombiak committed
328 329 330 331 332
                </td>
            </tr>
        <%  } } %>
    <%-- Add members section --%>
            <tr>
333
                <td colspan="2"><b><fmt:message key="muc.room.affiliations.room_member" /></b></td>
Gaston Dombiak's avatar
Gaston Dombiak committed
334 335 336 337 338
                <td>&nbsp;</td>
            </tr>

        <%  if (room.getMembers().isEmpty()) { %>
            <tr>
339
                <td colspan="2" align="center"><i><fmt:message key="muc.room.affiliations.no_users" /></i></td>
Gaston Dombiak's avatar
Gaston Dombiak committed
340 341 342 343
                <td>&nbsp;</td>
            </tr>
        <%  }
            else {
344
                ArrayList<JID> members = new ArrayList<JID>(room.getMembers());
Matt Tucker's avatar
Matt Tucker committed
345
                Collections.sort(members);
346
                for (JID user : members) {
347
                	boolean isGroup = GroupJID.isGroup(user);
348
                	String username = JID.unescapeNode(user.getNode());
349
                    String userDisplay = isGroup ? ((GroupJID)user).getGroupName() : username + '@' + user.getDomain();
Gaston Dombiak's avatar
Gaston Dombiak committed
350 351 352 353 354 355
                    String nickname = room.getReservedNickname(user);
                    nickname = (nickname == null ? "" : " (" + nickname + ")");
        %>
            <tr>
                <td>&nbsp;</td>
                <td>
356 357 358 359 360 361 362
                  <% if (isGroup) { %>
                	<img src="images/group.gif" width="16" height="16" align="top" title="<fmt:message key="muc.room.affiliations.group" />" alt="<fmt:message key="muc.room.affiliations.group" />"/>
                  <% } else { %>
                	<img src="images/user.gif" width="16" height="16" align="top" title="<fmt:message key="muc.room.affiliations.user" />" alt="<fmt:message key="muc.room.affiliations.user" />"/>
                  <% } %>
                    <a href="<%= isGroup ? "group-edit.jsp?group=" + URLEncoder.encode(userDisplay) : "user-properties.jsp?username=" + URLEncoder.encode(user.getNode()) %>">
                    <%= StringUtils.escapeHTMLTags(userDisplay) %></a><%= StringUtils.escapeHTMLTags(nickname) %>
Gaston Dombiak's avatar
Gaston Dombiak committed
363 364
                </td>
                <td width="1%" align="center">
Sven Tantau's avatar
Sven Tantau committed
365
                    <a href="muc-room-affiliations.jsp?roomJID=<%= URLEncoder.encode(roomJID.toBareJID(), "UTF-8") %>&userJID=<%= URLEncoder.encode(user.toString()) %>&delete=true&affiliation=member"
366
                     title="<fmt:message key="global.click_delete" />"
367
                     onclick="return confirm('<fmt:message key="muc.room.affiliations.confirm_removed" />');"
368
                     ><img src="images/delete-16x16.gif" width="16" height="16" border="0" alt=""></a>
Gaston Dombiak's avatar
Gaston Dombiak committed
369 370 371 372 373
                </td>
            </tr>
        <%  } } %>
    <%-- Add outcasts section --%>
            <tr>
374
                <td colspan="2"><b><fmt:message key="muc.room.affiliations.room_outcast" /></b></td>
Gaston Dombiak's avatar
Gaston Dombiak committed
375 376 377 378 379
                <td>&nbsp;</td>
            </tr>

        <%  if (room.getOutcasts().isEmpty()) { %>
            <tr>
380
                <td colspan="2" align="center"><i><fmt:message key="muc.room.affiliations.no_users" /></i></td>
Gaston Dombiak's avatar
Gaston Dombiak committed
381 382 383 384
                <td>&nbsp;</td>
            </tr>
        <%  }
            else {
385
                ArrayList<JID> outcasts = new ArrayList<JID>(room.getOutcasts());
Matt Tucker's avatar
Matt Tucker committed
386
                Collections.sort(outcasts);
387
                for (JID user : outcasts) {
388
                	boolean isGroup = GroupJID.isGroup(user);
389
                	String username = JID.unescapeNode(user.getNode());
390
                    String userDisplay = isGroup ? ((GroupJID)user).getGroupName() : username + '@' + user.getDomain();
Gaston Dombiak's avatar
Gaston Dombiak committed
391 392 393 394
        %>
            <tr>
                <td>&nbsp;</td>
                <td>
395 396 397 398 399 400 401
                  <% if (isGroup) { %>
                	<img src="images/group.gif" width="16" height="16" align="top" title="<fmt:message key="muc.room.affiliations.group" />" alt="<fmt:message key="muc.room.affiliations.group" />"/>
                  <% } else { %>
                	<img src="images/user.gif" width="16" height="16" align="top" title="<fmt:message key="muc.room.affiliations.user" />" alt="<fmt:message key="muc.room.affiliations.user" />"/>
                  <% } %>
                    <a href="<%= isGroup ? "group-edit.jsp?group=" + URLEncoder.encode(userDisplay) : "user-properties.jsp?username=" + URLEncoder.encode(user.getNode()) %>">
                    <%= StringUtils.escapeHTMLTags(userDisplay) %></a>
Gaston Dombiak's avatar
Gaston Dombiak committed
402 403
                </td>
                <td width="1%" align="center">
Sven Tantau's avatar
Sven Tantau committed
404
                    <a href="muc-room-affiliations.jsp?roomJID=<%= URLEncoder.encode(roomJID.toBareJID(), "UTF-8") %>&userJID=<%= URLEncoder.encode(user.toString()) %>&delete=true&affiliation=outcast"
405
                     title="<fmt:message key="global.click_delete" />"
406
                     onclick="return confirm('<fmt:message key="muc.room.affiliations.confirm_removed" />');"
407
                     ><img src="images/delete-16x16.gif" width="16" height="16" border="0" alt=""></a>
Gaston Dombiak's avatar
Gaston Dombiak committed
408 409 410 411 412 413 414 415 416 417 418
                </td>
            </tr>
        <%  } } %>
    </tbody>
    </table>
    </div>
    </div>
</fieldset>

</form>

419
    </body>
420
</html>