package eu.dnetlib.functionality.webInterface.app;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.log4j.Logger;

import eu.dnetlib.domain.functionality.DocumentDescription;
import eu.dnetlib.domain.functionality.DocumentField;
import eu.dnetlib.domain.functionality.Searchable;
import eu.dnetlib.domain.functionality.SwitchDocumentField;
import eu.dnetlib.domain.functionality.WebInterfaceLayout;
import eu.dnetlib.domain.functionality.WebInterfaceSearchCriteria;
import eu.dnetlib.domain.functionality.DocumentDescription.View;
import eu.dnetlib.functionality.webInterface.dao.WebInterfaceLayoutDao;
import gr.uoa.di.driver.dao.DAOException;

public class WebInterfaceLayoutManagerImpl implements WebLayoutManager {

	// private static boolean USE_CUSTOMISED_LAYOUT = false;
	private static Logger logger = Logger
			.getLogger(WebInterfaceLayoutManagerImpl.class);

	private String layoutName = null;
	private WebInterfaceLayoutDao dao = null;

	private List<Searchable> allFields = new ArrayList<Searchable>();
	private List<Searchable> searchFields = new ArrayList<Searchable>();
	private List<Searchable> refineFields = new ArrayList<Searchable>();
	private List<Searchable> browseFields = new ArrayList<Searchable>();

	private List<DocumentField> resultFields = new ArrayList<DocumentField>();
	private Set<String> vocabularyResults = new HashSet<String>();

	private Map<String, Searchable> labelMap = new HashMap<String, Searchable>();
	private Map<String, Searchable> indexMap = new HashMap<String, Searchable>();

	private Map<String, String> searchVocabularies = new HashMap<String, String>();
	private Map<String, String> browseVocabularies = new HashMap<String, String>();
	private Map<String, String> documentFieldVocabularies = new HashMap<String, String>();

	private String cssFileName = null;

	private WebInterfaceLayout layout = null;

	public void init() {

		logger.debug("Getting web layout with name " + this.layoutName);

		WebInterfaceSearchCriteria criteria = new WebInterfaceSearchCriteria();
		criteria.setLayoutName(this.layoutName);

		WebInterfaceLayout layout = null;

		try {
			List<WebInterfaceLayout> list = this.dao.search(criteria);

			if (list.size() > 0)
				layout = list.get(list.size() - 1);

		} catch (DAOException de) {
			logger.error("Failed to get web layout xml from IS.", de);
		}

		if (layout == null) {
			logger.debug("Layout + " + this.layoutName
					+ " not found. Generating default");

//			layout = this.generateDefaultLayout();
		}

		updateLists(layout);
		this.cssFileName = layout.getCssFile();
		this.layout = layout;
	}

/*	private WebInterfaceLayout generateDefaultLayout() {

		WebInterfaceLayout layout = new WebInterfaceLayout("withoutProfile",
				"DMF", "index");

		// TODO: update init
		layout.setDefaultLocale(new Locale("en", "GB"));
		Locale.setDefault(new Locale("en", "GB"));
		List<Locale> supportedLocales = new ArrayList<Locale>();
		supportedLocales.add(new Locale("es", "ES"));
		supportedLocales.add(new Locale("el", "GR"));
		layout.setSupportedLocales(supportedLocales);

		layout.setViewCollections(false);
		layout.setViewCommunities(false);
		layout.setViewRepositories(false);
		layout.setViewAnnouncements(true);
		layout.setViewUserProfile(false);
		layout.setViewSimilarDocuments(false);

		Searchable sable = new Searchable(Type.PLAIN);
		Map<Locale, String> descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Author");
		descriprionMap.put(new Locale("es", "ES"), "Creador");
		sable.setDescriptionMap(descriprionMap);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "author");
		descriprionMap.put(new Locale("es", "ES"), "creador");
		sable.setShortDescriptionMap(descriprionMap);
		sable.setName("author");
		sable.setIndexType("creator");
		sable.setInSearch(true);
		sable.setInRefine(true);
		sable.setInBrowse(false);
		sable.setSearchRank(1);
		sable.setRefineRank(1);
		sable.setSearchVocabulary(null);
		sable.setBrowseVocabulary(null);
		layout.getSearchFields().add(sable);

		sable = new Searchable(Type.PLAIN);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Title");
		descriprionMap.put(new Locale("es", "ES"), "Título");
		sable.setDescriptionMap(descriprionMap);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "title");
		descriprionMap.put(new Locale("es", "ES"), "título");
		sable.setShortDescriptionMap(descriprionMap);
		sable.setName("title");
		sable.setIndexType("title");
		sable.setInSearch(true);
		sable.setInRefine(false);
		sable.setInBrowse(false);
		sable.setSearchRank(2);
		sable.setRefineRank(2);
		sable.setSearchVocabulary(null);
		sable.setBrowseVocabulary(null);
		layout.getSearchFields().add(sable);

		sable = new Searchable(Type.PLAIN);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Subject");
		descriprionMap.put(new Locale("es", "ES"), "Materia");
		sable.setDescriptionMap(descriprionMap);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "subject");
		descriprionMap.put(new Locale("es", "ES"), "materia");
		sable.setShortDescriptionMap(descriprionMap);
		sable.setName("subject");
		sable.setIndexType("subject");
		sable.setInSearch(true);
		sable.setInRefine(true);
		sable.setInBrowse(false);
		sable.setSearchRank(3);
		sable.setRefineRank(3);
		sable.setSearchVocabulary(null);
		sable.setBrowseVocabulary(null);
		layout.getSearchFields().add(sable);

		sable = new Searchable(Type.PLAIN);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Contributor");
		descriprionMap.put(new Locale("es", "ES"), "Contribuidor");
		sable.setDescriptionMap(descriprionMap);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "contributor");
		descriprionMap.put(new Locale("es", "ES"), "contribuidor");
		sable.setShortDescriptionMap(descriprionMap);
		sable.setName("contributor");
		sable.setIndexType("contributor");
		sable.setInSearch(true);
		sable.setInRefine(true);
		sable.setInBrowse(false);
		sable.setSearchRank(4);
		sable.setRefineRank(4);
		sable.setSearchVocabulary(null);
		sable.setBrowseVocabulary(null);
		layout.getSearchFields().add(sable);

		sable = new Searchable(Type.PLAIN);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Publisher");
		descriprionMap.put(new Locale("es", "ES"), "Editor");
		sable.setDescriptionMap(descriprionMap);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "publisher");
		descriprionMap.put(new Locale("es", "ES"), "editor");
		sable.setShortDescriptionMap(descriprionMap);
		sable.setName("publisher");
		sable.setIndexType("publisher");
		sable.setInSearch(true);
		sable.setInRefine(true);
		sable.setInBrowse(false);
		sable.setSearchRank(5);
		sable.setRefineRank(5);
		sable.setSearchVocabulary(null);
		sable.setBrowseVocabulary(null);
		layout.getSearchFields().add(sable);

		sable = new Searchable(Type.PLAIN);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Source");
		descriprionMap.put(new Locale("es", "ES"), "Fuente");
		sable.setDescriptionMap(descriprionMap);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "source");
		descriprionMap.put(new Locale("es", "ES"), "fuente");
		sable.setShortDescriptionMap(descriprionMap);
		sable.setName("source");
		sable.setIndexType("source");
		sable.setInSearch(true);
		sable.setInRefine(true);
		sable.setInBrowse(false);
		sable.setSearchRank(6);
		sable.setRefineRank(6);
		sable.setSearchVocabulary(null);
		sable.setBrowseVocabulary(null);

		layout.getSearchFields().add(sable);
		sable = new Searchable(Type.PLAIN);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Relation");
		descriprionMap.put(new Locale("es", "ES"), "Relación");
		sable.setDescriptionMap(descriprionMap);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "relation");
		descriprionMap.put(new Locale("es", "ES"), "relación");
		sable.setShortDescriptionMap(descriprionMap);
		sable.setName("relation");
		sable.setIndexType("relation");
		sable.setInSearch(true);
		sable.setInRefine(false);
		sable.setInBrowse(false);
		sable.setSearchRank(7);
		sable.setSearchVocabulary(null);
		sable.setBrowseVocabulary(null);
		layout.getSearchFields().add(sable);

		sable = new SearchableDate();
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Publication Date");
		descriprionMap.put(new Locale("es", "ES"), "Fecha de Publicación");
		sable.setDescriptionMap(descriprionMap);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "published");
		descriprionMap.put(new Locale("es", "ES"), "publicado");
		sable.setShortDescriptionMap(descriprionMap);
		sable.setName("dateAccept");
		sable.setIndexType("dateAccepted");
		sable.setInSearch(true);
		sable.setSearchRank(8);
		((SearchableDate) sable).setFromYear(1980);
		((SearchableDate) sable).setToYear(2010);

		TreeMap<Integer, Map<Locale, String>> tm = new TreeMap<Integer, Map<Locale, String>>();

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"),
				"in the specified date range");
		descriprionMap.put(new Locale("es", "ES"),
				"de la fecha especificada gama");
		tm.put(new Integer(0), descriprionMap);

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "in the last one month");
		descriprionMap.put(new Locale("es", "ES"), "en el último mes");
		tm.put(new Integer(1), descriprionMap);

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "in the last 2 months");
		descriprionMap.put(new Locale("es", "ES"), "en los últimos 2 meses");
		tm.put(new Integer(2), descriprionMap);

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "in the last 3 months");
		descriprionMap.put(new Locale("es", "ES"), "en los últimos 3 meses");
		tm.put(new Integer(3), descriprionMap);

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "in the last 6 months");
		descriprionMap.put(new Locale("es", "ES"), "en los últimos 6 meses");
		tm.put(new Integer(6), descriprionMap);

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "in the last 12 months");
		descriprionMap.put(new Locale("es", "ES"), "en los últimos 12 meses");
		tm.put(new Integer(12), descriprionMap);

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "in the last 2 years");
		descriprionMap.put(new Locale("es", "ES"), "en los últimos 2 años");
		tm.put(new Integer(24), descriprionMap);

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "in the last 3 years");
		descriprionMap.put(new Locale("es", "ES"), "en los últimos 3 años");
		tm.put(new Integer(36), descriprionMap);

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "in the last 5 years");
		descriprionMap.put(new Locale("es", "ES"), "en los últimos 5 años");
		tm.put(new Integer(60), descriprionMap);

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "in the last 10 years");
		descriprionMap.put(new Locale("es", "ES"), "en los últimos 10 años");
		tm.put(new Integer(120), descriprionMap);
		((SearchableDate) sable).getPeriodBackMap().putAll(tm);
		layout.getSearchFields().add(sable);

		sable = new Searchable(Type.PLAIN);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Document Language");
		descriprionMap.put(new Locale("es", "ES"), "Idioma del Documento");
		sable.setDescriptionMap(descriprionMap);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "language");
		descriprionMap.put(new Locale("es", "ES"), "idioma");
		sable.setShortDescriptionMap(descriprionMap);
		sable.setName("lang");
		sable.setIndexType("language");
		sable.setInSearch(true);
		sable.setInRefine(true);
		sable.setInBrowse(true);
		sable.setSearchRank(9);
		sable.setRefineRank(7);
		sable.setBrowseRank(1);
		sable.setSearchVocabulary("Short list of language names");
		sable.setBrowseVocabulary("Names of languages");
		layout.getSearchFields().add(sable);

		sable = new Searchable(Type.PLAIN);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Document Type");
		descriprionMap.put(new Locale("es", "ES"), "Tipo de Documento");
		sable.setDescriptionMap(descriprionMap);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "category");
		descriprionMap.put(new Locale("es", "ES"), "categoría");
		sable.setShortDescriptionMap(descriprionMap);
		sable.setName("category");
		sable.setIndexType("CobjCategory");
		sable.setInSearch(true);
		sable.setInRefine(true);
		sable.setInBrowse(true);
		sable.setSearchRank(10);
		sable.setRefineRank(8);
		sable.setBrowseRank(2);
		sable.setSearchVocabulary("Names of Text Object Typologies");
		sable.setBrowseVocabulary("Names of Text Object Typologies");
		layout.getSearchFields().add(sable);

		sable = new Searchable(Type.PLAIN);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Repositories");
		descriprionMap.put(new Locale("es", "ES"), "Repositorios");
		sable.setDescriptionMap(descriprionMap);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "repositories");
		descriprionMap.put(new Locale("es", "ES"), "repositorios");
		sable.setShortDescriptionMap(descriprionMap);
		sable.setName("repname");
		sable.setIndexType("repositoryName");
		sable.setInSearch(true);
		sable.setInRefine(true);
		sable.setInBrowse(true);
		sable.setSearchRank(11);
		sable.setRefineRank(9);
		sable.setBrowseRank(3);
		sable.setSearchVocabulary("Names of Repositories");
		layout.getSearchFields().add(sable);

		Map<View, DocumentDescription> documentDescriptions = new HashMap<View, DocumentDescription>();
		DocumentDescription dd = new DocumentDescription(View.SUMMARY_VIEW);
		List<DocumentField> fields = new ArrayList<DocumentField>();
		List<DisplayType> displays = new ArrayList<DisplayType>();

		SwitchDocumentField switchField = new SwitchDocumentField(
				"CobjTypology");

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "${title}");
		descriprionMap.put(new Locale("es", "ES"), "${title}");
		switchField.setDescriptionMap(descriprionMap);
		DisplayType type = new DocumentExternalUrlDisplayType("identifier",
				descriprionMap);
		displays.add(type);
		DocumentField field = new DocumentField("identifier", descriprionMap,
				null, displays, "document_text", Cutpoint.VALUE, 1);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "You can also visit...");
		descriprionMap.put(new Locale("es", "ES"), "también se puede visitar");
		field.setSecondaryLinkMap(descriprionMap);
		field.setForceDescription(true);
		switchField.addSwitchDisplayField("Textual", field);

		dd.putDocumentField(switchField);

		type = new SearchDisplayType("creator", "author");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Author(s)");
		descriprionMap.put(new Locale("es", "ES"), "Creador(s)");
		field = new DocumentField("creator", descriprionMap, null, displays,
				"resultsField", Cutpoint.VALUE, 100);
		field.setDescriptionMap(descriprionMap);
		fields.add(field);
		dd.putDocumentField(field);

		type = new PlainTextDisplayType("description");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Description");
		descriprionMap.put(new Locale("es", "ES"), "Descripción");
		field = new DocumentField("description", descriprionMap, null,
				displays, "resultsField", Cutpoint.PART, 300);
		fields.add(field);
		dd.putDocumentField(field);

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "${repositoryName}");
		descriprionMap.put(new Locale("es", "ES"), "${repositoryName}");
		type = new InternalUrlDisplayType("repositoryName", descriprionMap,
				"showRepository", "name");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "View repository documents");
		descriprionMap.put(new Locale("es", "ES"),
				"Ver documentos del repositorio");

		type = new SearchDisplayType("repositoryName", "repName",
				descriprionMap);
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Repository");
		descriprionMap.put(new Locale("es", "ES"), "Repositorio");
		field = new DocumentField("repositoryName", descriprionMap, null,
				displays, "resultsField", Cutpoint.LINE, 300);
		fields.add(field);
		dd.putDocumentField(field);

		type = new PlainTextDisplayType("language");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Language(s)");
		descriprionMap.put(new Locale("es", "ES"), "Idioma(s)");
		field = new DocumentField("language", descriprionMap,
				"Names of Languages", displays, "resultsField", Cutpoint.VALUE,
				100);
		fields.add(field);
		dd.putDocumentField(field);
		documentDescriptions.put(dd.getView(), dd);

		dd = new DocumentDescription(View.DETAILED_VIEW);
		fields = new ArrayList<DocumentField>();
		displays = new ArrayList<DisplayType>();

		switchField = new SwitchDocumentField("CobjTypology");

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "${title}");
		descriprionMap.put(new Locale("es", "ES"), "${title}");
		switchField.setDescriptionMap(descriprionMap);
		type = new DocumentExternalUrlDisplayType("identifier", descriprionMap);
		displays.add(type);
		field = new DocumentField("identifier", descriprionMap, null, displays,
				"document_text", Cutpoint.VALUE, 1);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "You can also visit...");
		descriprionMap.put(new Locale("es", "ES"), "también se puede visitar");
		field.setSecondaryLinkMap(descriprionMap);
		field.setForceDescription(true);
		switchField.addSwitchDisplayField("Textual", field);

		dd.putDocumentField(switchField);

		type = new SearchDisplayType("creator", "author");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Author(s)");
		descriprionMap.put(new Locale("es", "ES"), "Creador(s)");
		field = new DocumentField("creator", descriprionMap, null, displays,
				"resultsField", Cutpoint.VALUE, 100);
		field.setDescriptionMap(descriprionMap);
		fields.add(field);
		dd.putDocumentField(field);

		type = new PlainTextDisplayType("description");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Description");
		descriprionMap.put(new Locale("es", "ES"), "Descripción");
		field = new DocumentField("description", descriprionMap, null,
				displays, "resultsField", Cutpoint.PART, 300);
		fields.add(field);
		dd.putDocumentField(field);

		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "${repositoryName}");
		descriprionMap.put(new Locale("es", "ES"), "${repositoryName}");
		type = new InternalUrlDisplayType("repositoryName", descriprionMap,
				"showRepository", "name");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "View repository documents");
		descriprionMap.put(new Locale("es", "ES"),
				"Ver documentos del repositorio");

		type = new SearchDisplayType("repositoryName", "repName",
				descriprionMap);
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Repository");
		descriprionMap.put(new Locale("es", "ES"), "Repositorio");
		field = new DocumentField("repositoryName", descriprionMap, null,
				displays, "resultsField", Cutpoint.LINE, 300);
		fields.add(field);
		dd.putDocumentField(field);

		type = new PlainTextDisplayType("language");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Language(s)");
		descriprionMap.put(new Locale("es", "ES"), "Idioma(s)");
		field = new DocumentField("language", descriprionMap,
				"Names of Languages", displays, "resultsField", Cutpoint.VALUE,
				100);
		fields.add(field);
		dd.putDocumentField(field);
		documentDescriptions.put(dd.getView(), dd);

		type = new PlainTextDisplayType("subject");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Subject(s)");
		descriprionMap.put(new Locale("es", "ES"), "Materia(s)");
		field = new DocumentField("subject", descriprionMap, null, displays,
				"resultsField");
		fields.add(field);
		dd.putDocumentField(field);

		type = new PlainTextDisplayType("publisher");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Publisher(s)");
		descriprionMap.put(new Locale("es", "ES"), "Editor(es)");
		field = new DocumentField("publisher", descriprionMap, null, displays,
				"resultsField");
		fields.add(field);
		dd.putDocumentField(field);

		type = new PlainTextDisplayType("contributor");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Contributor(s)");
		descriprionMap.put(new Locale("es", "ES"), "Contribuidor(es)");
		field = new DocumentField("source", descriprionMap, null, displays,
				"resultsField");
		fields.add(field);
		dd.putDocumentField(field);

		type = new PlainTextDisplayType("source");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Source(s)");
		descriprionMap.put(new Locale("es", "ES"), "Fuente(s)");
		field = new DocumentField("source", descriprionMap, null, displays,
				"resultsField");
		fields.add(field);
		dd.putDocumentField(field);

		type = new PlainTextDisplayType("dateAccepted");
		displays = new ArrayList<DisplayType>();
		displays.add(type);
		descriprionMap = new HashMap<Locale, String>();
		descriprionMap.put(new Locale("en", "GB"), "Publication Date(s)");
		descriprionMap.put(new Locale("es", "ES"), "Fecha(s) de Publicación");
		field = new DocumentField("dateAccepted", descriprionMap, null,
				displays, "resultsField");
		fields.add(field);
		dd.putDocumentField(field);

		documentDescriptions.put(dd.getView(), dd);
		layout.getDocumentDescriptions().putAll(documentDescriptions);

		layout.setCssFile("driver_search.css");
		return layout;
	}
*/
	private synchronized void updateLists(WebInterfaceLayout layout) {

		for (Searchable s : layout.getSearchFields()) {

			labelMap.put(s.getName(), s);
			indexMap.put(s.getIndexType().toLowerCase(), s);

			allFields.add(s);

			if (s.isInSearch()) {
				searchFields.add(s);
			}

			if (s.isInBrowse()) {
				browseFields.add(s);
			}

			if (s.isInRefine()) {
				refineFields.add(s);
			}

			if (s.getSearchVocabulary() != null) {
				searchVocabularies.put(s.getIndexType(), s
						.getSearchVocabulary());
			}

			if (s.getBrowseVocabulary() != null) {
				browseVocabularies.put(s.getIndexType(), s
						.getBrowseVocabulary());
			}

		}

		Map<View, DocumentDescription> descriptions = layout
				.getDocumentDescriptions();

		for (View view : descriptions.keySet()) {
			DocumentDescription docDscr = descriptions.get(view);
			List<DocumentField> fields = docDscr.getDocumentFields();
			for (DocumentField field : fields) {
				if (field instanceof SwitchDocumentField) {
					Map<String, DocumentField> documentFieldMap = ((SwitchDocumentField) field)
							.getDocumentFieldMap();
					for (String key : documentFieldMap.keySet()) {
						DocumentField swField = documentFieldMap.get(key);
						if (swField.getVocabulary() != null) {
							documentFieldVocabularies.put(swField.getName(),
									swField.getVocabulary());
							vocabularyResults.add(swField.getName());
						}
						resultFields.add(swField);
					}

				} else {
					if (field.getVocabulary() != null) {
						documentFieldVocabularies.put(field.getName(), field
								.getVocabulary());
						vocabularyResults.add(field.getName());
					}
					resultFields.add(field);
				}
			}
		}

		Collections.sort(searchFields, new Comparator<Searchable>() {
			public int compare(Searchable s1, Searchable s2) {
				return s1.getSearchRank() - s2.getSearchRank();
			}
		});
		Collections.sort(refineFields, new Comparator<Searchable>() {
			public int compare(Searchable s1, Searchable s2) {
				return s1.getSearchRank() - s2.getSearchRank();
			}
		});
	}

	public void setLayoutName(String layoutName) {
		this.layoutName = layoutName;
	}

	public WebInterfaceLayoutDao getDao() {
		return dao;
	}

	public void setDao(WebInterfaceLayoutDao dao) {
		this.dao = dao;
	}

	public List<Searchable> getAllFields() {
		return allFields;
	}

	public List<Searchable> getSearchFields() {
		return searchFields;
	}

	public List<Searchable> getBrowseFields() {
		return browseFields;
	}

	public List<DocumentField> getResultFields() {
		return resultFields;
	}

	public List<Searchable> getRefineFields() {
		return refineFields;
	}

	public Map<String, Searchable> getLabelMap() {
		return labelMap;
	}

	public Map<String, Searchable> getIndexMap() {
		return indexMap;
	}

	public String getCssFileName() {
		return this.cssFileName;
	}

	public Map<String, String> getSearchVocabularies() {
		return searchVocabularies;
	}

	public void setSearchVocabularies(Map<String, String> searchVocabularies) {
		this.searchVocabularies = searchVocabularies;
	}

	public Map<String, String> getBrowseVocabularies() {
		return browseVocabularies;
	}

	public void setBrowseVocabularies(Map<String, String> browseVocabularies) {
		this.browseVocabularies = browseVocabularies;
	}

	public Map<String, String> getDocumentFieldVocabularies() {
		return documentFieldVocabularies;
	}

	public void setDocumentFieldVocabularies(
			Map<String, String> documentFieldVocabularies) {
		this.documentFieldVocabularies = documentFieldVocabularies;
	}

	public WebInterfaceLayout getLayout() {
		return layout;

	}

	@Override
	public DocumentDescription getDescription(View view) {
		return (layout.getDocumentDescriptions().get(view) != null) ? layout
				.getDocumentDescriptions().get(view) : layout
				.getDocumentDescriptions().get(View.SUMMARY_VIEW);
	}

	public void setVocabularyResults(Set<String> vocabularyResults) {
		this.vocabularyResults = vocabularyResults;
	}

	public Set<String> getVocabularyResults() {
		return vocabularyResults;
	}

}
