function Filter(
	itsFilterFunction,					// the function to get the filtered data
	itsLastFilteredDataHandlerFunction,	// the action to take on the old filtered data before filtering again
	itsNextFilteredDataHandlerFunction)	// the action to take on the newly filtered data
{
	var self = this;
	var itsFilterParameters;
	var itsFilteredData;


	this.filter = function(inFilterParameters)
	{
		self.setFilteredData(itsFilterFunction(inFilterParameters),inFilterParameters);
	};


	this.setFilteredData = function(inFilteredData,inFilterParameters)
	{
		if (itsFilteredData != null)
			itsLastFilteredDataHandlerFunction(itsFilteredData);
		itsFilteredData = inFilteredData;
		itsFilterParameters = inFilterParameters;
		if (itsFilteredData != null && itsNextFilteredDataHandlerFunction != null)
			itsNextFilteredDataHandlerFunction(itsFilteredData);
	};


	this.getFilteredData = function()
	{
		return (itsFilteredData);
	};


	this.getFilterParameters = function()
	{
		return (itsFilterParameters);
	};
}


Filter.utilities = new Object();

Filter.utilities.setDisplayStyle = function(inData,inElementGroupPropertyName,inDisplay)
{
	var i,j,theGroup;

	for (i = 0; i < inData.length; i++)
	{
		theGroup = inData[i][inElementGroupPropertyName];
		for (j = 0; j < theGroup.length; j++)
			theGroup[j].style.display = inDisplay;
	}
};


function SingleTrimQueryTableDisplayStyleFilter(inData,inSelectClause,inElementPropertyName)
{
	return (new Filter(
		TrimQueryUtilities.getFilterFunctionByWhereClauseFunction(inData,inSelectClause,TrimQueryUtilities.getPropertiesDrivenWhereEqualsClause),
		ParameterBinding.bind2And3Of3(Filter.utilities.setDisplayStyle,inElementPropertyName,"none"),
		ParameterBinding.bind2And3Of3(Filter.utilities.setDisplayStyle,inElementPropertyName,"")));
}
