/*******************************************************************************
 * Copyright (c) 2004, 2016 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
 *******************************************************************************/
package org.eclipse.ui.internal.intro.impl.html;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;

/**
 * This class represents an HTML element. An HTML element has a name, a
 * collection of attributes, and content
 */
public class HTMLElement {

	// the name of the element
	private String elementName;

	// a collection of attributes that belong to this element (possibly empty)
	private Map<String, String> elementAttributes;

	// a collection of other HTMLElements or Strings contained inside this
	// element
	private Vector<Object> elementContent;

	public HTMLElement(String name) {
		this.elementName = name;
		this.elementAttributes = new HashMap<>();
		this.elementContent = new Vector<>();
	}

	public HTMLElement(String name, Map<String, String> attributes, Vector<Object> content) {
		this.elementName = name;
		this.elementAttributes = attributes;
		this.elementContent = content;
	}

	/**
	 * Add an attribute with the given name and value to this HTMLElement
	 *
	 * @param attributeName
	 * @param attributeValue
	 */
	public void addAttribute(String attributeName, String attributeValue) {
		if(attributeName != null && attributeValue != null)
			getElementAttributes().put(attributeName, attributeValue);
	}

	/**
	 * Add content to this element. The content should be in the form of
	 * another HTMLElement, or a String
	 */
	public void addContent(Object content) {
		getElementContent().add(content);
	}

	/**
	 * Get the attributes associated with this element
	 *
	 * @return Returns the elementAttributes.
	 */
	public Map<String, String> getElementAttributes() {
		if (elementAttributes == null)
			elementAttributes = new HashMap<>();

		return elementAttributes;
	}

	/**
	 * Set the attributes associated with this element
	 *
	 * @param elementAttributes
	 *            The elementAttributes to set.
	 */
	public void setElementAttributes(Map<String, String> elementAttributes) {
		this.elementAttributes = elementAttributes;
	}

	/**
	 * Get this element's content
	 *
	 * @return Returns the elementContent.
	 */
	public Vector<Object> getElementContent() {
		if (elementContent == null)
			elementContent = new Vector<>();

		return elementContent;
	}

	/**
	 * Set this element's content
	 *
	 * @param elementContent
	 *            The elementContent to set.
	 */
	public void setElementContent(Vector<Object> elementContent) {
		this.elementContent = elementContent;
	}

	/**
	 * Get the name of this element
	 *
	 * @return Returns the elementName.
	 */
	public String getElementName() {
		return elementName;
	}

	/**
	 * Set the name of this element
	 *
	 * @param elementName
	 *            The elementName to set.
	 */
	public void setElementName(String elementName) {
		this.elementName = elementName;
	}

	@Override
	public String toString() {
		StringBuffer element = new StringBuffer();

		// add the start tag and attributes
		element.append(
			HTMLUtil.createHTMLStartTag(
				getElementName(),
				getElementAttributes(),
				false));

		// include the element's content
		for (Iterator it = getElementContent().iterator(); it.hasNext();) {
			Object content = it.next();
			element.append(content);
		}

		// include an end tag
		element.append(HTMLUtil.createHTMLEndTag(getElementName(), false));
		return element.toString();
	}
}
