<%
/**
 *	$RCSfile: filters.jsp,v $
 *	$Revision: 1.1.1.1 $
 *	$Date: 2002/09/09 13:50:26 $
 */
%>

<%@ page import="java.beans.*,
                 java.util.*,
                 com.jivesoftware.util.*,
                 com.jivesoftware.forum.*,
                 com.jivesoftware.forum.util.*"
    errorPage="error.jsp"
%>

<%@ include file="include/global.jsp" %>

<%! // Global variables/methods for this page
    private boolean isInstalledFilter(FilterManager filterManager,
            ForumMessageFilter filter)
    {
        try {
            int filterCount = filterManager.getFilterCount();
            if (filter == null) {
                return false;
            }
            if (filterCount < 1) {
                return false;
            }
            String filterClassname = filter.getClass().getName();
            for (int i=0; i<filterCount; i++) {
                ForumMessageFilter installedFilter = filterManager.getFilter(i);
                if (filterClassname.equals(installedFilter.getClass().getName())) {
                    return true;
                }
            }
        } catch (Exception e) {}
        return false;
    }
    
    private String getHTML(ForumMessageFilter filter, PropertyDescriptor descriptor)
    {
        // HTML of the customizer for this property
        StringBuffer html = new StringBuffer(50);
        // Get the name of the property (this becomes the name of the form element)
        String propName = descriptor.getName();
        // Get the current value of the property
        Object propValue = null;
        try {
            propValue = descriptor.getReadMethod().invoke(filter,null);
        }
        catch (Exception e) {e.printStackTrace();}
        
        // Get the classname of this property
        String className = descriptor.getPropertyType().getName();
        
        // HTML form elements for number values (rendered as small textfields)
        if ("int".equals(className)
            || "double".equals(className)
            || "long".equals(className))
        {
            html.append("<input type=\"text\" name=\"").append(propName).append("\" size=\"6\" maxlength=\"10\"");
            if (propValue != null) {
                html.append(" value=\"").append(propValue.toString()).append("\"");
            }
            html.append(">");
        }
        // HTML form elements for boolean values (rendered as Yes/No radio buttons)
        else if ("boolean".equals(className)) {
            boolean value = false;
            if ("true".equals(propValue.toString())) {
                value = true;
            }
            html.append("<input type=\"radio\" name=\"").append(propName).append("\" id=\"rb").append(propName).append("1\" ");
            html.append("value=\"true\"");
            html.append((value)?" checked":"");
            html.append("> <label for=\"rb").append(propName).append("1\">Yes</label> ");
            html.append("<input type=\"radio\" name=\"").append(propName).append("\" id=\"rb").append(propName).append("2\" ");
            html.append("value=\"false\"");
            html.append((!value)?" checked":"");
            html.append("> <label for=\"rb").append(propName).append("2\">No</label> ");
        }
        // HTML elements for a String (rendered as a wide textfield)
        else if ("java.lang.String".equals(className)) {
            if (propName.toLowerCase().equals("password")) {
                html.append("<input type=\"password\"");
            }
            else {
                html.append("<input type=\"text\"");
            }
            html.append(" name=\"").append(propName).append("\" size=\"30\" maxlength=\"150\"");
            if (propValue != null) {
                html.append(" value=\"").append(escapeHTML(propValue.toString())).append("\"");
            }
            html.append(">");
        }
        if (html.length() == 0) {
            html.append("&nbsp;");
        }
        return html.toString();
    }
    
    private Map getFilterPropertyValues(HttpServletRequest request,
            FilterManager filterManager, ForumMessageFilter filter)
    {
        // Map of filter property name/value pairs
        Map map = new HashMap();
        try {
            // Property descriptors
            PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(filter.getClass());
            // Loop through the properties, get the value of the property as a
            // parameter from the HttpRequest object
            for (int i=0; i<descriptors.length; i++) {
                String propName = descriptors[i].getName();
                String propValue = ParamUtils.getParameter(request,propName);
                map.put(propName, propValue);
            }
        } catch (Exception e) {e.printStackTrace();}
        return map;
    }
    
    private String escapeHTML(String html) {
        html = StringUtils.replace(html, "\"", "&quot;");
        return StringUtils.escapeHTMLTags(html);
    }
%>

<%	// Get parameters
	long forumID = ParamUtils.getLongParameter(request,"forum",-1);
    String classname = ParamUtils.getParameter(request,"filters");
    boolean install = ParamUtils.getBooleanParameter(request,"install");
    boolean remove = ParamUtils.getBooleanParameter(request,"remove");
    int position = ParamUtils.getIntParameter(request,"pos",-1);
    boolean edit = ParamUtils.getBooleanParameter(request,"edit");
    boolean saveProperties = ParamUtils.getBooleanParameter(request,"saveProperties");
    int filterIndex = ParamUtils.getIntParameter(request,"filterIndex",-1);
    
    // Indicate if we're doing global filters
    boolean isGlobal = (forumID == -1L);
    
    // Load the forum
    Forum forum = null;
    if (forumID > 0L) {
        forum = forumFactory.getForum(forumID);
    }
    
    // Get the filter manager
    FilterManager filterManager = null;
    if (forum != null) {
        filterManager = forum.getFilterManager();
    }
    else {
        filterManager = forumFactory.getFilterManager();
    }
    
    if (saveProperties) {
        if (filterIndex >= 0) {
            // The filter we're working with
            ForumMessageFilter filter = filterManager.getFilter(filterIndex);
            // A map of name/value pairs. The names are the names of the bean
            // properties and the values come as parameters to this page
            Map properties = getFilterPropertyValues(request, filterManager, filter);
            // Set the properties
            BeanUtils.setProperties(filter, properties);
            // Save the filters
            filterManager.saveFilters();
            // Done, so redirect to this page
            response.sendRedirect("filters.jsp?forum=" + forumID);
            return;
        }
    }
    
    // Number of installed filters
    int filterCount = filterManager.getFilterCount();
    // All filter classes
    ForumMessageFilter[] filters = forumFactory.getAvailableFilters();
    
    if (install && classname != null) {
        try {
            ForumMessageFilter newFilter
                = (ForumMessageFilter)(Class.forName(classname)).newInstance();
            filterManager.addFilter(newFilter);
            String redirect = "filters.jsp";
            if (forumID > -1L) {
                redirect += "?forum=" + forumID;
            }
            response.sendRedirect(redirect);
            return;
        }
        catch (Exception e) {}
    }
    
    if (remove && position > -1) {
        filterManager.removeFilter(position);
        String redirect = "filters.jsp";
        if (forumID > -1L) {
            redirect += "?forum=" + forumID;
        }
        response.sendRedirect(redirect);
        return;
    }
%>

<%@ include file="include/header.jsp" %>

<%  // Title of this page and breadcrumbs
    String title = "";
    if (isGlobal) {
        title = "Global Message Filters";
    } else {
        title = "Message Filters";
    }
    
    String[][] breadcrumbs = null;
    if (isGlobal) {
        breadcrumbs = new String[][] {
            {"Main", "main.jsp"},
            {"Global Message Filters", "filters.jsp"}
        };
    }
    else {
        breadcrumbs = new String[][] {
            {"Main", "main.jsp"},
            {"Forums", "forums.jsp"},
            {"Edit Forum", "editForum.jsp?forum="+forumID},
            {"Message Filters", "filters.jsp?forum="+forumID}
        };
    }
%>
<%@ include file="include/title.jsp" %>

<font size="-1">
<%  if (isGlobal) { %>
    Filters dynamically reformat the contents of messages. Use the forms below to install and customize filters.
<%  } else { %>
    Filters dynamically reformat the contents of messages. Use the forms below to install and customize filters.
<%  } %>
</font>

<p>

<script language="JavaScript" type="text/javascript">
var filterInfo = new Array(
<%	for (int i=0; i<filters.length; i++) {
        BeanDescriptor descriptor = (Introspector.getBeanInfo(filters[i].getClass())).getBeanDescriptor();
%>
    new Array(
    "<%= descriptor.getBeanClass().getName() %>",
    "<%= descriptor.getValue("version") %>",
    "<%= descriptor.getValue("author") %>",
    "<%= descriptor.getShortDescription() %>"
    )
<%      if ((filters.length-i) > 1) { %>
		,
<%	    }
    }
%>
);
function properties(theForm) {
    var className = theForm.filters.options[theForm.filters.selectedIndex].value;
    var selected = 0;
    for (selected=0; selected<filterInfo.length; selected++) {
        if (filterInfo[selected][0] == className) {
            var version = filterInfo[selected][1];
            var author = filterInfo[selected][2];
            var description = filterInfo[selected][3];
            theForm.version.value = ((version=="null")?"":version);
            theForm.author.value = ((author=="null")?"":author);
            theForm.description.value = ((description=="null")?"":description);
            break;
        }
    }
}
</script>

<%  if (filterCount > 0) { %>
<font size="-1"><b>Current Filters</b></font>
<ul>
	<table bgcolor="<%= tableBorderColor %>" cellpadding="0" cellspacing="0" border="0">
    <tr><td>
	<table cellpadding="4" cellspacing="1" border="0" width="100%">
	<tr bgcolor="#eeeeee">
	<td align="center"><font size="-2" face="verdana"><b>ORDER</b></font></td>
	<td align="center"><font size="-2" face="verdana"><b>NAME</b></font></td>
	<td align="center"><font size="-2" face="verdana"><b>VERSION</b></font></td>
	<td align="center"><font size="-2" face="verdana"><b>DESCRIPTION</b></font></td>
	<td align="center"><font size="-2" face="verdana"><b>EDIT</b></font></td>
	<td align="center"><font size="-2" face="verdana"><b>DELETE</b></font></td>
    </tr>
<%  for (int i=0; i<filterCount; i++) {
        ForumMessageFilter filter = filterManager.getFilter(i);
        // descriptor for this filter
        BeanDescriptor descriptor = (Introspector.getBeanInfo(filter.getClass())).getBeanDescriptor();
        // properties for this filter
        PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(filter.getClass());
%>
    <tr bgcolor="#ffffff">
        <td><font size="-1"><%= (i+1) %></font></td>
        <td><font size="-1"><%= descriptor.getDisplayName() %></font></td>
        <td align="center"><font size="-1"><%= descriptor.getValue("version") %></font></td>
        <td><font size="-1"><%= descriptor.getShortDescription() %></font></td>
        <td align="center">
        <%  if (descriptors.length > 0) { %>
            <a href="filters.jsp?edit=true&forum=<%= forumID %>&pos=<%= i %>"
            ><img src="images/button_edit.gif" width="17" height="17" alt="Edit the properties of this filter" border="0"
            ></a>
        <%  } else { %>
            &nbsp;
        <%  } %>
        </td>
        <td align="center">
            <a href="filters.jsp?remove=true&forum=<%= forumID %>&pos=<%= i %>"
            ><img src="images/button_delete.gif" width="17" height="17" alt="Delete this filter" border="0"
            ></a>
        </td>
    </tr>
<%      if (position == i && edit) { %>
    <form action="filters.jsp">
    <input type="hidden" name="forum" value="<%= forumID %>">
    <input type="hidden" name="saveProperties" value="true">
    <input type="hidden" name="filterIndex" value="<%= i %>">
    <tr bgcolor="#ffffff">
        <td>&nbsp;</td>
        <td colspan="5">
            <table cellpadding="2" cellspacing="0" border="0" width="100%">
<%          int color = 0;
            for (int j=0; j<descriptors.length; j++) {
    %>
            <tr bgcolor=<%= (color++%2==0)?"#f4f5f7":"#ffffff" %>>    
                <td width="60%">
                <font size="-1"><%= descriptors[j].getDisplayName() %></font>
                <br>
                <font size="-2"><%= descriptors[j].getShortDescription() %></font>
                </td>
                <td width="20%">&nbsp;</td>
                <td width="20%" nowrap>
                    <font size="-1">
                    <%= getHTML(filter, descriptors[j]) %>
                    </font>
                </td>
            </tr>
<%          } %>
            <tr>    
                <td colspan="4" align="right">
                    <input type="submit" value="Save Properties">
                </td>
            </tr>
            </table>
        </td>
    </tr>
    </form>
<%      } %>
<%  }
%>
    </table>
    </td></tr>
    </table>
<%  } %>
</ul>
</form>

<p>

<form action="filters.jsp">
<input type="hidden" name="forum" value="<%= forumID %>">
<input type="hidden" name="install" value="true">
<font size="-1"><b>Install Filter</b></font>
<ul>
	<table bgcolor="<%= tableBorderColor %>" cellpadding="0" cellspacing="0" border="0">
    <tr><td>
	<table cellpadding="4" cellspacing="1" border="0" width="100%">
	<tr bgcolor="#eeeeee">
	<td align="center"><font size="-2" face="verdana"><b>AVAILABLE FILTERS</b></font></td>
    </tr>
	<tr bgcolor="#ffffff">
	<td>
        <table cellpadding="1" cellspacing="0" border="0">
        <tr>
            <td width="48%" valign="top">
            <select size="8" name="filters" onchange="properties(this.form);"">
<%  for (int i=0; i<filters.length; i++) {
        if (!isInstalledFilter(filterManager, filters[i])) {
            BeanDescriptor descriptor = (Introspector.getBeanInfo(filters[i].getClass())).getBeanDescriptor();
%>
            <option value="<%= descriptor.getBeanClass().getName() %>"><%= descriptor.getDisplayName() %>
<%      }
    }
%>
            </select>
            </td>
            <td width="2%"><img src="images/blank.gif" width="5" height="1" border="0"></td>
            <td width="48%" valign="top">
                <table cellpadding="2" cellspacing="0" border="0" width="100%">
                <tr>
                    <td><font size="-2">VERSION</font></td>
                    <td><input type="text" size="20" name="version" style="width:100%"></td>
                </tr>
                <tr>
                    <td><font size="-2">AUTHOR</font></td>
                    <td><input type="text" size="20" name="author" style="width:100%"></td>
                </tr>
                <tr>
                    <td valign="top"><font size="-2">DESCRIPTION</font></td>
                    <td><textarea name="description" cols="20" rows="5" wrap="virtual"></textarea></td>
                </tr>
                </table>
            </td>
        </tr>
        <tr>
            <td colspan="3" align="center">
            <input type="submit" value="Install...">
            </td>
        </tr>
        </table>
    </td>
    </tr>
    </table>
    </td></tr>
    </table>
</ul>
</form>

<p>

<%--
<font size="-1"><b>Add Filter</b></font>
<ul>

</ul>
</form>
--%>

<p>

<%--
<font size="-1"><b>Remove Filter</b></font>
<ul>

</ul>
</form>
--%>


</body>
</html>

