package org.opencmshispano.widget;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;


import org.opencms.file.CmsFolder;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsPropertyDefinition;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsResourceFilter;
import org.opencms.main.CmsException;
import org.opencms.util.CmsStringUtil;
import org.opencms.widgets.CmsSelectWidget;
import org.opencms.widgets.CmsSelectWidgetOption;
import org.opencms.widgets.I_CmsWidget;
import org.opencms.widgets.I_CmsWidgetDialog;
import org.opencms.widgets.I_CmsWidgetParameter;
import org.opencms.workplace.CmsWorkplace;

public class CmsSelectTemplateWidget extends CmsSelectWidget
{
	public static final String TEMPLATE_FOLDER = "templates/";
	public static final String PAGES_FOLDER = "pages/";
	public static final char DELIM_PROPERTYVALUES = ',';
	protected final static String OPTION_DELIMITER = "|";
	protected final static String OPTION_VALUE_BEGIN="='";
	protected final static String OPTION_VALUE_END="'";
	private HashMap<String, String> config;

	public CmsSelectTemplateWidget()
    {
       super();
    }

    public CmsSelectTemplateWidget(String configuration)
    {
       super(configuration);
    }


    /**
     * @see org.opencms.widgets.I_CmsWidget#getDialogWidget(org.opencms.file.CmsObject, org.opencms.widgets.I_CmsWidgetDialog, org.opencms.widgets.I_CmsWidgetParameter)
     */
    public String getDialogWidget(CmsObject cms, I_CmsWidgetDialog widgetDialog, I_CmsWidgetParameter param) {

        String id = param.getId();
        StringBuffer result = new StringBuffer(16);

        result.append("<td class=\"xmlTd\" style=\"height: 25px;\"><select class=\"xmlInput");
        if (param.hasError()) {
            result.append(" xmlInputError");
        }
        result.append("\" name=\"");
        result.append(id);
        result.append("\" id=\"");
        result.append(id);
        result.append("\">");

        // get select box options from default value String
        List<CmsSelectWidgetOption> options;
		try
		{
			options = getOptions(cms);
		}
		catch (CmsException e)
		{
			options=new ArrayList<CmsSelectWidgetOption>();
		}
        String selected = getSelectedValue(cms, param);
        Iterator i = options.iterator();
        for(CmsSelectWidgetOption option : options) {
            result.append("<option value=\"");
            result.append(option.getValue());
            result.append("\"");
            if ((selected != null) && selected.equals(option.getValue())) {
                result.append(" selected=\"selected\"");
            }
            result.append(">");
            result.append(option.getOption());
            result.append("</option>");
        }

        result.append("</select>");
        result.append("</td>");

        return result.toString();
    }

      /**
     * @see org.opencms.widgets.I_CmsWidget#newInstance()
     */
    public I_CmsWidget newInstance() {

        return new CmsSelectTemplateWidget(getConfiguration());
    }

    public void setConfiguration(String configuration)
    {
		super.setConfiguration(configuration);
        config = parseOptions(getConfiguration());
	}

    public List<CmsSelectWidgetOption> getOptions(CmsObject cms) throws CmsException
    {
    	String type = config.get("type");
    	List<CmsSelectWidgetOption> options = new ArrayList<CmsSelectWidgetOption>();
    	if((type==null || type.equals("")) || type.equals("template"))
    	{
    		options = getTemplates(cms);
    	}
    	else if(type.equals("template-elements"))
    	{
    		options = getTemplateElements(cms, config.get("folder"));
    	}
    	return options;
    }

    public List<CmsSelectWidgetOption> getTemplates(CmsObject cms) throws CmsException
	{
        List<CmsSelectWidgetOption> elements = new ArrayList<CmsSelectWidgetOption>();
        elements.add(new CmsSelectWidgetOption(""));

        List<CmsFolder> modules = cms.getSubFolders(CmsWorkplace.VFS_PATH_MODULES, CmsResourceFilter.IGNORE_EXPIRATION);
        for (CmsFolder module : modules)
        {
            List<CmsResource> moduleTemplateFiles = new ArrayList();
            String folder = cms.getSitePath(module);
            try
            {
                moduleTemplateFiles = cms.getFilesInFolder(folder + TEMPLATE_FOLDER,CmsResourceFilter.DEFAULT.addRequireVisible());
            }
            catch (CmsException e)
            {
            }
            for (CmsResource templateFile : moduleTemplateFiles)
            {
                String title = null;
                try
                {
                    title = cms.readPropertyObject(cms.getSitePath(templateFile), CmsPropertyDefinition.PROPERTY_TITLE, false).getValue();
                }
                catch (CmsException e)
                {
                }

                if(title==null)
                	elements.add(new CmsSelectWidgetOption(cms.getSitePath(templateFile)));
                else
                	elements.add(new CmsSelectWidgetOption(cms.getSitePath(templateFile),false, title));
            }
        }
        return elements;
    }

    public List<CmsSelectWidgetOption> getTemplateElements(CmsObject cms, String templateFolder) throws CmsException
	{
        List<CmsSelectWidgetOption> elements = new ArrayList<CmsSelectWidgetOption>();
        elements.add(new CmsSelectWidgetOption(""));

        List<CmsFolder> modules = cms.getSubFolders(CmsWorkplace.VFS_PATH_MODULES, CmsResourceFilter.IGNORE_EXPIRATION);
        for (CmsFolder module : modules)
        {
            List<CmsResource> moduleTemplateFiles = new ArrayList();
            String folder = cms.getSitePath(module);
            try
            {
            	if(templateFolder!=null && !templateFolder.equals(""))
            	{
            		moduleTemplateFiles = cms.getFilesInFolder(folder + templateFolder,CmsResourceFilter.DEFAULT.addRequireVisible());
            	}
            	else
            	{
            		moduleTemplateFiles = cms.getFilesInFolder(folder + PAGES_FOLDER,CmsResourceFilter.DEFAULT.addRequireVisible());
            	}
            }
            catch (CmsException e)
            {
            }
            for (CmsResource templateFile : moduleTemplateFiles)
            {
                String title = null;
                try
                {
                    title = cms.readPropertyObject(cms.getSitePath(templateFile), CmsPropertyDefinition.PROPERTY_TITLE, false).getValue();
                }
                catch (CmsException e)
                {
                }

                if(title==null)
                	elements.add(new CmsSelectWidgetOption(cms.getSitePath(templateFile)));
                else
                	elements.add(new CmsSelectWidgetOption(cms.getSitePath(templateFile),false, title));
            }
        }
        return elements;
    }

    private HashMap parseOptions(String config)
    {
    	HashMap<String, String> map = new HashMap<String, String>();

    	String [] aParms = CmsStringUtil.splitAsArray(config, OPTION_DELIMITER);
    	for (int i=0; i<aParms.length; i++) {
    		boolean bBadParamFormat = false;
    		// read the parameter name
    		String strParm = aParms[i];
    		int nParmNameBegin = 0;
	    	int nParmNameEnd = strParm.indexOf(OPTION_VALUE_BEGIN);
	    	if (-1 != nParmNameEnd) {
	    		// parameter name
	    		String strParmName = strParm.substring(nParmNameBegin, nParmNameEnd);
	    		// parameter value
	    		int nParmValueStart = nParmNameEnd + OPTION_VALUE_BEGIN.length();
	    		int nParmValueEnd = strParm.indexOf(OPTION_VALUE_END, nParmValueStart);
	    		if (-1 != nParmValueEnd) {
		    		String strParmVal = strParm.substring(nParmValueStart, nParmValueEnd);

		    		// add the param name-value pair
		    		map.put(strParmName, strParmVal);
	    		} else {
	    			bBadParamFormat = true;
	    		}
	    	} else {
	    		bBadParamFormat = true;
	    	}

    	}
    	return map;
    }


}


