/* AppletTag.java -- a representation of an HTML APPLET tag
   Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package gnu.classpath.tools.appletviewer;

import gnu.xml.dom.html2.DomHTMLAppletElement;
import gnu.xml.dom.html2.DomHTMLEmbedElement;
import gnu.xml.dom.html2.DomHTMLObjectElement;

import java.awt.Dimension;
import java.awt.Toolkit;

import java.io.File;

import java.net.MalformedURLException;
import java.net.URL;

import java.text.NumberFormat;
import java.text.ParseException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;

/**
 * @author Lillian Angel (langel@redhat.com)
 * @author Thomas Fitzsimmons (fitzsim@redhat.com)
 */
class AppletTag
{
  
  /**
   * The document base of this applet.
   */
  URL documentbase;
  
  /**
   * name of applet tag. 
   */
  String name = "";
  
  /**
   * code of applet tag.
   */
  String code = "";
  
  /**
   * codebase of applet tag.
   */
  String codebase = "";
  
  /**
   * The archives.
   */
  ArrayList archives = new ArrayList();
  
  /**
   * The parameters.
   */
  HashMap parameters = new HashMap();
    
  /**
   * The screen size.
   */
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

  /**
   * Default constructor.
   */
  AppletTag()
  {
    // Do nothing.
  }
  
  /**
   * Constructs an AppletTag and parses the given applet element.
   * 
   * @param appElement - the Applet element to parse.
   */
  AppletTag(DomHTMLAppletElement appElement)
  {    
    name = appElement.getName();
    parameters.put("name", name);

    parameters.put("object", appElement.getObject());
    parameters.put("align", appElement.getAlign());
    parameters.put("alt", appElement.getAlt());
    parameters.put("height", appElement.getHeight());
    parameters.put("hspace", Integer.toString(appElement.getHspace()));
    parameters.put("vspace", Integer.toString(appElement.getVspace()));
    parameters.put("width", appElement.getWidth());
    
    TagParser.parseParams(appElement, this);
    
    if (code.equals(""))
      {
        code = appElement.getCode();
        if (code.equals(""))
          code = appElement.getCls();
      }

    // Must initialize codebase before archives
    if (codebase.equals(""))
      {
        codebase = appElement.getCodeBase();
        if (codebase.equals(""))
          codebase = appElement.getSrc();
      }
    
    if (archives.size() == 0)
      {
        String arcs = "";
        String arch = appElement.getArchive();
        
        if (code.indexOf(".") < 0)
          arcs = code + ".jar";
        
        if (!arch.equals(""))
          arcs += "," + arch;
        
        if (!arcs.equals(""))
          archives = TagParser.parseArchives(arcs, this);
      }
  }
  
  /**
   * Constructs an AppletTag and parses the given embed element.
   * 
   * @param embElement - the Embed element to parse.
   */
  AppletTag(DomHTMLEmbedElement embElement)
  {
    // In an EMBED tag, a parameter is any non-standard attribute. This
    // is a problem for applets that take parameters named "code",
    // "codebase", "archive", "object", or "type". The solution is to
    // allow the same attributes, prefixed by "java_". The presence of
    // a "java_" attribute indicates that the non-prefixed attribute
    // should be interpreted as a parameter. For example if "java_code"
    // and "code" attributes are present in the EMBED tag then the
    // "code" attribute is interpreted as a parameter.
    
    name = embElement.getName();
    parameters.put("name", name);
    
    String jobj = embElement.getJavaObject();
    if (!jobj.equals(""))
      parameters.put("java_object", jobj);
    else
      parameters.put("object", embElement.getObject());

    parameters.put("width", embElement.getWidth());
    parameters.put("height", embElement.getHeight());
    parameters.put("align", embElement.getAlign());
    parameters.put("alt", embElement.getAlt());
    parameters.put("hspace", Integer.toString(embElement.getHspace()));
    parameters.put("mayscript", embElement.getMayscript());
    parameters.put("pluginspage", embElement.getPluginsPage());
    parameters.put("title", embElement.getTitle());
    parameters.put("type", embElement.getType());
    parameters.put("java_type", embElement.getJavaType());
    parameters.put("vspace", Integer.toString(embElement.getVspace()));
    
    TagParser.parseParams(embElement, this);

    // Must initialize codebase before archives
    if (codebase.equals(""))
      {
        String javacb = embElement.getJavaCodeBase();
        if (!javacb.equals(""))
          codebase = javacb;
        else
          codebase = embElement.getCodeBase();
      }

    if (code.equals(""))
      {
        String jcode = embElement.getJavaCode();
        if (!jcode.equals(""))
          code = jcode;
        else
          code = embElement.getCode(); 
      }
    
    if (archives.size() == 0)
      {
        String arcs = "";
        String jarch = embElement.getJavaArchive();
        String arch = embElement.getArchive();
        
        if (code.indexOf(".") < 0)
          arcs = code + ".jar";
        
        if (!jarch.equals(""))
          arcs += "," + jarch;
        else if (!arch.equals(""))
          arcs += "," + arch;
        
        if (!arcs.equals(""))
          archives = TagParser.parseArchives(arcs, this);
      }
  }

  /**
   * Constructs an AppletTag and parses the given object element.
   * 
   * @param objElement - the Object element to parse.
   */
  AppletTag(DomHTMLObjectElement objElement)
  {
    // In an OBJECT tag, a parameter is any non-standard attribute. This
    // is a problem for applets that take parameters named "code",
    // "codebase", "archive", "object", or "type". The solution is to
    // allow the same attributes, prefixed by "java_". The presence of
    // a "java_" attribute indicates that the non-prefixed attribute
    // should be interpreted as a parameter. For example if "java_code"
    // and "code" attributes are present in the OBJECT tag then the
    // "code" attribute is interpreted as a parameter.

    name = objElement.getName();
    parameters.put("name", name);

    String jobj = objElement.getJavaObject();
    if (!jobj.equals(""))
      parameters.put("java_object", jobj);
    else
      parameters.put("object", objElement.getObject());

    parameters.put("type", objElement.getType());
    parameters.put("java_type", objElement.getJavaType());
    parameters.put("align", objElement.getAlign());
    parameters.put("codetype", objElement.getCodeType());
    parameters.put("data", objElement.getData());
    parameters.put("declare", Boolean.toString(objElement.getDeclare()));
    parameters.put("height", objElement.getHeight());
    parameters.put("hspace", Integer.toString(objElement.getHspace()));
    parameters.put("border", objElement.getBorder());
    parameters.put("standby", objElement.getStandby());
    parameters.put("tabindex", Integer.toString(objElement.getTabIndex()));
    parameters.put("usemap", objElement.getUseMap());
    parameters.put("vspace", Integer.toString(objElement.getVspace()));
    parameters.put("width", objElement.getWidth());
    parameters.put("mayscript", objElement.getMayscript());
    parameters.put("scriptable", objElement.getScriptable());

    TagParser.parseParams(objElement, this);

    // Must initialize codebase before archives
    if (codebase.equals(""))
      {
        String javacb = objElement.getJavaCodeBase();
        if (! javacb.equals(""))
          codebase = javacb;
        else
          codebase = objElement.getCodeBase();
      }

    if (code.equals(""))
      {
        String jcode = objElement.getJavaCode();
        if (!jcode.equals(""))
          code = jcode;
        else
          code = objElement.getCode(); 
      }
    
    if (archives.size() == 0)
      {
        String arcs = "";
        String jarch = objElement.getJavaArchive();
        String arch = objElement.getArchive();
        
        if (code.indexOf(".") < 0)
          arcs = code + ".jar";
        
        if (!jarch.equals(""))
          arcs += "," + jarch;
        else if (!arch.equals(""))
          arcs += "," + arch;
        
        if (!arcs.equals(""))
          archives = TagParser.parseArchives(arcs, this);
      }
  }
  
  /**
   * String representation of the tag.
   * 
   * @return the string representation.
   */
  public String toString()
  {
    return ("  name=" + name + "\n" + "  code=" + code + "\n" + "  codebase="
            + codebase + "\n" + "  archive=" + archives + "\n" + "  parameters="
            + parameters + "\n" + "  documentbase=" + documentbase + "\n");
  }
  
  /**
   * Returns the size of the applet.
   * 
   * @return the size.
   */
  Dimension getSize()
  {
    Dimension size = new Dimension(320, 200);

    try
      {
        String widthStr = (String) parameters.get("width");
        
        if (widthStr != null && ! widthStr.equals(""))
          {
            if (widthStr.charAt(widthStr.length() - 1) == '%')
              {
                double p = NumberFormat.getPercentInstance(Locale.US).parse(widthStr).intValue() / 100.0;
                size.width = (int)(p * screenSize.width);
              }
            else
              size.width = NumberFormat.getInstance(Locale.US).parse(widthStr).intValue();
          }
      }
    catch (ParseException e)
      {
        // Use default.
      }

    try
      {
        String heightStr = (String) parameters.get("height");

        if (heightStr != null && !heightStr.equals(""))
          {
            if (heightStr.charAt(heightStr.length() - 1) == '%')
              {
                double p = NumberFormat.getPercentInstance(Locale.US).parse(heightStr).intValue() / 100.0;
                size.height = (int) (p * screenSize.height);
              }
            else
              size.height = NumberFormat.getInstance(Locale.US).parse(heightStr).intValue();
          }
      }
    catch (ParseException e)
      {
        // Use default.
      }

    return size;
  }
  
  /**
   * Gets the code base.
   *  
   * @return the codebase.
   */
  String getCodeBase()
  {
    return codebase;
  }
  
  /**
   * Gets the archive list.
   *  
   * @return the archive list.
   */
  ArrayList getArchives()
  {
    return archives;
  }
  
  /**
   * Gets the code.
   * 
   * @return the code.
   */
  String getCode()
  {
    return code;
  }
  
  /**
   * Gets the document base.
   *  
   * @return the document base.
   */
  URL getDocumentBase()
  {
    return documentbase;
  }
  
  /**
   * Gets the specified parameter.
   * 
   * @param name - the specified parameter.
   * @return the parameter.
   */
  String getParameter(String name)
  {
    return (String) parameters.get(name.toLowerCase());
  }
  
  /**
   * Prepends the base to the codebase.
   * 
   * @return the new URL.
   */
  URL prependCodeBase(String base) throws MalformedURLException
  {
    if (documentbase == null)
      documentbase = TagParser.db;
        
    URL fullcodebase;

    //If no codebase was specified, default to documentbase.
    if (codebase.equals(""))
      {
        if (documentbase.getFile().endsWith(File.separator))
          fullcodebase = documentbase;
        else
          {
            String dirname = documentbase.getFile();
            if (dirname.indexOf(".") < 0)
              fullcodebase = new URL(documentbase + File.separator);
            else
              {
                // Determine dirname for file by stripping everything
                // past the last file separator.
                dirname = dirname.substring(0,
                                            dirname.lastIndexOf(File.separatorChar) + 1);

                fullcodebase = new URL(documentbase.getProtocol(),
                                       documentbase.getHost(),
                                       documentbase.getPort(), dirname);
              }
          }
      }
    else
      {
        // codebase was specified.
        URL codebaseURL = new URL(documentbase, codebase);
        
        if ("file".equals(codebaseURL.getProtocol()))
          {
            if (new File(codebaseURL.getFile()).isDirectory() && !codebase.endsWith(File.separator))
              fullcodebase = new URL(documentbase, codebase + File.separator);
            else
              fullcodebase = new URL(documentbase, codebase);
          }
        else if (codebase.endsWith(File.separator))
          fullcodebase = new URL(documentbase, codebase);
        else
          fullcodebase = new URL(documentbase, codebase + File.separator);
      }
    
    return new URL(fullcodebase, base);
  }
}
