/*
 * 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.util.*;
import javax.servlet.*;
import com.silverwrist.util.StringUtil;
import com.silverwrist.venice.core.*;
import com.silverwrist.venice.except.*;

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

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

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

  private VeniceEngine engine;
  private int field = -1;
  private int mode = -1;
  private String term = null;
  private int offset = 0;
  private List results = null;
  private int find_count = -1;

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

  public AdminFindUser(VeniceEngine engine)
  {
    this.engine = engine;

  } // 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 AdminFindUser retrieve(ServletRequest request)
  {
    return (AdminFindUser)(request.getAttribute(ATTR_NAME));

  } // end retrieve

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

  public String getPageTitle(RenderData rdat)
  {
    return "User Account Management";

  } // end getPageTitle

  public String getPageQID()
  {
    return "sysadmin?cmd=UF";

  } // end getPageQID

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

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

  } // end store

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

  } // end getTargetJSPName

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

  public int getSearchField()
  {
    return field;

  } // end getSearchField

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

  } // end searchFieldIs

  public int getSearchMode()
  {
    return mode;

  } // end getSearchMode

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

  } // end searchModeIs

  public String getSearchTerm()
  {
    return term;

  } // end getSearchTerm

  public List getResultsList()
  {
    return results;

  } // end getResultsList

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

  } // end getNumResultsDisplayed

  public int getFindCount()
  {
    return find_count;

  } // end getFindCount

  public int getOffset()
  {
    return offset;

  } // end getOffset

  public void loadGet()
  {
    field = FIELD_USER_NAME;
    mode = SEARCH_PREFIX;
    term = "";

  } // end loadGet

  public void loadPost(ServletRequest request) throws ValidationException, DataException
  {
    int catid = -1;

    // Retrieve all the posted parameters from the form and validate them.
    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.");
    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.");
    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.");

    // Run the actual search.
    results = engine.searchForUsers(field,mode,term,offset,count);
    if (find_count<0)
      find_count = engine.getSearchUserCount(field,mode,term);

  } // end loadPost

} // end class AdminFindUser
