/*******************************************************************************
 * 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.jsf.ui.converter.jsfhtml;

import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
import org.eclipse.jst.pagedesigner.IHTMLConstants;
import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
import org.eclipse.jst.pagedesigner.jsf.ui.util.JSFUIPluginResourcesUtil;
import org.w3c.dom.Element;
import org.w3c.dom.Text;


/**
 * @author mengbo
 * @version 1.5
 * @deprecated Use DTTagConverter meta-data instead
 */
public class MessagesTagConverter extends AbstractTagConverter
{
    private static final String MESSAGE_CONTENT = JSFUIPluginResourcesUtil.getInstance().getString(
                                                        "MessageTagConverter.defaultValue"); //$NON-NLS-1$
    private static final String MESSAGE_TOOLTIP = JSFUIPluginResourcesUtil.getInstance().getString(
                                                        "MessageTagConverter.defaultTooltip"); //$NON-NLS-1$

    /**
     * @param host
     */
    public MessagesTagConverter(Element host)
    {
        super(host);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
     */
    protected Element doConvertRefresh()
    {
        Element hostEle = getHostElement();
        String layout = hostEle.getAttribute(IJSFConstants.ATTR_LAYOUT);
        if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(layout))
        {
            Element table = createElement(IHTMLConstants.TAG_TABLE);
            table.setAttribute(IHTMLConstants.ATTR_BORDER, "1"); //$NON-NLS-1$
            for (int i = 0; i < 2; i++)
            {
                Element tr = createElement(IHTMLConstants.TAG_TR);
                Element td = createElement(IHTMLConstants.TAG_TD);
                Element span = createSpan();
                td.appendChild(span);
                tr.appendChild(td);
                table.appendChild(tr);
            }
            return table;
        }
        Element ul = createElement(IHTMLConstants.TAG_UL);
        for (int i = 0; i < 2; i++)
        {
            Element li = createElement(IHTMLConstants.TAG_LI);
            Element span = createSpan();
            li.appendChild(span);
            ul.appendChild(li);
        }
        return ul;
    }

    /* (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 true;
    }

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

    private Element createSpan()
    {
        Element hostEle = getHostElement();

        // If the "styleClass" or "style" attributes are present, 
        // render a "span" element. 
        // XXX: to make things simpler, we always create a span
        Element spanEle = createElement(IHTMLConstants.TAG_SPAN);

        // If the "style" attribute is present, pass it thru.
        // XXX: we are passing all the attributes through, since other attribute
        // don't conflict with html attributes.
        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);

        // If the "styleClass" attribute is present, 
        // output the value of the "styleClass" attribute as the value of the "class" attribute on the "span" element
        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);

        String fatalStyle = hostEle.getAttribute(IJSFConstants.ATTR_FATALSTYLE);
        String errorStyle = hostEle.getAttribute(IJSFConstants.ATTR_ERRORSTYLE);
        String warnStyle = hostEle.getAttribute(IJSFConstants.ATTR_WARNSTYLE);
        String infoStyle = hostEle.getAttribute(IJSFConstants.ATTR_INFOSTYLE);
        String fatalClass = hostEle.getAttribute(IJSFConstants.ATTR_FATALCLASS);
        String errorClass = hostEle.getAttribute(IJSFConstants.ATTR_ERRORCLASS);
        String warnClass = hostEle.getAttribute(IJSFConstants.ATTR_WARNCLASS);
        String infoClass = hostEle.getAttribute(IJSFConstants.ATTR_INFOCLASS);

        if ((!"".equals(fatalStyle)) && (fatalStyle != null)) //$NON-NLS-1$
        {
            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, fatalStyle);
        }
        else if ((!"".equals(errorStyle)) && (errorStyle != null)) //$NON-NLS-1$
        {
            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, errorStyle);
        }
        else if ((!"".equals(warnStyle)) && (warnStyle != null)) //$NON-NLS-1$
        {
            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, warnStyle);
        }
        else if ((!"".equals(infoStyle)) && (infoStyle != null)) //$NON-NLS-1$
        {
            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, infoStyle);
        }

        if ((!"".equals(fatalClass)) && (fatalClass != null)) //$NON-NLS-1$
        {
            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, fatalClass);
        }
        else if ((!"".equals(errorClass)) && (errorClass != null)) //$NON-NLS-1$
        {
            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, errorClass);
        }
        else if ((!"".equals(warnClass)) && (warnClass != null)) //$NON-NLS-1$
        {
            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, warnClass);
        }
        else if ((!"".equals(infoClass)) && (infoClass != null)) //$NON-NLS-1$
        {
            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, infoClass);
        }

        //If the "tooltip" attribute is present with the value of "true", and so does 
        //the "showSummary",then output the "summary" as the value of the "title" attribute on the "span". 
        String hasToolTip = hostEle.getAttribute(IJSFConstants.ATTR_TOOLTIP);
        String showSummary = hostEle.getAttribute(IJSFConstants.ATTR_SHOWSUMMARY);
        if ("true".equalsIgnoreCase(hasToolTip)) //$NON-NLS-1$
        {
            if ("true".equalsIgnoreCase(showSummary)) //$NON-NLS-1$
            {
                spanEle.setAttribute(IHTMLConstants.ATTR_TITLE, MESSAGE_TOOLTIP);
            }
        }
        Text text = createText(MESSAGE_CONTENT);
        spanEle.appendChild(text);

        return spanEle;
    }

}
