﻿function ProductFinderConfiguration()
{
	var _filterData = new Array();
	var _filters = new Object();
	var _filterCount = 0;

	this.OnCheckboxStateChanged = function(sender, colIdx, rowIdx)
	{
		var cell = this.FindCell(sender);
		if (sender.IsActive)
			this.AddFilter(colIdx, cell.OptionName);
		else
			this.RemoveFilter(colIdx, cell.OptionName);

		this.UpdateRowState();
	}
	
	function _findCell(/* Checkbox */ cb)
	{
		var container = cb.Container.parentNode.parentNode;
		for (var i = 0; i < this.ProductCells.length; i++)
		{
			if (window[this.ProductCells[i]].Container == container)
				return window[this.ProductCells[i]];
		}
		
		return null;
	}
	this.FindCell = _findCell;
	
	function _updateRowState()
	{
		for (var i = 0; i < this.ProductCells.length; i++)
		{
			var cell = window[this.ProductCells[i]];
			if (this.CheckCell(cell))
			{
				cell.ActiveTemplate.style.display = "block";
				cell.InActiveTemplate.style.display = "none";

				cell.ApplyActiveStyle(cell.Container);
			}
			else
			{
				cell.ActiveTemplate.style.display = "none";
				cell.InActiveTemplate.style.display = "block";

				cell.ApplyInActiveStyle(cell.Container);
			}
		}
	}
	this.UpdateRowState = _updateRowState;
	
	function _checkCell(/* object */ cell)
	{
		if (_filterCount == 0 || _filters[cell.OptionName] != null)
			return true;

		for (var i = 0; i < _filterData.length; i++)
		{
			if (_filterData[i] != null)
			{
				for (var a = 0; a < _filterData[i].length; a++)
				{
					if (_filterData[i][a] == cell.OptionName)
						return true;
				}
			}
		}
		return false;
	}
	this.CheckCell = _checkCell;
	
	function _addFilter(/*int*/ idx, /*string*/value)
	{
		this.EnsureFilterData();
		
		_filters[value] = new Array();
		_filterCount++;

		for (var i = 0; i < _filterData.length; i++)
		{
			if (this.View[i][idx] != value)
			{
				_filters[value].push(i);
				if (_filterData[i] != null)
					_filterData[i] = null;
			}
		}
	}
	this.AddFilter = _addFilter;
	
	function _removeFilter(/*int*/ idx, /*string*/value)
	{
		this.EnsureFilterData();
		
		_filterCount--;

		if (_filterCount == 0)
		{
			_filterData = new Array();
			_filters[value] = null;
			return;
		}
		
		for (var i = 0; i < _filters[value].length; i++)
		{
			var idx = _filters[value][i];
			if (this.IsExclusivFilter(value, idx))
				_filterData[idx] = this.View[idx];
		}
		
		_filters[value] = null;
	}
	this.RemoveFilter = _removeFilter;
	
	function _ensureFilterData()
	{
		if (_filterData.length == 0)
		{
			_filterData = new Array();
			for (var i = 0; i < this.View.length; i++)
				_filterData.push(this.View[i]);

		}
	}
	this.EnsureFilterData = _ensureFilterData;
	
	function _isExclusivFilter(filter, index)
	{
		var result = true;

		for (var filterName in _filters)
		{
			if (filterName != filter && _filters[filterName] != null)
			{
				for (var a = 0; a < _filters[filterName].length; a++)
				{
					if (_filters[filterName][a] == index)
						result = false;
				}
			}
		}
		return result;
	}
	this.IsExclusivFilter = _isExclusivFilter;
}