function filterBildansicht(criteria) {
	var result = new Object();
	var inactiveSlider = getInactiveSlider();

	// check if no criterias are active
	var active_criteria = isCriteriaActive(criteria, inactiveSlider);
		
	var filterFnMG = getFilterFunctionMG(criteria, inactiveSlider);
	var filterFn = getFilterFunction(criteria, inactiveSlider);
	
	// Kriterien Modellgruppe pruefen
	for (i = 0; i < modellData.length; i++) {
		var modellGruppe = modellData[i];
		
		if (!result[modellGruppe.mg])
			result[modellGruppe.mg] = false;
		else
			continue;
		
		if (!active_criteria)
			continue;

		if (!filterFnMG(modellGruppe))
			result[modellGruppe.mg] = false;
		else {
			var modellFilter = false;
			
			// Kriterien Modelle pruefen
			for (j = 0; j < modellGruppe.modelle.length; j++) {
				var modell = modellGruppe.modelle[j];				

				if (filterFn(modell)) {
					modellFilter = true;
					break;
				}
			}
			result[modellGruppe.mg] = modellFilter;			
		}				
	}
	
	filterFnMG = null;
	filterFn = null;	

	// show/hide the corresponding modell images
	for(var mgn in result) {
		var tdElm = $('#mgn' + mgn);
		// if no criteria active show all pictures at started state
		if (!active_criteria) {
			if(!tdElm.hasClass('enabled')) 
				tdElm.removeClass('overlay').addClass('enabled');
			tdElm.children('.normal').show();
			tdElm.children('.active').hide();
		} else if (result[mgn]) {
			if(!tdElm.hasClass('enabled')) 
				tdElm.removeClass('overlay').addClass('enabled');
			if(!style.isAudi) {
				tdElm.children('.normal').hide();
				tdElm.children('.active').show();
			}
		} else {
			if(tdElm.hasClass('enabled')) 
				tdElm.removeClass('enabled').addClass('overlay');
			if(!style.isAudi) {
				tdElm.children('.active').hide();
				tdElm.children('.normal').show();
			}
		}
	}
}

function filterListenansicht(criteria) {
	var inactiveSlider = getInactiveSlider();	
	var filterFn = getFilterFunction(criteria, inactiveSlider);
	
	for (var i = 0; i < modellData.length; i++) {
		var modellGruppe = modellData[i];					
		
		var mgcnt = modellGruppe.modelle.length;
		for (var j = 0; j < modellGruppe.modelle.length; j++) {
			var modell = modellGruppe.modelle[j];
			if (filterFn(modell)) {
				$('#modell_' + modell.modell).show();
			} else  {
				$('#modell_' + modell.modell).hide();
				mgcnt--;
			}
		}
		// Ein- und Ausblenden der Elemente		
		if (mgcnt > 0){ 
			$('#head_mg_' + modellGruppe.mg).show();
			$('#body_mg_' + modellGruppe.mg).show();
		} else {
			$('#head_mg_' + modellGruppe.mg).hide();
			$('#body_mg_' + modellGruppe.mg).hide();
		}
	}
	
	filterFn = null;
	
	// vorher gewaehlten Radio-Button deaktivieren
	$("input:radio[name='modellcode']").attr('checked','');
	
	layoutManager.updateInfoSize();
	hideWaitDiv();
}

function filterModellansicht(criteria, mgn)
{
	var inactiveSlider = getInactiveSlider();
	var filterFn = getFilterFunction(criteria, inactiveSlider);
	
	for (var i = 0; i < modellData.length; i++) {
		var modellGruppe = modellData[i];		
		if (modellGruppe.mg == mgn) {
			var mgcnt = 0;
			for (var j = 0; j < modellGruppe.modelle.length; j++) {
				var modell = modellGruppe.modelle[j];						
				
				var $modell_temp = replaceWeirdChars("#modell_" + modell.modell);
				var $head_temp = replaceWeirdChars("#head_av_" + modell.av);
				var $body_temp = replaceWeirdChars("#body_av_" + modell.av);
				
				if (j == 0 || modell.av == modellGruppe.modelle[j-1].av)
					mgcnt++;
				else {
					mgcnt = 1; // zurueck setzen wenn die Ausstattungsvariante wechselt
				}
				
				if (filterFn(modell)) {
					$($modell_temp).show();
					$($head_temp).show();
					$($body_temp).show();
				} else {
					$($modell_temp).hide();
					if (mgcnt > 0)
						mgcnt--;
					if (mgcnt == 0)	{ 
						$($head_temp).hide();
						$($body_temp).hide();
					}
				}
			}
		}
	}
	
	filterFn = null;
	
	// Liste mit eventuell vorausgewaehlter Aust.-Var. einschraenken 
	if (actAustVar != '')
		actionContentAuswahlOnChange(actAustVar);
	// vorher gewaehlten Radio-Button deaktivieren
	$("input:radio[name='modellcode']").attr('checked','');

	layoutManager.updateInfoSize();
}

function contains(arr, value){
	for (var i in arr) {
		if (arr[i] == value) 
			return true;
	}
	return false;
}

function contains_values(arr, values){
	for(var i in values){
		if(contains(arr, values[i]))
			return true;
	}
	return false;
}

function getFilterFunctionMG(criteria, disabledSlider){	
	var code = [];
	for (var property in criteria) {
		var c = criteria[property];				
				
		switch (c.type) {
			case "select": 
				if (c.value && c.value != 'nothing')
					code.push("contains(md['" + property + "'], '" + c.value + "')");
			    break;
			case "slider": 
				// Slider nicht aktiv
				if (property == disabledSlider) 
					break;
		
				code.push("md['" + property + "'][1] >= " + c.value[0] + " && md['" + property + "'][0] <= " + c.value[1]);
				break;
			case "checkbox": 
				  if (c.value.length == 0)
				  	break;

				  code.push("contains_values(" + list_code(c.value) + ", md['" + property + "'])");
				  break;
			case "filter": 
					if (c.value)
						code.push("md['" + property + "']");
					break;
		}	
	}
	return new Function("md", "return (" + code.join(") && (") + ");");
}

function getFilterFunction(criteria, disabledSlider){	
	var code = [];
	for (var property in criteria) {
		var c = criteria[property];				
				
		switch (c.type) {
			case "select": 
				if (c.value && c.value != 'nothing')
					code.push("md['" + property + "'] == '" + c.value + "'");
			    break;
			case "slider": 
				// Slider nicht aktiv
				if (property == disabledSlider) 
					break;
		
				code.push("md['" + property + "'] >= " + c.value[0] + " && md['" + property + "'] <= " + c.value[1]);
				break;
			case "checkbox": 
				  if (c.value.length == 0)
				  	break;

				  code.push("contains(" + list_code(c.value) + ", md['" + property + "'])");
				  break;
			case "filter": 
					if (c.value)
						code.push("md['" + property + "']");
					break;
		}	
	}
	return new Function("md", "return (" + code.join(") && (") + ");");
}

function isCriteriaActive(criteria, disabledSlider) {
	var active_criteria = false;
	for (var property in criteria) {
		var c = criteria[property];
		switch (c.type) {
			case "checkbox":
				if (c.value.length != 0)
					active_criteria = true;
			break;				
			case "filter":
				if (c.value) 
					active_criteria = true;
			break;
			case "select":
				if(c.value != 'nothing')
					active_criteria = true;
			break;
			case "slider":
				for (var critName in sliders) {
					var actSlider = sliders[critName];
					if (actSlider.name == disabledSlider) 
						continue;
					if (property == actSlider.name && !(c.value[0] == actSlider.minValue && c.value[1] == actSlider.maxValue)) {
						active_criteria = true;
						break;
					}
				}

			break;
		}
		if (active_criteria) 
			break;
	}
	return active_criteria;
}

function getInactiveSlider(){
	var result;
	// welcher Slider ist nicht aktiv
	$("input[name='LEISTUNG']").each (function() {
			if (!this.checked) {
				result = this.value;
				return false;
			}
	});
	return result;
}

function list_code(l){
	var r = "["
	for (x in l){
		if(r.length > 1)
			r += ', ';
		r += "'" + l[x] + "'";
	}
	return r + "]"
}


