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.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.log4j.Logger;

import eu.dnetlib.domain.functionality.DateSearchable;
import eu.dnetlib.domain.functionality.DisplayType;
import eu.dnetlib.domain.functionality.ExternalUrlDisplayType;
import eu.dnetlib.domain.functionality.PlainTextDisplayType;
import eu.dnetlib.domain.functionality.SearchDisplayType;
import eu.dnetlib.domain.functionality.Searchable;
import eu.dnetlib.domain.functionality.WebInterfaceLayout;
import eu.dnetlib.functionality.webInterface.dao.WebInterfaceLayoutDao;

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<Searchable> detailFields = new ArrayList<Searchable>();
	private List<Searchable> summaryFields = new ArrayList<Searchable>();
	private Map<String, Searchable> labelMap = new HashMap<String, Searchable>();
	private Map<String, Searchable> indexMap = new HashMap<String, Searchable>();
	private List<String> vocabularyNames = new ArrayList<String>();
	private String cssFileName = null;

	private WebInterfaceLayout layout = null;
	
	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> getDetailFields() {
		return detailFields;
	}

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

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

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

	public List<Searchable> getSummaryFields() {
		return summaryFields;
	}

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

	public List<String> getVocabularyNames() {
		return vocabularyNames;
	}

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

	public void init() {

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

		// TODO Get real webinterface layout from IS
		/*
			WebInterfaceSearchCriteria criteria = new WebInterfaceSearchCriteria();
			criteria.setLayoutName(name);
			WebInterfaceLayout layout = null ;
			List<WebInterfaceLayout> list = this.dao.search(criteria);
			layout = list.get(list.size());
			return layout;
		*/

		WebInterfaceLayout layout = null;
		if (USE_CUSTOMISED_LAYOUT) {
			layout = generateCustomizedLayout();
		} else {
			layout = generateDefaultLayout();
		}
		updateLists(layout);
		this.cssFileName = layout.getCssFile();

		this.layout = layout;
	}

	private WebInterfaceLayout generateDefaultLayout(){

		DisplayType link = null;
    	WebInterfaceLayout layout = new WebInterfaceLayout("web", "DMF", "index");

    	Searchable sable = new Searchable();
/*    	sable = new Searchable();
    	sable.setDescription("Synthesis");
    	sable.setShortDescription("synthesis");
    	sable.setName("synthesis");
    	sable.setIndexType("CobjContentSynthesis");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(0);
    	sable.setDetailedRank(13);
    	sable.setSummaryRank(13);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	
    	layout.getSearchFields().add(sable);

    	SearchableDate sabled = new SearchableDate();
    	sabled.setDescription("search date");
    	sabled.setShortDescription("date");
    	sabled.setName("date");
    	sabled.setIndexType("dateAccepted");
    	sabled.setCssClass("resultsText");
    	sabled.setInSearch(true);
    	sabled.setInSummary(false);
    	sabled.setInDetail(false);
    	sabled.setSearchRank(20);
    	sabled.setDetailedRank(90);
    	sabled.setSummaryRank(90);
    	sabled.setVocabulary(null);
    	sabled.getRanges().put(1, "last month");
    	sabled.getRanges().put(6, "last 6 months");
    	sabled.setToYear(2009);
    	sabled.setFromYear(1990);
    	
    	layout.getSearchFields().add(sabled);
    	
    	sable = new Searchable();
    	//Do not want typology - stay only with CategoryresultsDoctitle
    	sable.setDescription("Typology");
    	sable.setShortDescription("typology");
    	sable.setName("typology");
    	sable.setIndexType("CobjTypology");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(false);
    	sable.setInSummary(false);
    	sable.setInDetail(false);
    	sable.setSearchRank(-1);
    	sable.setDetailedRank(-1);
    	sable.setSummaryRank(-1);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Object Identifier");
    	sable.setShortDescription("obj id");
    	sable.setName("oid");
    	sable.setIndexType("CobjIdentifier");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(false);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(2);
    	sable.setDetailedRank(2);
    	sable.setSummaryRank(2);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Model");
    	sable.setShortDescription("model");
    	sable.setName("model");
    	sable.setIndexType("CobjModel");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(false);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(3);
    	sable.setDetailedRank(3);
    	sable.setSummaryRank(3);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("MDFormats");
    	sable.setShortDescription("MDFormats");
    	sable.setName("md");
    	sable.setIndexType("CobjMDFormats");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(false);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(-1);
    	sable.setSummaryRank(-1);
    	sable.setDetailedRank(4);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Description Synthesis");
    	sable.setShortDescription("descr synth");
    	sable.setName("dsynth");
    	sable.setIndexType("CobjDescriptionSynthesis");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(5);
    	sable.setDetailedRank(5);
    	sable.setSummaryRank(5);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Aggregator Name");
    	sable.setShortDescription("aggr name");
    	sable.setName("aggrName");
    	sable.setIndexType("aggregatorName");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(6);
    	sable.setDetailedRank(6);
    	sable.setSummaryRank(6);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Aggregator Institution");
    	sable.setShortDescription("aggr institut");
    	sable.setName("aInstit");
    	sable.setIndexType("aggregatorInstitution");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(7);
    	sable.setDetailedRank(7);
    	sable.setSummaryRank(7);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Repository Name");
    	sable.setShortDescription("repo name");
    	sable.setName("repName");
    	sable.setIndexType("repositoryName");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(8);
    	sable.setDetailedRank(8);
    	sable.setSummaryRank(8);
    	sable.setVocabulary("Names of Repositories");
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);
*/
    	sable = new Searchable();
    	sable.setDescription("Repository Link");
    	sable.setShortDescription("repo link");
    	sable.setName("repLink");
    	sable.setIndexType("repositoryLink");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(false);
    	sable.setInSummary(true);
    	sable.setInDetail(true);
    	sable.setSearchRank(9);
    	sable.setDetailedRank(9);
    	sable.setSummaryRank(9);
    	sable.setVocabulary(null);
    	layout.getSearchFields().add(sable);
    	link = new ExternalUrlDisplayType(null);
    	sable.getDisplays().add(link);

/*    	sable = new Searchable();
    	sable.setDescription("Repository Country");
    	sable.setShortDescription("repo country");
    	sable.setName("repCountry");
    	sable.setIndexType("repositoryCountry");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(false);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(10);
    	sable.setDetailedRank(10);
    	sable.setSummaryRank(10);
    	sable.setVocabulary("Names of Countries");
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Repository Institution");
    	sable.setShortDescription("repo inst");
    	sable.setName("repInst");
    	sable.setIndexType("repositoryInstitution");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(false);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(11);
    	sable.setDetailedRank(11);
    	sable.setSummaryRank(11);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);
*/
    	sable = new Searchable();
    	sable.setDescription("Author");
    	sable.setShortDescription("author");
    	sable.setName("author");
    	sable.setIndexType("creator");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(true);
    	sable.setInDetail(true);
    	sable.setInRefine(true);
    	sable.setSearchRank(12);
    	sable.setDetailedRank(12);
    	sable.setSummaryRank(1);
    	sable.setVocabulary(null);
    	
    	link = new SearchDisplayType("author");
    	sable.getDisplays().add(link);
        
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Title");
    	sable.setShortDescription("title");
    	sable.setName("title");
    	sable.setIndexType("title");
    	sable.setCssClass("resultsDoctitle");
    	sable.setInSearch(true);
    	sable.setInSummary(true);
    	sable.setInDetail(true);
    	sable.setSearchRank(13);
    	sable.setDetailedRank(0);
    	sable.setSummaryRank(0);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Subject");
    	sable.setShortDescription("subject");
    	sable.setName("subject");
    	sable.setIndexType("subject");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(14);
    	sable.setDetailedRank(14);
    	sable.setSummaryRank(14);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Document Type");
    	sable.setShortDescription("category");
    	sable.setName("category");
    	sable.setIndexType("CobjCategory");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(15);
    	sable.setDetailedRank(15);
    	sable.setSummaryRank(15);
    	sable.setVocabulary("Names of Text Object Typologies");
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Document Language");
    	sable.setShortDescription("language");
    	sable.setName("lang");
    	sable.setIndexType("language");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(true);
    	sable.setInDetail(true);
    	sable.setInRefine(true);
    	sable.setInBrowse(true);
    	sable.setSearchRank(16);
    	sable.setDetailedRank(16);
    	sable.setSummaryRank(3);
    	sable.setVocabulary("Short list of language names");
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new DateSearchable();
		
    	sable.setDescription("Date Accepted");
    	sable.setShortDescription("accepted");
    	sable.setName("dateAccept");
    	
    	sable.setIndexType("dateAccepted");
    	sable.setCssClass("resultsText");
    	
    	sable.setInSearch(true);
    	sable.setInSummary(true);
    	sable.setInDetail(false);
    	sable.setSearchRank(17);
    	sable.setDetailedRank(17);
    	sable.setSummaryRank(17);
    	sable.setVocabulary(null);
    	
    	((DateSearchable)sable).getYears().add("2009");
    	((DateSearchable)sable).getYears().add("2008");
    	((DateSearchable)sable).getYears().add("2007");
    	
    	TreeMap<Integer, String> tm = new TreeMap<Integer, String>();
    	tm.put(new Integer(0), "in the specified date range");
    	tm.put(new Integer(1), "one month old");
    	((DateSearchable)sable).getPeriodBack().putAll(tm);
    	
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

/*    	sable = new Searchable();
    	sable.setDescription("Identifier");
    	sable.setShortDescription("id");
    	sable.setName("identif");
    	sable.setIndexType("identifier");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(18);
    	sable.setDetailedRank(18);
    	sable.setSummaryRank(18);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Publisher");
    	sable.setShortDescription("publisher");
    	sable.setName("publisher");
    	sable.setIndexType("publisher");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(19);
    	sable.setDetailedRank(19);
    	sable.setSummaryRank(19);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Source");
    	sable.setShortDescription("source");
    	sable.setName("source");
    	sable.setIndexType("source");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(20);
    	sable.setDetailedRank(20);
    	sable.setSummaryRank(20);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Contributor");
    	sable.setShortDescription("contributor");
    	sable.setName("contributor");
    	sable.setIndexType("contributor");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(21);
    	sable.setDetailedRank(21);
    	sable.setSummaryRank(21);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Relation");
    	sable.setShortDescription("relation");
    	sable.setName("relation");
    	sable.setIndexType("relation");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(22);
    	sable.setDetailedRank(22);
    	sable.setSummaryRank(22);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);
*/
    	sable = new Searchable();
    	sable.setDescription("Description");
    	sable.setShortDescription("description");
    	sable.setName("description");
    	sable.setIndexType("description");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(true);
    	sable.setInDetail(true);
    	sable.setSearchRank(23);
    	sable.setDetailedRank(23);
    	sable.setSummaryRank(2);
    	sable.setVocabulary(null);
    	link = new PlainTextDisplayType(); 
    	sable.getDisplays().add(link);
    	layout.getSearchFields().add(sable);

	    layout.setCssFile("driver_search.css");
	   
	 //   layout.getBaseCollections().add("11-ad790e20-0f81-44dc-87b6-da308249ec6a_Q29sbGVjdGlvbkRTUmVzb3VyY2VzL0NvbGxlY3Rpb25EU1Jlc291cmNlVHlwZQ==");
	 //   layout.getBaseCollections().add("13-7552efc5-451a-4d25-9196-85fb884a2446_Q29sbGVjdGlvbkRTUmVzb3VyY2VzL0NvbGxlY3Rpb25EU1Jlc291cmNlVHlwZQ==");

        return layout;

	}
	private WebInterfaceLayout generateCustomizedLayout(){

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

    	Searchable sable = new Searchable();
  
/*    	sable.setDescription("Repository Country");
    	sable.setShortDescription("repo country");
    	sable.setName("repCountry");
    	sable.setIndexType("repositoryCountry");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(2);
    	sable.setDetailedRank(2);
    	sable.setSummaryRank(10);
    	sable.setVocabulary("Names of Countries");
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Author");
    	sable.setShortDescription("author");
    	sable.setName("author");
    	sable.setIndexType("creator,contributor");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(true);
    	sable.setInDetail(true);
    	sable.setSearchRank(1);
    	sable.setDetailedRank(1);
    	sable.setSummaryRank(1);
    	sable.setVocabulary(null);
    	layout.getSearchFields().add(sable);
*/
    	sable = new Searchable();
    	sable.setDescription("Title");
    	sable.setShortDescription("title");
    	sable.setName("title");
    	sable.setIndexType("title");
    	sable.setCssClass("resultsDoctitle");
    	sable.setInSearch(true);
    	sable.setInSummary(true);
    	sable.setInDetail(true);
    	sable.setSearchRank(0);
    	sable.setDetailedRank(0);
    	sable.setSummaryRank(0);
    	sable.setVocabulary(null);
    	layout.getSearchFields().add(sable);
    	
    	sable = new Searchable();
    	sable.setDescription("MDFormats");
    	sable.setShortDescription("MDFormats");
    	sable.setName("md");
    	sable.setIndexType("CobjMDFormats");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(false);
    	sable.setInSummary(true);
    	sable.setInDetail(true);
    	sable.setSearchRank(1);
    	sable.setSummaryRank(1);
    	sable.setDetailedRank(1);
    	sable.setVocabulary(null);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Model");
    	sable.setShortDescription("model");
    	sable.setName("model");
    	sable.setIndexType("CobjModel");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(true);
    	sable.setInDetail(true);
    	sable.setSearchRank(2);
    	sable.setDetailedRank(2);
    	sable.setSummaryRank(2);
    	sable.setVocabulary(null);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Document Language");
    	sable.setShortDescription("language");
    	sable.setName("lang");
    	sable.setIndexType("language");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(false);
    	sable.setInSummary(true);
    	sable.setInDetail(true);
    	sable.setSearchRank(16);
    	sable.setDetailedRank(7);
    	sable.setSummaryRank(7);
    	sable.setVocabulary("Short list of language names");
    	layout.getSearchFields().add(sable);
/*
     	sable = new Searchable();
    	sable.setDescription("Subject");
    	sable.setShortDescription("subject");
    	sable.setName("subject");
    	sable.setIndexType("subject");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(5);
    	sable.setDetailedRank(5);
    	sable.setSummaryRank(5);
    	sable.setVocabulary(null);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Document Type");
    	sable.setShortDescription("category");
    	sable.setName("category");
    	sable.setIndexType("CobjCategory");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(15);
    	sable.setDetailedRank(6);
    	sable.setSummaryRank(6);
    	sable.setVocabulary("Names of Text Object Typologies");
    	layout.getSearchFields().add(sable);


    	sable = new Searchable();
    	sable.setDescription("Publisher");
    	sable.setShortDescription("publisher");
    	sable.setName("publisher");
    	sable.setIndexType("publisher");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(8);
    	sable.setDetailedRank(8);
    	sable.setSummaryRank(8);
    	sable.setVocabulary(null);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Source");
    	sable.setShortDescription("source");
    	sable.setName("source");
    	sable.setIndexType("source");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(false);
    	sable.setInDetail(true);
    	sable.setSearchRank(9);
    	sable.setDetailedRank(9);
    	sable.setSummaryRank(9);
    	sable.setVocabulary(null);
    	layout.getSearchFields().add(sable);


    	sable = new Searchable();
    	sable.setDescription("Relation");
    	sable.setShortDescription("relation");
    	sable.setName("relation");
    	sable.setIndexType("relation");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(false);
    	sable.setInSummary(false);
    	sable.setInDetail(false);
    	sable.setSearchRank(22);
    	sable.setDetailedRank(22);
    	sable.setSummaryRank(22);
    	sable.setVocabulary(null);
    	layout.getSearchFields().add(sable);

    	sable = new Searchable();
    	sable.setDescription("Description");
    	sable.setShortDescription("description");
    	sable.setName("description");
    	sable.setIndexType("description");
    	sable.setCssClass("resultsText");
    	sable.setInSearch(true);
    	sable.setInSummary(true);
    	sable.setInDetail(true);
    	sable.setSearchRank(10);
    	sable.setDetailedRank(10);
    	sable.setSummaryRank(10);
    	sable.setVocabulary(null);
    	layout.getSearchFields().add(sable);
 */   	

    	
    	layout.setCssFile("driver_search_1.css");

        return layout;

	}

	
	private synchronized void updateLists(WebInterfaceLayout layout) {

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

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

			allFields.add(s);
			
			if (s.isInSearch()) {
				searchFields.add(s);
			}
			
			if (s.isInBrowse()){
				browseFields.add(s);
			}
			
			if (s.isInRefine()) {
				refineFields.add(s);
			}
			if (s.isInDetail()) {
				detailFields.add(s);
			}
			if (s.isInSummary()) {
				summaryFields.add(s);
			}
			if (s.getVocabulary() != null) {
				vocabularyNames.add(s.getVocabulary());
			}
		}

		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();
			}
		});
		Collections.sort(detailFields, new Comparator<Searchable>() {
			public int compare(Searchable s1, Searchable s2) {
				return s1.getDetailedRank() - s2.getDetailedRank();
			}
		});
		Collections.sort(summaryFields, new Comparator<Searchable>() {
			public int compare(Searchable s1, Searchable s2) {
				return s1.getSummaryRank() - s2.getSummaryRank();
			}
		});
	}

}

