<%--
Copyright 2004 The Apache Software Foundation
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.
--%>
<%@ page import="javax.portlet.WindowState"%>
<%@ taglib uri='http://java.sun.com/portlet' prefix='portlet'%>

<portlet:defineObjects/>

<TABLE style="font-size: -1">
<TR><TH colspan="2" style="background-color:blue;color:white;">MANUAL TEST</TH></TR>
<TR><TH></TH>
    <TH>Window State Test</TH></TR>
<TR><TD colspan="2">This test requires manual intervention
        to ensure that it passes.  Click on the links below
        and make sure that the specified state is displayed.</TD></TR>

<portlet:actionURL windowState="<%=WindowState.MAXIMIZED.toString()%>" secure="<%=renderRequest.isSecure()?"True":"False"%>" var="url">
	<portlet:param name="testId" value="<%=renderRequest.getParameter("testId")%>"/>
</portlet:actionURL>

<TR><TD style="font-size: 12px" valign="top"><A href="<%=url%>">Max</A></TD>
    <TD style="font-size: 10px;">The help mode provides help info.  Click to ensure that help info is
        displayed.</TD></TR>

<portlet:actionURL windowState="<%=WindowState.MINIMIZED.toString()%>" secure="<%=renderRequest.isSecure()?"True":"False"%>" var="url">
	<portlet:param name="testId" value="<%=renderRequest.getParameter("testId")%>"/>
</portlet:actionURL>

<TR><TD style="font-size: 12px" valign="top"><A href="<%=url%>">Min</A></TD>
    <TD style="font-size: 10px;">The edit mode allows you to edit preferences. Click to view all preferences
    currently stored in this portlet.</TD></TR>

<portlet:actionURL windowState="<%=WindowState.NORMAL.toString()%>" secure="<%=renderRequest.isSecure()?"True":"False"%>" var="url">
	<portlet:param name="testId" value="<%=renderRequest.getParameter("testId")%>"/>
</portlet:actionURL>

<TR><TD style="font-size: 12px" valign="top"><A href="<%=url%>">Nor</A></TD>
    <TD style="font-size: 10px;">You are currently looking at the view.  Verify that clicking on this link
    simply refreshes this page.</TD></TR>

</TABLE>

<%@ include file="navigation.inc" %>
