/*
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * (the "License"); you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at <http://www.mozilla.org/MPL/>.
 * 
 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
 * language governing rights and limitations under the License.
 * 
 * The Original Code is the Venice Web Communities System.
 * 
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 * for Silverwrist Design Studios.  Portions created by Eric J. Bowersox are
 * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios.  All Rights Reserved.
 * 
 * Contributor(s): 
 */
package com.silverwrist.venice.servlets.format;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.silverwrist.venice.core.*;
import com.silverwrist.venice.except.*;

public class ViewCommunityMembers implements JSPRender, SearchMode
{
  /*--------------------------------------------------------------------------------
   * Static data members
   *--------------------------------------------------------------------------------
   */

  // Attribute name for request attribute
  protected static final String ATTR_NAME = "com.silverwrist.venice.content.ViewCommunityMembers";

  /*--------------------------------------------------------------------------------
   * Attributes
   *--------------------------------------------------------------------------------
   */

  private VeniceEngine engine;            // engine context
  private CommunityContext comm;          // community context
  private List display_list = null;       // list of members to display
  private boolean simple_list = false;    // simple list?
  private int field = -1;                 // search field
  private int mode = -1;                  // search mode
  private String term = null;             // search term
  private int offset = 0;                 // search result offset
  private int find_count = -1;            // search results count

  /*--------------------------------------------------------------------------------
   * Constructor
   *--------------------------------------------------------------------------------
   */

  public ViewCommunityMembers(VeniceEngine engine, CommunityContext comm)
  {
    this.engine = engine;
    this.comm = comm;

  } // end constructor

  /*--------------------------------------------------------------------------------
   * Internal functions
   *--------------------------------------------------------------------------------
   */

  private static int getParamInt(ServletRequest request, String name, int default_val)
  {
    String str = request.getParameter(name);
    if (str==null)
      return -1;

    try
    { // parse the integer value
      return Integer.parseInt(str);

    } // end try
    catch (NumberFormatException nfe)
    { // in case of conversion error, return default
      return default_val;

    } // end catch

  } // end getParamInt

  private static boolean isImageButtonClicked(ServletRequest request, String name)
  {
    String val = request.getParameter(name + ".x");
    return (val!=null);

  } // end isImageButtonClicked

  /*--------------------------------------------------------------------------------
   * External static functions
   *--------------------------------------------------------------------------------
   */

  public static ViewCommunityMembers retrieve(ServletRequest request)
  {
    return (ViewCommunityMembers)(request.getAttribute(ATTR_NAME));

  } // end retrieve

  /*--------------------------------------------------------------------------------
   * Implementations from interface VeniceContent
   *--------------------------------------------------------------------------------
   */

  public String getPageTitle(RenderData rdat)
  {
    return "Members of Community " + comm.getName();

  } // end getPageTitle

  public String getPageQID()
  {
    return null;

  } // end getPageQID

  /*--------------------------------------------------------------------------------
   * Implementations from interface JSPRender
   *--------------------------------------------------------------------------------
   */

  public void store(ServletRequest request)
  {
    request.setAttribute(ATTR_NAME,this);

  } // end store

  public String getTargetJSPName()
  {
    return "view_member.jsp";

  } // end getTargetJSPName

  /*--------------------------------------------------------------------------------
   * External operations
   *--------------------------------------------------------------------------------
   */

  public void doInitialList() throws DataException
  {
    display_list = comm.getMemberList();
    simple_list = true;
    term = "";
    offset = 0;
    find_count = display_list.size();

  } // end doInitialList

  public void doSearch(ServletRequest request) throws ValidationException, DataException
  {
    // Get the "simple list" parameter.
    int slp = getParamInt(request,"sl",1);
    simple_list = (slp==1);

    if (simple_list)
    { // Retrieve the offset and find count parameters.
      offset = getParamInt(request,"ofs",0);
      find_count = getParamInt(request,"fcount",-1);

      // Adjust the search return offset based on the command button click.
      int count = getNumResultsDisplayed();
      if (isImageButtonClicked(request,"search"))
	throw new ValidationException("Invalid button click.");  // this can't happen
      else if (isImageButtonClicked(request,"previous"))
      { // adjust the offset in the reverse direction
	offset -= count;
	if (offset<0)
	  offset = 0;

      } // end else if
      else if (isImageButtonClicked(request,"next"))
	offset += count;  // go forwards instead
      else
	throw new ValidationException("Unable to determine what action triggered the form.");

      // Get the member list and offset it if necessary.
      List tmp = comm.getMemberList();
      if (find_count<0)
	find_count = tmp.size();
      if (offset>0)
	display_list = tmp.subList(offset,tmp.size());
      else
	display_list = tmp;

      term = "";  // null out the search term

    } // end if
    else
    { // Validate the search field parameter.
      field = getParamInt(request,"field",FIELD_USER_NAME);
      if (   (field!=FIELD_USER_NAME) && (field!=FIELD_USER_DESCRIPTION) && (field!=FIELD_USER_GIVEN_NAME)
	  && (field!=FIELD_USER_FAMILY_NAME))
	throw new ValidationException("The field search parameter is not valid.");

      // Validate the search mode parameter.
      mode = getParamInt(request,"mode",SEARCH_PREFIX);
      if ((mode!=SEARCH_PREFIX) && (mode!=SEARCH_SUBSTRING) && (mode!=SEARCH_REGEXP))
	throw new ValidationException("The search mode parameter is not valid.");

      // Retrieve the search term parameter.
      term = request.getParameter("term");
      if (term==null)
	term = "";

      // Retrieve the offset and find count parameters.
      offset = getParamInt(request,"ofs",0);
      find_count = getParamInt(request,"fcount",-1);

      // Adjust the search return offset based on the command button click.
      int count = getNumResultsDisplayed();
      if (isImageButtonClicked(request,"search"))
	offset = 0;
      else if (isImageButtonClicked(request,"previous"))
      { // adjust the offset in the reverse direction
	offset -= count;
	if (offset<0)
	  offset = 0;

      } // end else if
      else if (isImageButtonClicked(request,"next"))
	offset += count;  // go forwards instead
      else
	throw new ValidationException("Unable to determine what action triggered the form.");

      // Perform the search!
      display_list = comm.searchForMembers(field,mode,term,offset,count);
      if (find_count<0)
	find_count = comm.getSearchMemberCount(field,mode,term);

    } // end else

  } // end doSearch

  public int getNumResultsDisplayed()
  {
    return engine.getStdNumSearchResults();

  } // end getNumResultsDisplayed

  public String getCommunityName()
  {
    return comm.getName();

  } // end getCommunityName

  public int getCommunityID()
  {
    return comm.getCommunityID();

  } // end getCommunityID

  public boolean getSimpleList()
  {
    return simple_list;

  } // end getSimpleList

  public int getSimpleListParam()
  {
    return (simple_list ? 1 : 0);

  } // end getSimpleListParam

  public int getSearchField()
  {
    return field;

  } // end getSearchField

  public int getSearchMode()
  {
    return mode;

  } // end getSearchMode

  public boolean searchFieldIs(int value)
  {
    return (field==value);

  } // end searchFieldIs

  public boolean searchModeIs(int value)
  {
    return (mode==value);

  } // end searchModeIs

  public String getSearchTerm()
  {
    return term;

  } // end getSearchTerm

  public int getFindCount()
  {
    return find_count;

  } // end getFindCount

  public int getOffset()
  {
    return offset;

  } // end getOffset

  public int getSize()
  {
    return display_list.size();

  } // end getSize

  public boolean displayList()
  {
    if ((display_list==null) || (display_list.size()==0))
      return false;
    return true;

  } // end displayList

  public UserFound getItem(int ndx)
  {
    return (UserFound)(display_list.get(ndx));

  } // end getItem

} // end class ViewCommunityMembers
