/*	To do:
*
*	1. Exception handling for unfulfilled JSON request.
*	2. Select red and move high filter down to bottom: Appears to reset the filters.	X ?
*	3. Counters		X
*	4. Need to be able to reset the slider	X
*	5. cast floats to int for price slider.
*/

(function($)
{
	$.frescafilter = {
		products: [],
		filters: [],
		priceFilter: null,
		
		options: {
			url: null,
			productsPerPage: 25,
			startAllProductsVisible: true
		},
		
		initialize: function(options){
			$.extend($.frescafilter.options, options);
			$.frescafilter.getData();
		},
		
		getData: function(){
			$.getJSON($.frescafilter.options.url, function(data){
				$.frescafilter.getProducts(data);
				$.frescafilter.getFilters(data);
				$.frescafilter.buildNavs();
				if($.frescafilter.options.startAllProductsVisible){
					$.frescafilter.filterProducts();
				}else{
					$.frescafilter.getFilterCounts();
				}
			});
		},
		
		getProducts: function(data){
			$.each(data.products, function(i, entry){
				var product = new Array();
				product.id = entry.id;
				product.name = entry.name;
				product.price = entry.price;
				//product.currentPrice = entry.currentPrice;								//NOTE: is this needed
				product.priceMin = entry.priceMin;
				product.priceMax = entry.priceMax;
				product.url = entry.url;
				product.display = true;
				product.description = new String();
				$.each(entry.filters, function(a, filter){
					product.description += filter.v + " ";
				});
				$.frescafilter.products.push(product);
			});
		},
		
		getFilters: function(data){
			var filters = Array();
			$.each(data.products, function(i, product){
				$.each(product.filters, function(a, filter){
					if($.inArray(filter.g, filters) == -1){
						filters.push(filter.g);	 
					}
				});
			});
			for(var i = 0; i < filters.length; i++){
				var filterCollection = new Array();
				$.each(data.products, function(a, product){
					$.each(product.filters, function(e, productFilter){
						if(filters[i] == productFilter.g && $.inArray(productFilter.v, filterCollection) == -1){
							filterCollection.push(productFilter.v);
						}
					});
				});
				var newFilter = new Array()
				newFilter.group = filters[i];
				newFilter.values = new Array();
				$.each(filterCollection, function(index, filterValue){
					var newValues = {value : filterValue, active : false, maxCount: 0, count : 0};
					newFilter.values.push(newValues);
				});
				$.frescafilter.filters.push(newFilter);
			}
			$.frescafilter.getFilterMaxCounts();
		},
		
		getFilterMaxCounts: function(){
			$.each($.frescafilter.filters, function(i, filterGroup){
				$.each(filterGroup.values, function(a, filter){
					$.each($.frescafilter.products, function(y, product){
						if(product.description.indexOf(filter.value) != -1){
							filter.maxCount++;
						}
					});
				});
			});
		},
		
		buildNavs: function(){
			$("<ul id='applyFilter'></ul>").appendTo("#filters");
			$.each($.frescafilter.filters, function(i, filterGroup){
				$("<li class='filterGroup'>" + filterGroup.group + "<ul id='" + filterGroup.group + "List'></ul></li>").appendTo("#applyFilter");
				$.each(filterGroup.values, function(a, filter){
					var html = "<li><a id='" + filter.value + "' class='fastFilter'>" + filter.value + "</a><span id='" + filter.value + "Count'></span></li>";
					$(html).appendTo("#" + filterGroup.group + "List");
					$("#" + filter.value).bind("click", function(){
						if(filter.count > 0){
							filter.active = !filter.active;
							$(this).toggleClass("filterSelected");
							$.frescafilter.filterProducts();
						}
					});
				});
			});
			
			var html = "<li class='filterGroup'>Price<ul id='priceFilter'><li>";
			html += "<div style='position: relative;' id='priceSlider' class='ui-slider-1 ui-slider'></div></li></ul></li>";
			$(html).appendTo("#applyFilter");
			$("<div id='minSliderHandle' class='ui-slider-handle' style='left: 0px; position: absolute;'></div>").appendTo("#priceSlider");
			$("<div id='maxSliderHandle' class='ui-slider-handle' style='left: 91px; position: absolute;'></div>").appendTo("#priceSlider");
			$("<div id='minPrice'></div>").appendTo("#priceSlider");
			$("<div id='maxPrice'></div>").appendTo("#priceSlider");
			$("<li class='filterGroup'><ul><li><br /><a id='reset'>reset filters</a></li></ul></li>").appendTo("#applyFilter");
			$("#reset").bind("click", function(){
				$.frescafilter.resetFilters();
			});
			
			$.frescafilter.initPriceSlider();
		},
		
		initPriceSlider: function()
		{
			$.frescafilter.priceFilter = new Array();
			
			var min, max;
			
			$.each($.frescafilter.products, function(i, product){
				if(i == 0){
					min = parseInt(Math.round(product.priceMin * 100));
					max = parseInt(Math.round(product.priceMax * 100));
				}else if(parseInt(Math.round(product.priceMin * 100)) < min){
					min = parseInt(Math.round(product.priceMin * 100));
				}else if(parseInt(Math.round(product.priceMax * 100)) > max){
					max = parseInt(Math.round(product.priceMax * 100));
				}
			});
			
			$("#minPrice").append("&pound;" + min / 100);
			$("#maxPrice").append("&pound;" + max / 100);
			
			$.frescafilter.priceFilter.priceMin = min;
			$.frescafilter.priceFilter.LOWEST = min;
			$.frescafilter.priceFilter.priceMax = max;
			$.frescafilter.priceFilter.HIGHEST = max;
			
			$.frescafilter.priceFilter.slider = new $('#priceSlider').slider({
				minValue: $.frescafilter.priceFilter.priceMin, 
				maxValue: $.frescafilter.priceFilter.priceMax,
				startValues: [$.frescafilter.priceFilter.priceMin, $.frescafilter.priceFilter.priceMax],
				handleHotspot:[[12,11],[5,11]],						/* ----------- check */
				slide: function(e, ui){
					$.frescafilter.priceFilter.priceMin = ui.values[0];
					$.frescafilter.priceFilter.priceMax = ui.values[1];
					$.frescafilter.filterProducts();
				}
			});
		},
		
		filterProducts: function(){	
			$.frescafilter.resetCountsAndProducts();
			
			for(var i = 0; i < $.frescafilter.filters.length; i++){
				var filterValues = new Array();
				for(var a = 0; a < $.frescafilter.filters[i].values.length; a++){
					if($.frescafilter.filters[i].values[a].active){
						filterValues.push($.frescafilter.filters[i].values[a].value);
					}
				}
				if(filterValues.length <= 0){
					continue;
				}
				for(var y = 0; y < $.frescafilter.products.length; y++){
					var hideProduct = true;
					for(var x = 0; x < filterValues.length; x++){
						if($.frescafilter.products[y].description.indexOf(filterValues[x]) != -1){
							hideProduct = false;
						}
					}
					if(hideProduct){
						$.frescafilter.products[y].display = false;
					}
				}
			}
			$.frescafilter.displayProducts();
			$.frescafilter.getFilterCounts();
		},
		
		filterProductsByPrice: function(){
			$.each($.frescafilter.products, function(i, product){	
				if(parseInt(Math.round(product.priceMin * 100)) < $.frescafilter.priceFilter.priceMin 
				|| parseInt(Math.round(product.priceMax * 100)) > $.frescafilter.priceFilter.priceMax){
					product.display = false;
				}
			});
		},
		
		displayProducts: function(){
			var productCount = 0;
			$.frescafilter.filterProductsByPrice();
			$("#productsCont").empty();
			$.each($.frescafilter.products, function(i , product){
				if(product.display){
					var html = "<div id='prod" + i + "' class='productCont'><a href='" + product.url + "'><img id='product_" + product.id;
					html += "_sku_001003' src='/pws/images/catalogue/products/" + product.id + "/small/" + product.id + ".jpg' class='productImg' /></a>";
					html += "<h3><a href='" + product.url + "'>" + product.name + "</a></h3><p class='price'>" + product.price + "</p></div>";
					$("#productsCont").append(html);
					productCount++;
				}
			});
			$("#counter").empty().append(productCount + " products found");
			
			if(productCount <= 0){
				$("#productsCont").append("<h2>There are no products available matching your requested criteria.</h2>");
			}
		},
		
		getFilterCounts: function(){
			$.each($.frescafilter.filters, function(i, filter){
				$.each(filter.values, function(a, filterValues){
					if(filterValues.active){
						filterValues.count = $.frescafilter.countActiveFilterProducts(filterValues.value);
					}else{
						filterValues.count = $.frescafilter.countInactiveFilterProducts(filterValues.value, filter.group);
					}
				});
			});
			$.frescafilter.displayFilterCounts();
		},
		
		checkForActiveFilter: function(){
			var activeFilter = true;
			$.each($.frescafilter.filters, function(i, filter){
				$.each(filter.values, function(a, filterValues){
					if(filterValues.active){
						activeFilter = false;
					}
				});
			});
			return activeFilter;
		},
		
		countActiveFilterProducts: function(filter){
			var count = 0;
			$.each($.frescafilter.products, function(p, product){
				if(product.description.indexOf(filter) != -1 && product.display){
					count++;
				}
			});
			return count;
		},
		
		countInactiveFilterProducts: function(filter, group){
			var count = 0;
			var activeFilters = $.frescafilter.getActiveFilters(group);
			for(var p = 0; p < $.frescafilter.products.length; p++){
				if($.frescafilter.products[p].description.indexOf(filter) != -1){
					var groupCount = true;
					for(var i = 0; i < activeFilters.length; i++){
						var filterCount = false;
						for(var a = 0; a < activeFilters[i].length; a++){
							if($.frescafilter.products[p].description.indexOf(activeFilters[i][a]) != -1){
								filterCount = true;
								break;
							}
						}
						if(!filterCount){
							groupCount = false;
							break;
						}
					}
					if($.frescafilter.products[p].priceMin * 100 >= $.frescafilter.priceFilter.priceMin 
					&& $.frescafilter.products[p].priceMax * 100 <= $.frescafilter.priceFilter.priceMax){
						if(activeFilters.length != 0 && groupCount){
							count++;
						}else if(activeFilters.length == 0){
							count++;
						}
					}
				}
			}
			return count;
		},
		
		getActiveFilters: function(group){
			var activeFilters = new Array();
			$.each($.frescafilter.filters, function(i, filter){
				var activeFilterValues = new Array();
				if(filter.group != group){
					$.each(filter.values, function(a, filterValues){
						if(filterValues.active){
							activeFilterValues.push(filterValues.value);
						}
					});
					if(activeFilterValues.length > 0){
						activeFilters.push(activeFilterValues);
					}
				}
			});
			return activeFilters;
		},
		
		displayFilterCounts: function(){
			$.each($.frescafilter.filters, function(i, filterGroup){
				$.each(filterGroup.values, function(a, filterValues){
					$("span#" + filterValues.value + "Count").empty().append("&nbsp;(" + filterValues.count + ")");
					if(filterValues.count == 0){
						$("#" + filterValues.value).addClass("filterDisabled").removeClass("filterSelected");
						//filterValues.active = false;
					}else{
						$("#" + filterValues.value).removeClass("filterDisabled");
						if(filterValues.active){
							$("#" + filterValues.value).addClass("filterSelected");
						}
					}
				});
			});
		},
		
		resetCountsAndProducts: function(){
			$.each($.frescafilter.filters, function(i, filterGroup){
				$.each(filterGroup.values, function(a, value){
					value.count = 0;
				});
			});
			$.each($.frescafilter.products, function(i, product){
				product.display = true;
			});
		},
		
		resetFilters: function(){
			$(".fastFilter").removeClass("filterSelected");
			$.each($.frescafilter.filters, function(i, filter){	
				$.each(filter.values, function(a, filterValue){
					filterValue.active = false;
				});
			});
			$("#minSliderHandle").css('left', '0px');
			$("#maxSliderHandle").css('left', '91px');
			$.frescafilter.priceFilter.slider.sliderReconfigure({ 
				minValue: $.frescafilter.priceFilter.LOWEST,
				maxValue: $.frescafilter.priceFilter.HIGHEST
			});
			$.frescafilter.filterProducts();
		}
	}
})(jQuery);