<%
/*
 * 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.
 */
%>

<html>

<head>
<%
	load("../head.esp"); 
	if (! request.getRequestParameter("noredirect") ) {
		response.sendRedirect(startPage)
	}
%>
	<title>Mail Archive Server</title>
</head>

<body>
	<div class="content">
		<h1>Welcome to the Mail Archive Server!</h1> <br>

		<dl>
		  <dt>Choose what you want to do:</dt> <br>
		  <dd><a href="<%= currentNode.getPath() %>/import.mbox.html">Import mbox file to the archive</a></dd> <br>
		  <dd><a href="<%= currentNode.getPath() %>/archive.html">Browse archive</a></dd> <br>
		  <dd><a href="<%= currentNode.getPath() %>/search.html">Search archive</a></dd> <br>
		</dl>
	</div>
</body>

</html>
