$(function () {
	function cache () 
	{
		var arr = $.map(checkboxs, function (e) {
			return $(e).attr('name');
		});
		
		var cached = {};
		for(i in arr)
		{
			cached[arr[i]] = [];
		}
		
		$('.cards').each(function (j) {
			for(i in arr)
			{
				if($(this).hasClass(arr[i]))
				{
					cached[arr[i]].push(j);
				}
			}
		});
		
		return cached;
	}
	
	function show_cards()
	{
		var checkboxs_checked = checkboxs.filter(':checked');
		
		if (all.attr('checked'))
		{
			$('div.cards').show();
			$('#noresults').hide();
		}
		else if (checkboxs_checked.length === 0)
		{
			$('div.cards').hide();
			$('#noresults').show();
		}
		else
		{
			var arr = $.map(checkboxs_checked, function (e) {
				return $(e).attr('name'); 
			});
			var show_cards = [];
			var has_result = false;
			
			// For each checkbox
			for (i in arr)
			{
				// See whether theres a card that matches
				for (j in cached[arr[i]])
				{
					var item = cached[arr[i]][j];
					show_cards[item] = true;
				}
			}
			
			// Show and hide the cards
			$('#noresults').hide();
			$('div.cards').each(function (j) {
				if (show_cards[j] === true)
				{
					has_result = true;
					$(this).show();
				}
				else
				{
					$(this).hide();
				}
			});
			
			if (!has_result)
			{
				$('#noresults').show();
			}
		}
	}
	
	function onchange(e) {
		var checked_len = checkboxs.filter(':checked').length;
		
		if ($(e).is('[name="all"]'))
		{
			if ($(e).is(':checked'))
			{
				checkboxs.attr('checked', 'checked');
			}
			else
			{
				checkboxs.attr('checked', '');
			}
		}
		else if (checked_len !== checkboxs_len && all.is(':checked'))
		{
			all.attr('checked', '');
		}
		else if (checked_len === checkboxs_len && !all.is(':checked'))
		{
			all.attr('checked', 'checked');
		}
		
		show_cards();
	}
	
	
	var checkboxs = $('form.selector :checkbox').not('[name="all"]');
	var checkboxs_len = checkboxs.length;
	var all = $('form.selector :checkbox[name="all"]');
	var cards_length = $('.cards').length;
	var cached = cache();
	
	$('form.selector').show();
	show_cards();
	$('form.selector :checkbox').click(function () {
		onchange(this);
	});
	
});
