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

import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * This class is supposed to be common parent class for the different selectMany tags.
 * 
 * @author mengbo
 * @version 1.5
 * @deprecated Use DTTagConverter meta-data instead
 */
public abstract class SelectTagConverter extends AbstractTagConverter
{
    /**
     * @param host
     */
    public SelectTagConverter(Element host)
    {
        super(host);
    }

    /**
     * Return a list of SelectItem
     * 
     * @param parent
     * @return the select item list for parent
     */
    protected List getSelectItems(Element parent)
    {
        List result = new ArrayList();
        NodeList nl = parent.getChildNodes();
        for (int i = 0, size = nl.getLength(); i < size; i++)
        {
            Node child = nl.item(i);
            if (child instanceof Element)
            {
                Element ele = (Element) child;
                String tagname = ele.getLocalName();
                if (IJSFConstants.TAG_SELECTITEM.equalsIgnoreCase(tagname))
                {
                    SelectItemModel item = new SelectItemModel();
                    item.setDescription(ele.getAttribute(IJSFConstants.ATTR_ITEMDESCRIPTION));
                    item.setLabel(ele.getAttribute(IJSFConstants.ATTR_ITEMLABEL));
                    item.setItemValue(ele.getAttribute(IJSFConstants.ATTR_ITEMVALUE));
                    item.setValue(ele.getAttribute(IJSFConstants.ATTR_VALUE));
                    item.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
                    item.setDisabled("true".equalsIgnoreCase(ele.getAttribute(IJSFConstants.ATTR_ITEMDISABLED))); //$NON-NLS-1$
                    result.add(item);
                }
                else if (IJSFConstants.TAG_SELECTITEMS.equalsIgnoreCase(tagname))
                {
                    // as selectItems can only be resolved at run time, so we just emulate
                    // as if it map to two selectitem
                    String value = ele.getAttribute(IJSFConstants.ATTR_VALUE);
                    if (value == null || value.length() == 0)
                    {
                        value = IJSFConstants.ATTR_VALUE;
                    }
                    SelectItemModel item1 = new SelectItemModel();
                    item1.setValue(value + "_1"); //$NON-NLS-1$
                    item1.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
                    result.add(item1);
                    SelectItemModel item2 = new SelectItemModel();
                    item2.setValue(value + "_2"); //$NON-NLS-1$
                    item2.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
                    result.add(item2);
                }
            }
        }

        return result;
    }

    /**
     * @param parent
     * @return the select item model for parent
     */
    public SelectItemModel getDefault(Element parent)
    {
        SelectItemModel item = new SelectItemModel();
        if (parent.getLocalName().equals(IJSFConstants.TAG_SELECTONERADIO))
        {
            item.setLabel("radio"); //$NON-NLS-1$
        }
        else if (parent.getLocalName().equals(IJSFConstants.TAG_SELECTMANYCHECKBOX))
        {
            item.setLabel("checkBox"); //$NON-NLS-1$
        }
        else
        {
            item.setLabel(parent.getLocalName());
        }
        return item;
    }

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

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

}
