	
	var fpPref = 'fparam';		// filter param prefix
	
	function restoreFilter() {
		
		if (mp && mp.length > 0) {
			for (mpId in mp) {
				updateFilterParam(mpId, 0);
			}
		}
		
		sv = new Array();
		
	}
	
	
	/**
	 *	selmpId - selected master param id
	 *	selmpiId - selected master param id
	 *	mpId - master param id
	 *	mpiId - master param item id
	 *	spId - slave param id
	 *	spiId - slave param item id
	 */
	function updateFilterParam(selmpId, selmpiId) {
		
		/* check wether param 'any' chosen */
		if (fp[selmpId]['type'] == 'multiselect') {
			if (pi[selmpId] && pi[selmpId].length > 0) {
				
				var allChecked = true;
				var i = 0;
				
				for (piId in pi[selmpId]) {
					if (e = document.getElementById(fpPref + '_' + selmpId + '_' + piId)) {
						if (!e.checked) {
							allChecked = false;
							break;
						}
						i++;
					}
				}
				
				if (i == 0) allChecked = false;
				
				if (selmpiId == -1) {
					
					if (me = document.getElementById(fpPref + '_' + selmpId + '_-1')) {
						for (piId in pi[selmpId]) {
							if (e = document.getElementById(fpPref + '_' + selmpId + '_' + piId)) {
								e.checked = me.checked ? true : false;
							}
						}
					}
					
				} else if (selmpiId > 0) {
					
					if (e = document.getElementById(fpPref + '_' + selmpId + '_-1')) e.checked = allChecked ? true : false;
					
				}
				
			}
		}
			
		if (mp[selmpId]) {
			for (var i = 0; i < mp[selmpId].length; i++) {
				
				var spId = mp[selmpId][i];
				
				clearParamItems(spId);
				
				for (spiId in pil[spId]) {
					
					var tag = (fp[spId]['op'] == '&');
					
					for (mpId in pil[spId][spiId]) {
						
						var isCheckedMP = false;
						
						for (mpiId in pil[spId][spiId][mpId]) {
							
							if (isCheckedMP = isCheckedParamItem(mpId, mpiId)) break;
							
						}
						
						tag = (fp[spId]['op'] == '&') ? tag && isCheckedMP : tag || isCheckedMP;
						
					}
					
					if (tag) createParamItem(spId, spiId);
					
					updateFilterParam(spId, spiId);
					
				}
				
			}
		}
		
	}
	
	/*
	 *	pId - param id
	 */
	function clearParamItems(pId) {
		
		switch (fp[pId]['type']) {
			
			case 'select':
				
				e = document.getElementById(fpPref + '_' + pId);
				if (e) {
					while (e.options.length) {
						e.removeChild(e.options[0]);
					}
				}
				
			break;
			
			case 'multiselect':
				
				e = document.getElementById(fpPref + '_ms_' + pId)
				if (e) {
					while (e.childNodes.length) {
						e.removeChild(e.childNodes[0]);
					}
				}
				
			break;
			
		}
		
		createParamItem(pId, 0);
		createParamItem(pId, -1);
		
	}
	
	
	/*
	 *	pId - param id
	 *	piId - param item id
	 */
	function createParamItem(pId, piId) {
		
		switch (fp[pId]['type']) {
			
			case 'select':
				
				e = document.getElementById(fpPref + '_' + pId);
				if (e) {
					var eOpt = document.createElement('option');
					e.appendChild(eOpt);
					eOpt.innerHTML = (piId == -1) ? GCLang.any : (piId == 0 ? GCLang.chooseParamItem : pi[pId][piId]/* + ' (' + piId + ')'*/);
					eOpt.value = piId;
					if (sv[pId] && sv[pId] == piId) eOpt.selected = true;
				}
				
			break;
			
			case 'multiselect':
				
				if (piId == 0) break;
				
				e = document.getElementById(fpPref + '_ms_' + pId)
				if (e) {
					
					var div = document.createElement('div');
					e.appendChild(div);
					div.id = fpPref + '_ms_' + pId + '_' + piId;
					
					var input = document.createElement(document.all ? '<input name="' + fpPref + '[' + pId + '][]' + '" />' : 'input');
					input.type = 'checkbox';
					div.appendChild(input);
					input.name = fpPref + '[' + pId + '][]';
					input.value = piId;
					input.id = fpPref + '_' + pId + '_' + piId;
					input.onclick = new Function('updateFilterParam(' + pId + ', ' + piId + ');');
					
					if (sv[pId] && sv[pId].length > 0) {
						for (k in sv[pId]) {
							if (sv[pId][k] == piId) {
								input.checked = true;
								break;
							}
						}
					}
					
					var label = document.createElement('label');
					div.appendChild(label);
					label.setAttribute('for', input.id);
					label.htmlFor = input.id;
					label.innerHTML = (piId == -1) ? GCLang.any : pi[pId][piId];
						
				}
				
			break;
			
		}
		
	}
	
	function isCheckedParamItem(pId, piId) {
		
		var selmpiId = 0;
		
		switch (fp[pId]['type']) {
			
			case 'select':
				
				e = document.getElementById(fpPref + '_' + pId);
				if (e && e.selectedIndex > 0) {
					selmpiId = e.options[e.selectedIndex].value;
				}
				
			break;
			
			case 'multiselect':
				
				e = document.getElementsByName(fpPref + '[' + pId + '][]');
				
				if (e && e.length > 0) {
					for (var i = 0; i < e.length; i++) {
						if (e.item(i).value == piId && e.item(i).checked) {
							selmpiId = e.item(i).value;
							break;
						}
					}
				}
				
			break;
			
		}
		
		return (selmpiId == piId || selmpiId == -1) ? true : false;
		
	}
	
	restoreFilter();
	