// Use this to add a non-destructive filter to a data set.

Spry.Data.DataSet.prototype.addFilter = function (filterFunc) {
	
	var i;
	
	if (!this.activeFilters) this.activeFilters = [];
	
	for (i = 0; i < this.activeFilters.length; i++) if (this.activeFilters[i] == filterFunc) return;
	
	this.activeFilters.push(filterFunc);
	this.filter(FilterExecutionController);
	
}

Spry.Data.DataSet.prototype.removeFilter = function (filterFunc) {

	var i;
	
	if (!this.activeFilters) this.activeFilters = [];

	if (this.activeFilters && this.activeFilters.length) {
	
		for (i = 0; i < this.activeFilters.length; i++) {
			if (this.activeFilters[i] == filterFunc) {
				this.activeFilters.splice(i, 1);
			}
		}
	
		this.filter(FilterExecutionController);
	
	}

}

function FilterExecutionController (ds, row, rowNumber) {
	
	var i;
	
	if (!ds.activeFilters) ds.activeFilters = [];
	
	if (ds.activeFilters && ds.activeFilters.length) {
		
		for (i = 0; i < ds.activeFilters.length; i++) {
			
			row = ds.activeFilters[i](ds, row, rowNumber);
			if (!row) break;
			
		}
		
	}
	
	return row;
	
}

Spry.Data.DataSet.prototype.removeAllFilters = function () {
	
	delete this.activefilters;
	this.filter(null);

}

Spry.Data.DataSet.prototype.columnSum = function (columnName) {
		
	var sum = 0;
	var rowCount = this.getRowCount();
	
	for (var i = 0; i < rowCount; i++) sum += Number(this.getRowByRowNumber(i)[columnName]);
	
	return sum;

}

Spry.Data.DataSet.prototype.columnAverage = function (columnName) {
		
	var sum = this.columnSum(columnName);
	var rowCount = this.getRowCount();
	
	return sum / rowCount;

}

Spry.Data.DataSet.prototype.getColumnAsArray = function (columnName) {
	
	var rowCount = this.getRowCount();
	var aReturn = [];
	
	for (var i = 0; i < rowCount; i++) aReturn[i] = this.getRowByRowNumber(i)[columnName];
	
	return aReturn;
	
}

Spry.Data.DataSet.prototype.textSearch = function (text, columnName) {
	
	if (this._searchColumns == undefined) this._searchColumns = new Object();
	
	this.removeFilter(this.textSearchFilter);
	
	if (columnName.length) {
	
		this._searchColumns[columnName] = text;
		this.addFilter(this.textSearchFilter);
	
	}
	
}

Spry.Data.DataSet.prototype.textSearchFilter = function(ds, row, rowNumber)
{
	
	var returnVal = row;
	
	// loop through each column in which a filter is required
	for (var columnName in ds._searchColumns) {
	
		var regExp = new RegExp(ds._searchColumns[columnName]);
		var str = row[columnName];
		
		if (regExp && (!str || str.search(regExp) == -1)) returnVal = null;
		
	}
	
	return returnVal;
	
};
