/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.converter;

import org.eclipse.jst.pagedesigner.IHTMLConstants;
import org.eclipse.jst.pagedesigner.utils.DOMUtil;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;

/**
 * This tag converter is for those unsupported jsp tags.
 * 
 * @author mengbo
 * @version 1.5
 */
public class DefaultUnknownTagConverter extends AbstractTagConverter {

	private static final int NO_ELEMENT = 0;
	private static final int TABLE_ELEMENT = 1;
	private static final int TABLE_ROW_ELEMENT = 2;

	/**
	 * @param host
	 * @param mode 
	 */
	public DefaultUnknownTagConverter(Element host, int  mode) {
		super(host);
        setMode(mode);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
	 */
	protected Element doConvertRefresh() {
		Element hostEle = this.getHostElement();

		// Test to see if the src element is contained in an
		// element that renders as a table. If so, render this
		// element accordingly as content in the table.
		// This is done to address the use case where tags
		// (such as JSTL) are used in collaboration within HTML
		// tables. The CSS layout for tables does not handle
		// invalid HTML so this change tries to produce valid
		// HTML. If the table layout code gets updated to handle
		// invalid HTML tables, then this code can be removed.
		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=253974
		Node containingElement = ConverterUtil.findAncestorTableElement(hostEle, null);
		String name = null;
		if (containingElement != null) {
			name = containingElement.getNodeName(); 
		}
		if (name != null) {
			if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(name)
					|| IHTMLConstants.TAG_TBODY.equalsIgnoreCase(name)
					|| IHTMLConstants.TAG_TFOOT.equalsIgnoreCase(name)) {
				// this element is contained in a table, tbody or tfoot
				return renderAsTableRow(hostEle, false, TABLE_ELEMENT);
			} else if (IHTMLConstants.TAG_THEAD.equalsIgnoreCase(name)) {
				// this element is contained in a thead
				return renderAsTableRow(hostEle, true, TABLE_ELEMENT);
			} else if (IHTMLConstants.TAG_TR.equalsIgnoreCase(name)) {
				// this element is contained in a tr
				return renderAsTableCell(hostEle, false, TABLE_ROW_ELEMENT);
			}
		}
		
		// Otherwise, use the default rendering for an unknown tag
		return renderDefault(hostEle, NO_ELEMENT);
	}

	private Element renderDefault(Element hostEle, int tableElement) {
		// rendering for host element not contained in a table
		Element divEle = createElement("div"); //$NON-NLS-1$
		String style = DOMUtil.getAttributeIgnoreCase(hostEle, "style"); //$NON-NLS-1$
		if (style == null) {
			style = ""; //$NON-NLS-1$
		}
		if (style.length() > 0 && !style.endsWith(";")) { //$NON-NLS-1$
			style += ";"; //$NON-NLS-1$
		}
		style += "border: none; padding: 0; margin: 0"; //$NON-NLS-1$
		divEle.setAttribute("style", style); //$NON-NLS-1$
		Element div2 = createElement("span"); //$NON-NLS-1$
        String border = isPreviewMode() ? "border-style: solid;border-width: 1px" : "border:none"; //$NON-NLS-1$ //$NON-NLS-2$
		div2.setAttribute("style", "background-color: white;"+border+";color:gray"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
		Text txt = createText(hostEle.getTagName());
		div2.appendChild(txt);

		divEle.appendChild(div2);

		Element childContainer = null;
		switch (tableElement) {
		case TABLE_ELEMENT:
			childContainer = createElement(IHTMLConstants.TAG_TABLE);
			copyChildren(getHostElement(), childContainer);
			break;
		case TABLE_ROW_ELEMENT:
			childContainer = createElement(IHTMLConstants.TAG_TABLE);
			Element trElem = createElement(IHTMLConstants.TAG_TR);
			childContainer.appendChild(trElem);
			copyChildren(getHostElement(), trElem);
			break;
		case NO_ELEMENT:
		default:
			childContainer = createElement("div"); //$NON-NLS-1$
			childContainer.setAttribute("style", "margin: 0; padding: 0"); //$NON-NLS-1$ //$NON-NLS-2$
			copyChildren(getHostElement(), childContainer);
			break;
		}

		divEle.appendChild(childContainer);

		return divEle;
	}

	/*
	 * Creates a table row, and adds either a table cell (data
	 * or a header depending on the boolean flag).
	 */
	private Element renderAsTableRow(Element hostEle, boolean isHeader, int tableElement) {
		Element trElem = createElement(IHTMLConstants.TAG_TR);
		Element tdElem = renderAsTableCell(hostEle, isHeader, tableElement);
		trElem.appendChild(tdElem);
		return trElem;
	}

	/*
	 * Creates a table cell, as either data or a header depending
	 * on the boolean flag.
	 */
	private Element renderAsTableCell(Element hostEle, boolean isHeader, int tableElement) {
		Element tdElem = null;
		if (isHeader) {
			tdElem = createElement(IHTMLConstants.TAG_TH);
		} else {
			tdElem = createElement(IHTMLConstants.TAG_TD);
		}
		tdElem.appendChild(renderDefault(hostEle, tableElement));
		return tdElem;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
	 */
	public boolean isMultiLevel() {
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
	 */
	public boolean isWidget() {
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
	 */
	public boolean needBorderDecorator() {
		return true;
	}
}
