/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.update.internal.ui.servlets;

import java.io.*;
import java.util.*;

import javax.servlet.http.*;

import org.eclipse.core.boot.*;
import org.eclipse.update.internal.ui.*;

/**
 */
public class ServletsUtil {

	public static String getServerInfo(HttpServletRequest servletRequest) {
		String host = servletRequest.getServerName();
		int port = servletRequest.getServerPort();
		String context = servletRequest.getContextPath();

		Enumeration atts = servletRequest.getParameterNames();
		StringBuffer buff = new StringBuffer();
		for (; atts.hasMoreElements();) {
			String attName = (String) atts.nextElement();
			Object attValue = servletRequest.getParameter(attName);
			buff.append(attName + "=" + "\"" + attValue + "\"+"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
		}
		return host + ":" + port + context + "?" + buff.toString(); //$NON-NLS-1$ //$NON-NLS-2$
	}

	public static PrintWriter createResponsePrologue(HttpServletResponse response)
		throws IOException {
		response.setContentType("text/html"); //$NON-NLS-1$
		PrintWriter writer = response.getWriter();
		String title = UpdateUI.getString("ServletsUtil.responseTitle"); //$NON-NLS-1$
		writer.println(
			"" //$NON-NLS-1$
				+ "<!DOCTYPE HTML PUBLIC \" -//W3C//DTD HTML 4.0 Transitional//EN\">" //$NON-NLS-1$
				+ "\n <HTML> \n <HEAD> \n" //$NON-NLS-1$
				+ "<TITLE>"+title+"</TITLE>\n" //$NON-NLS-1$ //$NON-NLS-2$
				+ "<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n" //$NON-NLS-1$
				+ "</HEAD>"); //$NON-NLS-1$
		writer.println(" <BODY topmargin=\"0\" leftmargin=\"0\">"); //$NON-NLS-1$
		return writer;
	}

	public static void createError(
		PrintWriter writer,
		String problem,
		String resolution) {
		createHeading(writer, UpdateUI.getString("ServletsUtil.updateFailed")); //$NON-NLS-1$
		startTextArea(writer);
		createParagraph(writer, UpdateUI.getString("ServletsUtil.problem"), problem); //$NON-NLS-1$
		if (resolution != null) {
			writer.println("<p>"); //$NON-NLS-1$
			createParagraph(writer, UpdateUI.getString("ServletsUtil.whatToDo"), resolution); //$NON-NLS-1$
		}
		endTextArea(writer);
	}

	public static void createParagraph(
		PrintWriter writer,
		String heading,
		String text) {
		writer.print("<b><font color=\"#5B78AC\">"); //$NON-NLS-1$
		writer.print(heading);
		writer.println("</b></font><br>"); //$NON-NLS-1$
		writer.println(text);
	}

	public static void createInfo(PrintWriter writer) {
		createHeading(writer, UpdateUI.getString("ServletsUtil.updateInProgress")); //$NON-NLS-1$
		startTextArea(writer);
		writer.println(
			UpdateUI.getString("ServletsUtil.updateInitiated")); //$NON-NLS-1$
		endTextArea(writer);
	}
	
	private static boolean isWin32() {
		return BootLoader.getWS().equals("win32"); //$NON-NLS-1$
	}

	private static void startTextArea(PrintWriter writer) {
		writer.println(
			"<table border=\"0\" width=\"100%\" cellspacing=\"5\" cellpadding=\"5\">"); //$NON-NLS-1$
		writer.println("<tr>"); //$NON-NLS-1$
		writer.print("<td width=\"100%\">"); //$NON-NLS-1$
		if (isWin32())
			writer.println("<font face=\"MS Sans Serif\" size=\"1\">"); //$NON-NLS-1$
		else
			writer.println(""); //$NON-NLS-1$
	}
	private static void endTextArea(PrintWriter writer) {
		if (isWin32())
			writer.println("</font>"); //$NON-NLS-1$
		writer.println("</td>"); //$NON-NLS-1$
		writer.println("</tr>"); //$NON-NLS-1$
		writer.println("</table>"); //$NON-NLS-1$
	}

	public static void createHeading(PrintWriter writer, String title) {
		writer.println(
			"<table cols=1 width=\"588\" cellspacing=\"0\" cellpadding=\"0\">"); //$NON-NLS-1$
		writer.println("<tr>"); //$NON-NLS-1$
		writer.println(
			"<td background=\"images/form_banner.jpg\" width=\"580\" height=\"30\">"); //$NON-NLS-1$
		writer.print("<p><b><font size=\"3\" face=\"Tahoma\">&nbsp;"); //$NON-NLS-1$
		writer.print(title);
		writer.println("</font></b></p>"); //$NON-NLS-1$
		writer.println("</td>"); //$NON-NLS-1$
		writer.println("</tr>"); //$NON-NLS-1$

		writer.println("<tr>"); //$NON-NLS-1$
		writer.println(
			"<td width=\"580\"><img border=\"0\" src=\"images/form_underline.jpg\" width=\"600\" height=\"15\"></td>"); //$NON-NLS-1$
		writer.println("</td>"); //$NON-NLS-1$
		writer.println("</tr>"); //$NON-NLS-1$
		writer.println("</table>"); //$NON-NLS-1$
	}

	public static void createResponseEpilogue(
		HttpServletRequest request,
		HttpServletResponse response,
		PrintWriter writer) {

		String backURL = getOriginatingURL(request);
		if (backURL != null) {
			startTextArea(writer);
			String backText = UpdateUI.getString("ServletsUtil.back"); //$NON-NLS-1$
			writer.print("<img border=\"0\" src=\"images/backward_nav.gif\"/><a href=\""); //$NON-NLS-1$
			writer.print(getOriginatingURL(request));
			writer.print("\">"+backText+"</a>"); //$NON-NLS-1$ //$NON-NLS-2$
			endTextArea(writer);
		}
		writer.println(" </BODY> "); //$NON-NLS-1$
		writer.println("</HTML>"); //$NON-NLS-1$
		writer.close();
	}
	private static String getOriginatingURL(HttpServletRequest request) {
		return request.getParameter("backURL"); //$NON-NLS-1$
	}
}