/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 * IBM Corporation - initial API and implementation
 * yyyymmdd bug      Email and other contact information
 * -------- -------- -----------------------------------------------------------
 * 20060222   127443 jesper@selskabet.org - Jesper S Moller
 *******************************************************************************/

package org.eclipse.wst.ws.internal.explorer.platform.util;

import java.util.Enumeration;
import java.util.Hashtable;
import javax.servlet.http.HttpServletResponse;

public final class HTMLUtils
{
  public static final String UTF8_ENCODING = "UTF-8";
  public static final String LINE_BREAK = "<br>";
  public static final String LINE_SEPARATOR = System.getProperties().getProperty("line.separator");

  /**
  * Get the HTML tag for an image.
  * @return String The HTML tag for this image.
  * @param HttpServletResponse To encode the src attribute.
  * @param String src attribute defining the path to the image file. This must include the context path.
  * @param String Optional alt text to be displayed with the image. Set this to null to disable the attribute.
  * @param String Optional width of the rendered image. Set this to null to disable the attribute.
  * @param String Optional height of the rendered imag. Set this to null to disable the attribute.
  * @param Hashtable Optional key-value pairs of additional strings to be added as-is to the tag. Set this to null to disable.
  * @return String The image tag.
  */
  public static final String getHTMLImageTag(HttpServletResponse response,String src,String alt,String width,String height,Hashtable additionalAttributes)
  {
    StringBuffer tag = new StringBuffer("<img src=\"");
    tag.append(response.encodeURL(src)).append('\"');
    if (alt != null)
    {
      tag.append(" alt=\"").append(alt).append('\"');
      tag.append(" title=\"").append(alt).append('\"');
    }
    if (width != null)
      tag.append(" width=").append(width);
    if (height != null)
      tag.append(" height=").append(height);
    tag.append(" border=0");
    if (additionalAttributes != null)
    {
      Enumeration keys = additionalAttributes.keys();
      while (keys.hasMoreElements())
      {
        String key = (String)keys.nextElement();
        tag.append(' ').append(key).append("=\"").append((String)additionalAttributes.get(key)).append('\"');
      }
    }
    tag.append('>');
    return tag.toString();
  }

  /**
  * Get the HTML tag for this link. The complete tag consists of the open tag <a> followed by a subelement and, finally, by an end tag </a>.
  * @return String The HTML tag of the link.
  * @param HttpServletResponse To encode the href attribute.
  * @param String The href attribute of the link. This must include the context path.
  * @param String target Optional target attribute for the link. Set this to null to disable the attribute.
  * @param String Optional name for the link. Set this to null to disable the attribute.
  * @param String The label which acts as the subelement. i.e. <a>label</a>.
  * @param Hashtable Optional key-value pairs of additional string attributes to be added as-is to the open tag. Set this to null to disable.
  */
  public static final String getHTMLLinkTag(HttpServletResponse response,String href,String target,String name,String label,Hashtable additionalAttributes)
  {
    StringBuffer tag = new StringBuffer("<a href=\"");
    tag.append(response.encodeURL(href)).append('\"');
    if (target != null)
      tag.append(" target=\"").append(target).append('\"');
    if (name != null)
      tag.append(" name=\"").append(name).append('\"');
    if (additionalAttributes != null)
    {
      Enumeration keys = additionalAttributes.keys();
      while (keys.hasMoreElements())
      {
        String key = (String)keys.nextElement();
        tag.append(' ').append(key).append("=\"").append((String)additionalAttributes.get(key)).append('\"');
      }
    }
    tag.append('>');
    tag.append(label);
    tag.append("</a>");
    return tag.toString();
  }

  /**
  * Get the HTML tag for a red asterist.
  * @return String The HTML tag for the red asterisk.
  */
  public static final String redAsterisk()
  {
    return "<font color=\"#ff0000\">*</font>";
  }

  /**
  * Get the Javascript mangled version of a given input String.
  * @return String The Javascript mangled String.
  */
  public static final String JSMangle(String input)
  {
    if (input == null)
      return "";

    StringBuffer mangledOutput = new StringBuffer();
    for (int i=0;i<input.length();i++)
    {
      char c = input.charAt(i);
      switch (c)
      {
        case '\n':
          mangledOutput.append("\\n");
          break;
        case '\r':
          mangledOutput.append("\\r");
          break;
        case '\\':
        case '\"':
        case '\'':
          mangledOutput.append('\\');
        default:
          mangledOutput.append(c);
      }
    }
    return mangledOutput.toString();
  }

  private static final String LESS_THAN = "<";
  private static final String LESS_THAN_HTML_ENTITY = "&lt;";
  private static final String GREATER_THAN = ">";
  private static final String GREATER_THAN_HTML_ENTITY = "&gt;";
  private static final String SPACE = " ";
  private static final String SPACE_HTML_ENTITY = "&nbsp;";
  private static final String AMPERSAND = "&";
  private static final String AMPERSAND_HTML_ENTITY = "&amp;";
  private static final String QUOTATION = "\"";
  private static final String QUOTATION_HTML_ENTITY = "&quot;";

  /**
  * Replace special characters with HTML entities representing these characters.
  * Note that this will also convert normal spaces into non-breaking spaces, which may be good for
  * presentation but not for editing.
  * 
  * @return String The converted String. Note: Order is important so that corrected entity references are not re-mangled.
  */
  public static final String charactersToHTMLEntities(String s) {
    s = stringReplace(s, AMPERSAND, AMPERSAND_HTML_ENTITY);
    s = stringReplace(s, LESS_THAN, LESS_THAN_HTML_ENTITY);
    s = stringReplace(s, GREATER_THAN, GREATER_THAN_HTML_ENTITY);
    s = stringReplace(s, SPACE, SPACE_HTML_ENTITY);
    s = stringReplace(s, QUOTATION, QUOTATION_HTML_ENTITY);
    return s;
  }

  /**
   * Replace special characters with HTML entities representing these characters
   * @return String The converted String. Note: Order is important so that corrected entity references are not re-mangled.
   */
   public static final String charactersToHTMLEntitiesStrict(String s) {
     s = stringReplace(s, AMPERSAND, AMPERSAND_HTML_ENTITY);
     s = stringReplace(s, LESS_THAN, LESS_THAN_HTML_ENTITY);
     s = stringReplace(s, GREATER_THAN, GREATER_THAN_HTML_ENTITY);
     s = stringReplace(s, QUOTATION, QUOTATION_HTML_ENTITY);
     return s;
   }

  /**
  * Replace HTML character entities with their associated characters.
  * @return String The converted String.
  */
  public static final String htmlEntitiesToCharacters(String s) {
    s = stringReplace(s, LESS_THAN_HTML_ENTITY, LESS_THAN);
    s = stringReplace(s, GREATER_THAN_HTML_ENTITY, GREATER_THAN);
    s = stringReplace(s, SPACE_HTML_ENTITY, SPACE);
    s = stringReplace(s, AMPERSAND_HTML_ENTITY, AMPERSAND);
    s = stringReplace(s, QUOTATION_HTML_ENTITY, QUOTATION);
    return s;
  }

  private static final String stringReplace(String s, String oldString, String newString) {
    String sCopy = s;
    int fromIndex = 0;
    int oldStringIndex = sCopy.indexOf(oldString, fromIndex);
    StringBuffer sb = new StringBuffer();
    while (oldStringIndex != -1) {
      sb.setLength(0);
      sb.append(sCopy.substring(0, oldStringIndex));
      sb.append(newString);
      sb.append(sCopy.substring(oldStringIndex + oldString.length(), sCopy.length()));
      sCopy = sb.toString();
      fromIndex = oldStringIndex + newString.length();
      oldStringIndex = sCopy.indexOf(oldString, fromIndex);
    }
    return sCopy;
  }
}
