/**
 * $Id: mxHtmlColor.java,v 1.4 2013/08/28 06:32:23 gaudenz Exp $
 * Copyright (c) 2007-2012, JGraph Ltd
 */
package com.mxgraph.util;

import java.awt.*;
import java.util.HashMap;

/**
 * Contains various helper methods for use with mxGraph.
 */
public class mxHtmlColor {

  /**
   * HTML color lookup table. Supports the 147 CSS color names.
   */
  protected static HashMap<String, Color> htmlColors = new HashMap<String, Color>();

  /**
   *
   */
  public static String hexString(Color color) {
    int r = color.getRed();
    int g = color.getGreen();
    int b = color.getBlue();

    return String.format("#%02X%02X%02X", r, g, b);
  }

  /**
   * Returns a hex representation for the given color.
   *
   * @param color Color to return the hex string for.
   * @return Returns a hex string for the given color.
   */
  public static String getHexColorString(Color color) {
    return Integer.toHexString((color.getRGB() & 0x00FFFFFF) | (color.getAlpha() << 24));
  }

  /**
   * Convert a string representing a 24/32bit hex color value into a Color
   * object. All 147 CSS color names and none are also supported. None returns
   * null.
   * Examples of possible hex color values are: #C3D9FF, #6482B9 and #774400,
   * but note that you do not include the "#" in the string passed in
   *
   * @param str the 24/32bit hex string value (ARGB)
   * @return java.awt.Color (24bit RGB on JDK 1.1, 24/32bit ARGB on JDK1.2)
   * @throws NumberFormatException if the specified string cannot be interpreted as a
   *                               hexidecimal integer
   */
  public static Color parseColor(String str) throws NumberFormatException {
    if (str == null || str.equals(mxConstants.NONE)) {
      return null;
    }
    else if (!str.startsWith("#")) {
      Color result = htmlColors.get(str);

      // LATER: Return the result even if it's null to avoid invalid color codes
      if (result != null) {
        return result;
      }
    }
    else if (str.length() == 4) {
      // Adds support for special short notation of hex colors, eg. #abc=#aabbcc
      str = new String(new char[]{'#', str.charAt(1), str.charAt(1), str.charAt(2), str.charAt(2), str.charAt(3), str.charAt(3)});
    }

    int value = 0;
    try {
      String tmp = str;

      if (tmp.startsWith("#")) {
        tmp = tmp.substring(1);
      }

      value = (int)Long.parseLong(tmp, 16);
    }
    catch (NumberFormatException nfe) {
      try {
        value = Long.decode(str).intValue();
      }
      catch (NumberFormatException e) {
        // ignores exception and returns black
      }
    }

    return new Color(value);
  }

  /**
   * Initializes HTML color table.
   */
  static {
    htmlColors.put("aliceblue", parseColor("#F0F8FF"));
    htmlColors.put("antiquewhite", parseColor("#FAEBD7"));
    htmlColors.put("aqua", parseColor("#00FFFF"));
    htmlColors.put("aquamarine", parseColor("#7FFFD4"));
    htmlColors.put("azure", parseColor("#F0FFFF"));
    htmlColors.put("beige", parseColor("#F5F5DC"));
    htmlColors.put("bisque", parseColor("#FFE4C4"));
    htmlColors.put("black", parseColor("#000000"));
    htmlColors.put("blanchedalmond", parseColor("#FFEBCD"));
    htmlColors.put("blue", parseColor("#0000FF"));
    htmlColors.put("blueviolet", parseColor("#8A2BE2"));
    htmlColors.put("brown", parseColor("#A52A2A"));
    htmlColors.put("burlywood", parseColor("#DEB887"));
    htmlColors.put("cadetblue", parseColor("#5F9EA0"));
    htmlColors.put("chartreuse", parseColor("#7FFF00"));
    htmlColors.put("chocolate", parseColor("#D2691E"));
    htmlColors.put("coral", parseColor("#FF7F50"));
    htmlColors.put("cornflowerblue", parseColor("#6495ED"));
    htmlColors.put("cornsilk", parseColor("#FFF8DC"));
    htmlColors.put("crimson", parseColor("#DC143C"));
    htmlColors.put("cyan", parseColor("#00FFFF"));
    htmlColors.put("darkblue", parseColor("#00008B"));
    htmlColors.put("darkcyan", parseColor("#008B8B"));
    htmlColors.put("darkgoldenrod", parseColor("#B8860B"));
    htmlColors.put("darkgray", parseColor("#A9A9A9"));
    htmlColors.put("darkgrey", parseColor("#A9A9A9"));
    htmlColors.put("darkgreen", parseColor("#006400"));
    htmlColors.put("darkkhaki", parseColor("#BDB76B"));
    htmlColors.put("darkmagenta", parseColor("#8B008B"));
    htmlColors.put("darkolivegreen", parseColor("#556B2F"));
    htmlColors.put("darkorange", parseColor("#FF8C00"));
    htmlColors.put("darkorchid", parseColor("#9932CC"));
    htmlColors.put("darkred", parseColor("#8B0000"));
    htmlColors.put("darksalmon", parseColor("#E9967A"));
    htmlColors.put("darkseagreen", parseColor("#8FBC8F"));
    htmlColors.put("darkslateblue", parseColor("#483D8B"));
    htmlColors.put("darkslategray", parseColor("#2F4F4F"));
    htmlColors.put("darkslategrey", parseColor("#2F4F4F"));
    htmlColors.put("darkturquoise", parseColor("#00CED1"));
    htmlColors.put("darkviolet", parseColor("#9400D3"));
    htmlColors.put("deeppink", parseColor("#FF1493"));
    htmlColors.put("deepskyblue", parseColor("#00BFFF"));
    htmlColors.put("dimgray", parseColor("#696969"));
    htmlColors.put("dimgrey", parseColor("#696969"));
    htmlColors.put("dodgerblue", parseColor("#1E90FF"));
    htmlColors.put("firebrick", parseColor("#B22222"));
    htmlColors.put("floralwhite", parseColor("#FFFAF0"));
    htmlColors.put("forestgreen", parseColor("#228B22"));
    htmlColors.put("fuchsia", parseColor("#FF00FF"));
    htmlColors.put("gainsboro", parseColor("#DCDCDC"));
    htmlColors.put("ghostwhite", parseColor("#F8F8FF"));
    htmlColors.put("gold", parseColor("#FFD700"));
    htmlColors.put("goldenrod", parseColor("#DAA520"));
    htmlColors.put("gray", parseColor("#808080"));
    htmlColors.put("grey", parseColor("#808080"));
    htmlColors.put("green", parseColor("#008000"));
    htmlColors.put("greenyellow", parseColor("#ADFF2F"));
    htmlColors.put("honeydew", parseColor("#F0FFF0"));
    htmlColors.put("hotpink", parseColor("#FF69B4"));
    htmlColors.put("indianred ", parseColor("#CD5C5C"));
    htmlColors.put("indigo ", parseColor("#4B0082"));
    htmlColors.put("ivory", parseColor("#FFFFF0"));
    htmlColors.put("khaki", parseColor("#F0E68C"));
    htmlColors.put("lavender", parseColor("#E6E6FA"));
    htmlColors.put("lavenderblush", parseColor("#FFF0F5"));
    htmlColors.put("lawngreen", parseColor("#7CFC00"));
    htmlColors.put("lemonchiffon", parseColor("#FFFACD"));
    htmlColors.put("lightblue", parseColor("#ADD8E6"));
    htmlColors.put("lightcoral", parseColor("#F08080"));
    htmlColors.put("lightcyan", parseColor("#E0FFFF"));
    htmlColors.put("lightgoldenrodyellow", parseColor("#FAFAD2"));
    htmlColors.put("lightgray", parseColor("#D3D3D3"));
    htmlColors.put("lightgrey", parseColor("#D3D3D3"));
    htmlColors.put("lightgreen", parseColor("#90EE90"));
    htmlColors.put("lightpink", parseColor("#FFB6C1"));
    htmlColors.put("lightsalmon", parseColor("#FFA07A"));
    htmlColors.put("lightseagreen", parseColor("#20B2AA"));
    htmlColors.put("lightskyblue", parseColor("#87CEFA"));
    htmlColors.put("lightslategray", parseColor("#778899"));
    htmlColors.put("lightslategrey", parseColor("#778899"));
    htmlColors.put("lightsteelblue", parseColor("#B0C4DE"));
    htmlColors.put("lightyellow", parseColor("#FFFFE0"));
    htmlColors.put("lime", parseColor("#00FF00"));
    htmlColors.put("limegreen", parseColor("#32CD32"));
    htmlColors.put("linen", parseColor("#FAF0E6"));
    htmlColors.put("magenta", parseColor("#FF00FF"));
    htmlColors.put("maroon", parseColor("#800000"));
    htmlColors.put("mediumaquamarine", parseColor("#66CDAA"));
    htmlColors.put("mediumblue", parseColor("#0000CD"));
    htmlColors.put("mediumorchid", parseColor("#BA55D3"));
    htmlColors.put("mediumpurple", parseColor("#9370DB"));
    htmlColors.put("mediumseagreen", parseColor("#3CB371"));
    htmlColors.put("mediumslateblue", parseColor("#7B68EE"));
    htmlColors.put("mediumspringgreen", parseColor("#00FA9A"));
    htmlColors.put("mediumturquoise", parseColor("#48D1CC"));
    htmlColors.put("mediumvioletred", parseColor("#C71585"));
    htmlColors.put("midnightblue", parseColor("#191970"));
    htmlColors.put("mintcream", parseColor("#F5FFFA"));
    htmlColors.put("mistyrose", parseColor("#FFE4E1"));
    htmlColors.put("moccasin", parseColor("#FFE4B5"));
    htmlColors.put("navajowhite", parseColor("#FFDEAD"));
    htmlColors.put("navy", parseColor("#000080"));
    htmlColors.put("oldlace", parseColor("#FDF5E6"));
    htmlColors.put("olive", parseColor("#808000"));
    htmlColors.put("olivedrab", parseColor("#6B8E23"));
    htmlColors.put("orange", parseColor("#FFA500"));
    htmlColors.put("orangered", parseColor("#FF4500"));
    htmlColors.put("orchid", parseColor("#DA70D6"));
    htmlColors.put("palegoldenrod", parseColor("#EEE8AA"));
    htmlColors.put("palegreen", parseColor("#98FB98"));
    htmlColors.put("paleturquoise", parseColor("#AFEEEE"));
    htmlColors.put("palevioletred", parseColor("#DB7093"));
    htmlColors.put("papayawhip", parseColor("#FFEFD5"));
    htmlColors.put("peachpuff", parseColor("#FFDAB9"));
    htmlColors.put("peru", parseColor("#CD853F"));
    htmlColors.put("pink", parseColor("#FFC0CB"));
    htmlColors.put("plum", parseColor("#DDA0DD"));
    htmlColors.put("powderblue", parseColor("#B0E0E6"));
    htmlColors.put("purple", parseColor("#800080"));
    htmlColors.put("red", parseColor("#FF0000"));
    htmlColors.put("rosybrown", parseColor("#BC8F8F"));
    htmlColors.put("royalblue", parseColor("#4169E1"));
    htmlColors.put("saddlebrown", parseColor("#8B4513"));
    htmlColors.put("salmon", parseColor("#FA8072"));
    htmlColors.put("sandybrown", parseColor("#F4A460"));
    htmlColors.put("seagreen", parseColor("#2E8B57"));
    htmlColors.put("seashell", parseColor("#FFF5EE"));
    htmlColors.put("sienna", parseColor("#A0522D"));
    htmlColors.put("silver", parseColor("#C0C0C0"));
    htmlColors.put("skyblue", parseColor("#87CEEB"));
    htmlColors.put("slateblue", parseColor("#6A5ACD"));
    htmlColors.put("slategray", parseColor("#708090"));
    htmlColors.put("slategrey", parseColor("#708090"));
    htmlColors.put("snow", parseColor("#FFFAFA"));
    htmlColors.put("springgreen", parseColor("#00FF7F"));
    htmlColors.put("steelblue", parseColor("#4682B4"));
    htmlColors.put("tan", parseColor("#D2B48C"));
    htmlColors.put("teal", parseColor("#008080"));
    htmlColors.put("thistle", parseColor("#D8BFD8"));
    htmlColors.put("tomato", parseColor("#FF6347"));
    htmlColors.put("turquoise", parseColor("#40E0D0"));
    htmlColors.put("violet", parseColor("#EE82EE"));
    htmlColors.put("wheat", parseColor("#F5DEB3"));
    htmlColors.put("white", parseColor("#FFFFFF"));
    htmlColors.put("whitesmoke", parseColor("#F5F5F5"));
    htmlColors.put("yellow", parseColor("#FFFF00"));
    htmlColors.put("yellowgreen", parseColor("#9ACD32"));
  }

}
