/*******************************************************************************
 * 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 java.util.List;

import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
import org.eclipse.jst.pagedesigner.IHTMLConstants;
import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

/**
 * @author mengbo
 * @version 1.5
 * @deprecated Use DTTagConverter meta-data instead
 */
public class TableBasedSelectTagConverter extends SelectTagConverter
{

    private String _inputType;

    /**
     * @param host
     * @param inputType 
     */
    public TableBasedSelectTagConverter(Element host, String inputType)
    {
        super(host);
        this._inputType = inputType;
    }

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

        // Render a "table" element.
        Element tableEle = createElement(IHTMLConstants.TAG_TABLE);

        // If the "styleClass" is specified, render the value of the "styleClass"
        // attribute as the value of the "class" attribute on the "table" element.
        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, tableEle, IHTMLConstants.ATTR_CLASS);

        // If the "style", "border" attributes are specified, pass them thru. 
        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLE, tableEle, IHTMLConstants.ATTR_STYLE);
        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_BORDER, tableEle, IHTMLConstants.ATTR_BORDER);

        // If the "layout" attribute is specified, and its value is "pageDirection", 
        // render the children elements vertically, otherwise horizontally, in the table. 
        boolean horizontal = true;
        if ("pageDirection".equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_LAYOUT))) //$NON-NLS-1$
        {
            horizontal = false;
        }

        Element itemContainer;
        if (horizontal)
        {
            itemContainer = createElement(IHTMLConstants.TAG_TR);
            tableEle.appendChild(itemContainer);
        }
        else
        {
            itemContainer = tableEle;
        }

        // XXX: If any of the children are an instance of SelectItemGroup, render them as a 
        // nested table.
        // but at design time, we don't know anything about SelectItemGroup. so will not
        // rendering nested table.

        List selectitems = this.getSelectItems(hostEle);

        // for designer, if there is no item, we still want to render one
        if (this.isDesignerMode() && selectitems.isEmpty())
        {
            SelectItemModel item = getDefault(hostEle);
            selectitems.add(item);
        }

        boolean isDisabled = Boolean.TRUE.toString()
                .equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_DISABLED));
        boolean isReadonly = Boolean.TRUE.toString()
                .equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_READONLY));

        for (int i = 0, size = selectitems.size(); i < size; i++)
        {
            SelectItemModel item = (SelectItemModel) selectitems.get(i);
            // Each of the children are ultimately rendererd as follows. 
            // Render a "label" element. Inside of the "label", render an "input" element 
            // of "type" "checkbox" for each child component.
            Element labelEle = createElement(IHTMLConstants.TAG_LABEL);
            Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
            inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, getInputType());
            if (isDisabled || item.isDisabled())
            {
                inputEle.setAttribute(IHTMLConstants.ATTR_DISABLED, "disabled"); //$NON-NLS-1$
            }
            if (isReadonly)
            {
                inputEle.setAttribute(IHTMLConstants.ATTR_READONLY, "readonly"); //$NON-NLS-1$
            }

            // As an exception to the general 
            // rules about how to handle the "id" attribute, render it as an attribute on 
            // the outer "table" element, the value of which is the clientId of the component 
            // per the rules at the beginning of this specification.The "id" attribute must 
            // not be output on each "input" element.
            if (item.getId() != null)
            {
                labelEle.setAttribute(IHTMLConstants.ATTR_ID, item.getId());
            }

            // The value of the current SelectItem 
            // is rendered as the value of the "value" attribute. If the value of the enclosing 
            // UISelectMany matches the current value, render "checked" as the value of the 
            // "checked" attribute. If the current SelectItem.isDisabled() returns true, 
            // render "disabled" as the value of the "disabled" attribute.
            if (item.getValue() != null)
            {
                inputEle.setAttribute(IHTMLConstants.ATTR_VALUE, item.getValue());
            }
            // XXX: checked and disabled is not handled.

            // Close out the "input" element and render the return value from 
            // SelectItem.getLabel(). Close out the "label" element and any other nested elements.
            Text label = createText(item.getDisplayString());

            labelEle.appendChild(inputEle);
            labelEle.appendChild(label);

            if (horizontal)
            {
                Element td = createElement(IHTMLConstants.TAG_TD);
                td.appendChild(labelEle);
                itemContainer.appendChild(td);
            }
            else
            {
                Element tr = createElement(IHTMLConstants.TAG_TR);
                Element td = createElement(IHTMLConstants.TAG_TD);
                tr.appendChild(td);
                td.appendChild(labelEle);
                itemContainer.appendChild(tr);
            }
        }

        return (tableEle);
    }

    /**
     * @return the input type
     */
    protected String getInputType()
    {
        return _inputType;
    }

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