/**
 * Panel content for displaying a collection of filters
 *
 * @param id	The id of the control
 */
subclass(RecordListSearch, IRecordListPanelChildContent);
function RecordListSearch(id)
{
  this.id = id
  this.parent = null;
  this.generalSearchAllowed = true;
  this.generalSearchEnabled = true;
  this.generalSearchValue = '';
  this.searchFilters = new Array();
  
  this.onSearch = new REvent();
  this.onReset = new REvent();
  
  RegisterControl.statics.getInstance().add(this);
  
  this.onReset.addEventListener(new REventListener(this.onResetListener, this));
}

/**
 * Gets the id of the search filters
 *
 * @returns	The id of the panel
 */
RecordListSearch.prototype.getId = function()
{
  return this.id;
}

/**
 * Attaches the search filters to a DOM node.
 *
 * @param node	The the DOM node to attach this view to
 */
RecordListSearch.prototype.attach = function(node)
{
  var generalSearch = document.createElement("div");
  generalSearch.id = RegisterControl.statics.encodeId(this, "generalSearch");
  generalSearch.style.padding = "3px";
  generalSearch.style.display = this.IsGeneralSearchInUse()?"block":"none";
  node.appendChild(generalSearch);
  
  var generalSearchInput = document.createElement("input");
  generalSearchInput.type = "text";
  generalSearchInput.id = RegisterControl.statics.encodeId(this, "generalSearchInput");
  generalSearchInput.RecordListSearchId = this.getId();
  generalSearchInput.onkeypress = RecordListSearch.statics.enterPressedEvent;
  if (this.generalSearchValue)
    generalSearchInput.value = this.generalSearchValue;
  generalSearch.appendChild(generalSearchInput);    

  var generalSearchButton = new StyleButton(this.getId()+'_generalSearch', this.getId()+'_generalSearch', 'Search', RecordListSearch.statics.onSearch, null, null, StyleButton.statics.Size["SMALL"]);
  generalSearchButton.PlaceInDom(generalSearch, Mixin_DomInsertable.statics.INSERTMETHOD_APPENDASCHILD);
  generalSearchButton.GetDomNode().instanceId = this.getId();
  if(this.parent && this.parent.GetCollapseDirection()==RecordListPanel.statics.collapseDirection.horizontal)
  {
    generalSearchButton.SetStyle('float', 'right');
    generalSearchButton.SetStyle('margin', '2px 2px 0 0');
  }
  var advancedSearch = document.createElement("div");
  advancedSearch.id = RegisterControl.statics.encodeId(this, "advancedSearch");
  advancedSearch.style.display = this.IsGeneralSearchInUse()?"none":"block";
  node.appendChild(advancedSearch);

  var filters = document.createElement("div");
  filters.id = RegisterControl.statics.encodeId(this, "filters");
  filters.style.overflow = "auto";
  advancedSearch.appendChild(filters);
  
  var table = document.createElement("table");
  table.id = RegisterControl.statics.encodeId(this, "filterTable");
  table.className = "filterList";
  filters.appendChild(table);
  
  var tbody = document.createElement("tbody");
  table.appendChild(tbody);
  
  var tr = null;
  var searchFilters = this.getSearchFilters();
  for (var i in searchFilters)
  {
    var searchFilter = searchFilters[i];
    tr = document.createElement("tr");
    tbody.appendChild(tr);
    searchFilter.attach(tr);
  }

  var buttonBar = document.createElement("div");
  buttonBar.id = RegisterControl.statics.encodeId(this, "buttonBar");
  advancedSearch.appendChild(buttonBar);
  
  div = document.createElement("div");
  div.style.styleFloat = 'right';
  div.style.cssFloat = 'right';
  buttonBar.appendChild(div);
  var searchButton = new StyleButton(this.getId()+'_Search', this.getId()+'_Search', 'Search', RecordListSearch.statics.onSearch, null, null, StyleButton.statics.Size["SMALL"]);
  searchButton.PlaceInDom(div, Mixin_DomInsertable.statics.INSERTMETHOD_APPENDASCHILD);
  searchButton.GetDomNode().instanceId = this.getId();

  var div = document.createElement("div");
  div.style.styleFloat = 'right';
  div.style.cssFloat = 'right';
  buttonBar.appendChild(div);
  var resetButton = new StyleButton(this.getId()+'_Reset', this.getId()+'_Reset', 'Reset', RecordListSearch.statics.onReset, 'Reset the Filter', null, StyleButton.statics.Size["SMALL"]);
  resetButton.PlaceInDom(div, Mixin_DomInsertable.statics.INSERTMETHOD_APPENDASCHILD);
  resetButton.GetDomNode().instanceId = this.getId();

  div = document.createElement("div");
  div.style.height = '1px';
  div.style.overflow = 'hidden';
  div.className = 'clear';
  buttonBar.appendChild(div);
}

/**
 * Called during setup to allow the content to initialize itself.  Eg register events on the parent
 *
 * @param parent	The parent of the content, the panel it is added to
 */
RecordListSearch.prototype.init = function(parent)
{
  this.parent = parent;
  
  if(this.parent.onResize)
    this.parent.onResize.addEventListener(new REventListener(RecordListSearch.prototype.onResizeListener, this));
}

/**
 * Adds a search filter to the collection of search filters in this control
 *
 * @param filter	The filter to add
 */
RecordListSearch.prototype.addSearchFilter = function(filter)
{
  this.searchFilters.push(filter);
  filter.init(this);
}

/**
 * Gets a list of the filter in this control
 *
 * @returns	A list of the filter in this control
 */
RecordListSearch.prototype.getSearchFilters = function()
{
  return this.searchFilters;
}

/**
 * Used to tell the panel if the panel should handle scrolling or if the content will do it itself
 *
 * @returns if the content handles its own scrolling
 */
RecordListSearch.prototype.handlesScrolling = function()
{
  return true;
}

/**
 * Used to tell the panel if the panel if the content is collapsible
 *
 * @returns if the content is collapsible
 */
RecordListSearch.prototype.isCollapsible = function()
{
  if(this.generalSearchAllowed)
    return true;
  return false;
}

/**
 * Gets the present collapsed state of the content
 *
 * @returns if the content is in its collapsed state
 */
RecordListSearch.prototype.getCollapsed = function()
{
  return this.IsGeneralSearchInUse();
}

/**
 * Sets the collapsed state of the content
 *
 * @param collapsed	If the content should be collapsed or not
 */
RecordListSearch.prototype.setCollapsed = function(collapsed)
{
  this.generalSearchEnabled = collapsed;

  var generalSearch = document.getElementById(RegisterControl.statics.encodeId(this, "generalSearch"));
  var advancedSearch = document.getElementById(RegisterControl.statics.encodeId(this, "advancedSearch"));
  if(generalSearch && advancedSearch)
  {
    generalSearch.style.display = this.IsGeneralSearchInUse()?"block":"none";
    advancedSearch.style.display = this.IsGeneralSearchInUse()?"none":"block";
  }
}

/**
 * Gets the amount of vertical space the content would like.
 *
 * @returns The height it would like
 */
RecordListSearch.prototype.getDesiredHeight = function()
{
  var generalSearch = document.getElementById(RegisterControl.statics.encodeId(this, "generalSearch"));
  var filterTable = document.getElementById(RegisterControl.statics.encodeId(this, "filterTable"));
  var buttonBar = document.getElementById(RegisterControl.statics.encodeId(this, "buttonBar"));
  
  if (this.IsGeneralSearchInUse())
    return generalSearch.offsetHeight + buttonBar.offsetHeight + 6;
  else
    return filterTable.offsetHeight + buttonBar.offsetHeight + 24;
}

/**
 * Gets if general search mode is enabled
 *
 * @returns If general search mode is enabled
 */
RecordListSearch.prototype.getGeneralSearchEnabled = function()
{
  return this.generalSearchEnabled;
}

/**
 * Sets if general search mode is enabled
 *
 * @param e If general search mode is enabled
 */
RecordListSearch.prototype.setGeneralSearchEnabled = function(e)
{
  this.generalSearchEnabled = e;
}

/**
 * GEts if the general search is presently in use in the gui
 */
RecordListSearch.prototype.IsGeneralSearchInUse = function()
{
  return (this.generalSearchEnabled && this.generalSearchAllowed);
}

/**
 * Gets the value entered in the general search box
 *
 * @returns The value entered for general search
 */
RecordListSearch.prototype.getGeneralSearchValue = function()
{
  var generalSearchInput = document.getElementById(RegisterControl.statics.encodeId(this, "generalSearchInput"));
  if (generalSearchInput)
    this.generalSearchValue = generalSearchInput.value;
  return this.generalSearchValue;
}

/**
 * Sets the value entered in the general search box
 *
 * @param value The new value
 */
RecordListSearch.prototype.setGeneralSearchValue = function(value)
{
  this.generalSearchValue = value;
  var generalSearchInput = document.getElementById(RegisterControl.statics.encodeId(this, "generalSearchInput"));
  if (generalSearchInput)
    generalSearchInput.value = this.generalSearchValue;
}

/**
 * Gets a list of the values entered in each of the filters this control contains
 *
 * @returns An array of all the values in the same order that the filters are in this control
 */
RecordListSearch.prototype.getSearchValueList = function()
{
  var searchValues = new Array();
  var searchFilters = this.getSearchFilters();
  for (var i in searchFilters)
  {
    var searchFilterValue = searchFilters[i].getValue();
    if(searchFilterValue)
      searchValues[searchValues.length] = searchFilterValue;
    else
      searchValues[searchValues.length] = '';
  }
  return searchValues;
}

/**
 * Handles a user pressing the reset button.  Sets each filter to its defualt state.
 */
RecordListSearch.prototype.onResetListener = function()
{
  if (this.getGeneralSearchEnabled())
  {
    this.setGeneralSearchValue('');
  }
  else
  {
    var searchFilters = this.getSearchFilters();
    for (var i in searchFilters)
    {
      searchFilters[i].setValue(null);
    }
  }
}

/**
 * Handles being resized.  Updated the content sizes based on the container's size.
 */
RecordListSearch.prototype.onResizeListener = function()
{
  var filters = document.getElementById(RegisterControl.statics.encodeId(this, "filters"));
  var buttonBar = document.getElementById(RegisterControl.statics.encodeId(this, "buttonBar"));
  
  var remainingHeight = parseInt(filters.parentNode.parentNode.offsetHeight) - buttonBar.offsetHeight - 2;
  var remainingWidth = parseInt(filters.parentNode.parentNode.offsetWidth) - 2;
  filters.style.height = ((0<remainingHeight)?remainingHeight:1) + "px";
  filters.style.width = ((0<remainingWidth)?remainingWidth:1) + "px";

  if(this.parent && this.parent.GetCollapseDirection()==RecordListPanel.statics.collapseDirection.horizontal)
  {
    var generalSearchInput = document.getElementById(RegisterControl.statics.encodeId(this, "generalSearchInput"));
    remainingWidth -= 10;
    generalSearchInput.style.width = ((0<remainingWidth)?remainingWidth:1) + "px";
  }
}

/**
 * Set if this search grid should allow its search to be in generic mode
 *
 * @param e	If general search should be allowed
 */
RecordListSearch.prototype.setAllowGeneralSearch = function(e)
{
    this.generalSearchAllowed = e;
}

RecordListSearch.statics = new Object();

/**
 * Static functions to get called DOM events from the gui and trigger the appropriate REvent
 */
RecordListSearch.statics.eventDispatch = function(id, event)
{
  var params = new Array();
  var instance = RegisterControl.statics.decodeId(id, params);
  instance[event].trigger();
}
RecordListSearch.statics.onSearch = function() { RecordListSearch.statics.eventDispatch(this.instanceId, "onSearch"); }
RecordListSearch.statics.onReset  = function() { RecordListSearch.statics.eventDispatch(this.instanceId, "onReset"); }

RecordListSearch.statics.enterPressedEvent = function(event)
{
  if (this.RecordListSearchId)
  {
    var params = new Array();
    var instance = RegisterControl.statics.decodeId(this.RecordListSearchId, params);

    var keyNumber = null;
    if(window.event)
      keyNumber = window.event.keyCode;
    else if(event.which)
      keyNumber = event.which;

    if (13==keyNumber && instance && instance.onSearch)
    {
      instance.onSearch.trigger();
    }
  }
}
