/*******************************************************************************
 *  Copyright (c) 2009, 2015 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ua.tests.help.webextension;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.help.IToc;
import org.eclipse.help.ITopic;
import org.eclipse.help.internal.webapp.data.TocData;

public class TitleSearchData extends TocData {

public TitleSearchData(ServletContext context, HttpServletRequest request,
			HttpServletResponse response) {
		super(context, request, response);
}

private List<SearchResult> results;
private String searchTerm;

public class SearchResult {
	public String title;
	public String href;
}

public SearchResult[] getSearchResults() {
     results = new ArrayList<SearchResult>();
     searchTerm = request.getParameter("searchWord");
     IToc[] tocs = getTocs();
     for (IToc toc : tocs) {
    	 ITopic[] topics = toc.getTopics();
    	 for (ITopic topic : topics) {
    		 searchTopic(topic);
    	 }
     }
     return results.toArray(new SearchResult[results.size()]);
}

private void searchTopic(ITopic topic) {
	if (topic.getLabel().toLowerCase().indexOf(searchTerm.toLowerCase()) != -1
		&& topic.getHref() != null) {
		SearchResult result = new SearchResult();
		result.title = topic.getLabel();
		result.href = "../../../topic" + topic.getHref();		
		results.add(result);
	}
	ITopic[] topics = topic.getSubtopics();
	for (ITopic topic2 : topics) {
		searchTopic(topic2);
	}
}

}
