/**
 * Removes duplicates in the array 'a'
 * @author Johan Kanngard, http://johankanngard.net/
 */
function unique(a) {
	tmp = new Array(0);
	for(i = 0; i < a.length; i++) {
		if(!contains(tmp, a[i])) {
			tmp.length += 1;
			tmp[tmp.length - 1] = a[i];
		}
	}
	return tmp;
}

/**
 * Returns true if 's' is contained in the array 'a'
 * @author Johan Kanngard, http://johankanngard.net/
 */
function contains(a, e) {
	for(j = 0; j < a.length; j++)
		if(a[j] == e)
			return true;
			
	return false;
}

function removeItems(array, item) {
	var i = 0;
	while (i < array.length) {
		if (array[i] == item) {
			array.splice(i, 1);
		} 
		else {
			i++;
		}
	}
	return array;
}

function GetResultsToRemoveFromFilters(arrayClasses, totalNumberOfItemsToFilter) {
	// borrowed from http://stackoverflow.com/questions/348021/counting-results-in-an-array
	// for counting up items.  do i even need this?
	var result = new Object();
	for (var filterClass in arrayClasses) {
		if (result[arrayClasses[filterClass]] === undefined) {
			result[arrayClasses[filterClass]] = 1;
		} 
		else {
			result[arrayClasses[filterClass]]++;
		}
	}
	var resultsToRemoveFromFilters = new Array();
	for (var item in result) {
		if (result[item] == totalNumberOfItemsToFilter) {
			resultsToRemoveFromFilters.push(item);
		}
	}
	// --
	return resultsToRemoveFromFilters;
}

$(document).ready(function () {

	$('.filters p').remove();
	$('.selected p').remove();

	var stringOfClassNames = '';

	$('.filterThis > li:visible').each( function (i) {
		var thisClassString = $(this).attr('class');
		stringOfClassNames = stringOfClassNames + ' ' + thisClassString;
	});
	
	stringOfClassNames = jQuery.trim(stringOfClassNames);
	var arrayClasses = stringOfClassNames.split(' ');
	var arrayClasses = arrayClasses.sort();
	
	totalNumberOfItemsToFilter = $('.filterThis > li').length;
	resultsToRemoveFromFilters = GetResultsToRemoveFromFilters(arrayClasses, totalNumberOfItemsToFilter);
	arrayUniqueClasses = (unique(arrayClasses));

	if (arrayUniqueClasses.length > 1) {
		$.each(arrayUniqueClasses, function() {
			$('<li><input class="dynamicFilterInput" type="checkbox" value="' + this + '" id="filterID' + this + '" /> <label for="filterID' + this + '">' + this + '<\/label><\/li>').appendTo('ul.filters');
		});
		
		$('.filters input').live('click', function() {
			var value = $(this).val();
			stringValue = '.filterThis > li:not(.' + value + ')';
			if ($(this).is(':checked')) {
				$(stringValue).hide();
				
				$('.selected').append('<li><input class="' + value + '" type="checkbox" checked="checked" value="' + value + '" id="filterID' + value + '" /> <label>' + value + '<\/label><\/li>');
			
				$('.filters').empty();
				var stringOfClassNames = '';

				$('.filterThis > li:visible').each(function (i) {
					var thisClassString = $(this).attr('class');
					stringOfClassNames = stringOfClassNames + ' ' + thisClassString;
				});
				
				stringOfClassNames = jQuery.trim(stringOfClassNames);
				var arrayClasses = stringOfClassNames.split(' ');
				arrayClasses = arrayClasses.sort();

				resultsToRemoveFromFilters = GetResultsToRemoveFromFilters(arrayClasses, totalNumberOfItemsToFilter);
				arrayUniqueClasses = (unique(arrayClasses));

				var arrayUniqueClasses = (unique(arrayClasses));
				$.each(arrayUniqueClasses, function() {
					if ($('.selected li input.' + this).length == 0)
						$('<li><input class="dynamicFilterInput" type="checkbox" value="' + this + '" id="filterID' + this + '" /> <label for="filterID' + this + '">' + this + '<\/label><\/li>').appendTo('ul.filters');
				});
			}
		});
		
		$('.selected input').live('click', function() {
			var value = $(this).val();
			stringValue = '.filterThis > li.' + value;
			
			if ($(this).is(':not(:checked)')) {
				$(this).parent().remove();
				
				var stringOfClassNames = '';
				$('.selected li input').each(function (i) {
					var thisClassString = $(this).attr('class');
					stringOfClassNames = stringOfClassNames + '.' + thisClassString;
				});
				if (jQuery.trim(stringOfClassNames) == '') {
					$('.filterThis > li').show();
				}
				else {
					$('.filterThis > li:not(' + stringOfClassNames + ')').hide();
					$('.filterThis > li' + stringOfClassNames).show();
				}
				
				$('.filters').empty();
				var stringOfClassNames = '';

				$('.filterThis > li:visible').each(function (i) {
					var thisClassString = $(this).attr('class');
					stringOfClassNames = stringOfClassNames + ' ' + thisClassString;
				});
				
				stringOfClassNames = jQuery.trim(stringOfClassNames);
				var arrayClasses = stringOfClassNames.split(' ');
				arrayClasses = arrayClasses.sort();

				resultsToRemoveFromFilters = GetResultsToRemoveFromFilters(arrayClasses, totalNumberOfItemsToFilter);
				arrayUniqueClasses = (unique(arrayClasses));

				var arrayUniqueClasses = (unique(arrayClasses));
				$.each(arrayUniqueClasses, function() {
					if ($('.selected li input.' + this).length == 0)
						$('<li><input class="dynamicFilterInput" type="checkbox" value="' + this + '" id="filterID' + this + '" /> <label for="filterID' + this + '">' + this + '<\/label><\/li>').appendTo('ul.filters');
				});
			}
		});
	}
});
