/*
Generate fragment of random numbers
*/
jQuery._uuid_default_prefix = '';
jQuery._uuidlet = function () {
	return(((1+Math.random())*0x10000)|0).toString(16).substring(1);
};
/*
Generates random uuid
*/
jQuery.uuid = function (p) {
	if (typeof(p) == 'object' && typeof(p.prefix) == 'string') {
		jQuery._uuid_default_prefix = p.prefix;
	} else {
		p = p || jQuery._uuid_default_prefix || '';
		return(p+jQuery._uuidlet()+jQuery._uuidlet()+"-"+jQuery._uuidlet()+"-"+jQuery._uuidlet()+"-"+jQuery._uuidlet()+"-"+jQuery._uuidlet()+jQuery._uuidlet()+jQuery._uuidlet());
	};
};

// Global array of grinder objects

var allGrinders = new Array();
var gourmeteGrinders = new Array();
var industrialGrinders = new Array();

// Various state flags
var hasBeenFiltered = false;
var hadGrindType = false;


// Checkbox and marker labels

unitType = 0; // default to kg

var unitData = new Array(2); // 0 = kg, 1 = Lb

// Kg checkbox labels and markers values

unitData[0] = new Array(2);

unitData[0][0] = new Array(6);
unitData[0][0][0] = " 1 - 200";
unitData[0][0][1] = " 200 - 400";
unitData[0][0][2] = " 400 - 800";
unitData[0][0][3] = " 800 - 1,600";
unitData[0][0][4] = " 1,600 - 3,200";
unitData[0][0][5] = " 3,200 - 7,000";

unitData[0][1] = new Array(8);
unitData[0][1][0] = "1";
unitData[0][1][1] = "50";
unitData[0][1][2] = "100";
unitData[0][1][3] = "200";
unitData[0][1][4] = "400";
unitData[0][1][5] = "800";
unitData[0][1][6] = "1,600";
unitData[0][1][7] = "3,200";
unitData[0][1][8] = "7,000";

// Lb checkbox labels and markers values

// BLAKE, update these values to to the correct unit value for Lb

unitData[1] = new Array(2);

unitData[1][0] = new Array(6);
unitData[1][0][0] = " 1 - 440";
unitData[1][0][1] = " 440 - 880";
unitData[1][0][2] = " 880 - 1,765";
unitData[1][0][3] = " 1,765 - 3,525";
unitData[1][0][4] = " 3,525 - 7,055";
unitData[1][0][5] = " 7,055 - 15,430";

unitData[1][1] = new Array(8);
unitData[1][1][0] = "1";
unitData[1][1][1] = "110";
unitData[1][1][2] = "220";
unitData[1][1][3] = "440";
unitData[1][1][4] = "880";
unitData[1][1][5] = "1,765";
unitData[1][1][6] = "3,525";
unitData[1][1][7] = "7,055";
unitData[1][1][8] = "15,430";

// group visibility

gourmetGroupVisible = true;
industrialGroupVisible = true;

// setup the display on document ready

$(document).ready(function() {

	grinderTemplate = $("<div class='grinder' style='display:none'>\n" +
			"	<div class='name' style='display:none'></div>\n" +
			"	<div class='segments' style='display:none'>\n" +
			"	</div>\n" +
			"</div>\n");

	// clear settings on browsers that remember form elements state on reload
	GrinderFinder.ghostCapacity(true);
	GrinderFinder.ghostGrindType(false);
	
	$("#grinder-finder input").each(function() 
	{
		this.checked = false;
	});		
	
	$("#cat_gourmet, #cat_industrial ").each(function() 
	{
		this.checked = true;	
	});	
	
	
	// update units on display
	GrinderFinder.setUnits(unitType);
	
	// Wire up checkboxes		
	$(".capcityCheckbox input, .grindTypeCheckbox input").click(function() 
	{
		GrinderFinder.updateDisplay();
		GrinderFinder.renderUpdates();
	});

	$("#show_all").click(function() 
	{
		GrinderFinder.displayAllGrinders($("#show_all").is(':checked'));
	});

	$("#cat_industrial, #cat_gourmet").click(function() 
	{
		GrinderFinder.updateGroups();
		GrinderFinder.renderUpdates();
	});

	$.ajax({
		type: "GET",
		url: "../gf",
		dataType: "xml",
		complete: function() { },
		error: function(XMLHttpRequest, textStatus) {
		
			alert("Could not retreive product listing");
		},
		success: function(xml) 
		{
			$("grinder", xml).each(function () 
			{
				
				grinderElement = $(grinderTemplate).clone();
				capacity = $("capacities", this);
				
				runningSegmentWidth = 0;
				segmentStart = 2000;
				
				capacityStart = 20000;
				capacityEnd = 0;
				
				props = new Object();
				
				props.isUltrafine 	= false;
				props.isEspresso  	= false;
				props.isFilter	 	= false;
				props.isSoluble		= false;
				
				segments = $(".segments",grinderElement);
										
				ultraMin = parseInt($(capacity).attr("ultr-min"));
				ultraMax = parseInt($(capacity).attr("ultr-max"));
				
				ultraMinPx = GrinderFinder.mapValue(ultraMin);
				ultraMaxPx = GrinderFinder.mapValue(ultraMax);
				
				if (ultraMax!= 0) 
				{
					segmentString = "<div class='segment ultrafine' style='width:"+(ultraMaxPx-ultraMinPx)+"px' ></div>";
					
					$(segments).append($(segmentString));
					
					runningSegmentWidth += (ultraMaxPx-ultraMinPx);
					segmentStart = Math.min(segmentStart,ultraMinPx);
					
					capacityStart = Math.min(capacityStart,ultraMin);
					capacityEnd += (ultraMax-ultraMin);
					
					props.isUltrafine = true;
				} 
				
				exprMin = parseInt($(capacity).attr("expr-min"));
				exprMax = parseInt($(capacity).attr("expr-max"));

				exprMinPx = GrinderFinder.mapValue(exprMin);
				exprMaxPx = GrinderFinder.mapValue(exprMax);
				
				if (exprMax!= 0) 
				{
					segmentString = "<div class='segment espresso' style='width:"+(exprMaxPx-exprMinPx)+"px' ></div>";
					
					$(segments).append($(segmentString));
					
					runningSegmentWidth += (exprMaxPx-exprMinPx);
					segmentStart = Math.min(segmentStart,exprMinPx);
					
					capacityStart = Math.min(capacityStart,exprMin);
					capacityEnd += (exprMax-exprMin);
					
					props.isEspresso = true;
				} 
				
				filtMin = parseInt($(capacity).attr("filt-min"));
				filtMax = parseInt($(capacity).attr("filt-max"));
				
				filtMinPx = GrinderFinder.mapValue(filtMin);
				filtMaxPx = GrinderFinder.mapValue(filtMax);
				
				if (filtMax!= 0) 
				{
					segmentString = "<div class='segment filter' style='width:"+(filtMaxPx-filtMinPx)+"px' ></div>";
					
					$(segments).append($(segmentString));
					
					runningSegmentWidth += (filtMaxPx-filtMinPx);
					segmentStart = Math.min(segmentStart,filtMinPx);
					
					capacityStart = Math.min(capacityStart,filtMin);
					capacityEnd += (filtMax-filtMin);
					
					props.isFilter = true;

				} 
				
				soluMin = parseInt($(capacity).attr("solu-min"));
				soluMax = parseInt($(capacity).attr("solu-max"));
				
				soluMinPx = GrinderFinder.mapValue(soluMin);
				soluMaxPx = GrinderFinder.mapValue(soluMax);
				
				if (soluMax!= 0) 
				{
					segmentString = "<div class='segment soluble' style='width:"+(soluMaxPx-soluMinPx)+"px' ></div>";
					
					$(segments).append($(segmentString));
					
					runningSegmentWidth += (soluMaxPx-soluMinPx);
					segmentStart = Math.min(segmentStart,soluMinPx);
					
					capacityStart = Math.min(capacityStart,soluMin);
					capacityEnd += (soluMax-soluMin);
					
					props.isSoluble	= true;
				} 
				
				props.minCap = capacityStart;
				props.maxCap = capacityEnd + capacityStart;
				
				grinderURL = $(this).attr("url");
				
				$(segments).css({width: runningSegmentWidth+"px", left:segmentStart+"px"});
				$(segments).attr("url",grinderURL);
				
				
				$(segments).click(function() 
				{
					document.location = $(this).attr("url");
				}).mouseover(function () {
				
					$(this).prev(".name").css({color:"black", fontWeight:"bold"});
				
				}).mouseout(function () {
				
					$(this).prev(".name").css({color:"", fontWeight:""});
				
				});
				
				nameNode = $(".name",grinderElement);
				props.name =  $(this).attr("name");
				$(nameNode).text( $(this).attr("name") );
				
				$(nameNode).attr("url",grinderURL );
				
				$(nameNode).click(function() 
				{
					document.location = $(this).attr("url");		
				});
				
				
				if (segmentStart > 100) 
				{
					$(nameNode).css( {right: ( 819 - segmentStart)+"px"});
				} 
				else 
				{
					$(nameNode).css( {left: ((segmentStart + runningSegmentWidth ))+"px"});
				}
				
				if ($(this).attr("gourmet"))
				{
					GrinderFinder.addGrinderToGroup("#gourmet-group", props);
				}
				
				if ($(this).attr("industrial"))
				{
					
					GrinderFinder.addGrinderToGroup("#industrial-group", props);
				}
			});
				
		$("#loading-grinders").hide("normal");
					
		$("#gourmet-group, #industrial-group").slideDown("normal", function() {
				
			/*$(".grinder", this).slideDown("normal", function() {
				
				$(".segments", this).show("slide", {}, 500, function() {
				
					$(".name").fadeIn("slow");		
							
				});
				
						
			}); */
			
			$(".section-title").fadeIn("slow");

		});
		
		
	}});
 
});



var GrinderFinder = {
	mapValue: function(capacity) {
	
		pixel = 0;
	
		if (capacity >=0 && capacity < 100){
				pixel = (capacity / 100) * 205
		}
		
		if (capacity >=100 && capacity < 200){
			pixel = (((capacity - 100) / 100) * 102) + 205;
		}
		
		if (capacity >=200 && capacity < 400){
			pixel = (((capacity - 200) / 200) * 102) + 307;
		}
		
		if (capacity >=400 && capacity < 800){
			pixel = (((capacity - 400) / 400) * 102) + 409;
		}
		
		if (capacity >=800 && capacity < 1600){
			pixel = (((capacity - 800) / 800) * 102) + 511;
		}
		
		if (capacity >=1600 && capacity < 3200){
			pixel = (((capacity - 1600) / 1600) * 102) + 613;
		}
		
		if (capacity >=3200 && capacity < 7001){
			pixel = (((capacity - 2300) / 4700) * 103) + 716;
		}
		
		return Math.round(pixel);
	},
	
	ghostCapacity: function(ghost) 
	{
		// set capacity checkboxs 
		for (index = 0; index < 6; index++ )
		{
			
			if (ghost)
			{
				$("#range_"+index).attr("disabled", "disabled");
			}
			else 
			{
				$("#range_"+index).removeAttr("disabled");
			}
		}
	},
	
	ghostGrindType: function(ghost) 
	{
		if (ghost)
		{
			$("#check-ultrafine, #check-espresso, #check-filter, #check-soluble").attr("disabled", "disabled");
		}
		else 
		{
			$("#check-ultrafine, #check-espresso, #check-filter, #check-soluble").removeAttr("disabled");
		}
	},
	
	displayAllGrinders: function(show) 
	{
		GrinderFinder.ghostGrindType(show);
		
		showUltrafine = $("#check-ultrafine").is(':checked');
		showEspresso = $("#check-espresso").is(':checked');
		showFilter = $("#check-filter").is(':checked');
		showSoluble = $("#check-soluble").is(':checked');
		
		anyGrindType = (showUltrafine || showEspresso || showFilter || showSoluble );
		GrinderFinder.ghostCapacity(!anyGrindType || show);
		
		
		if (show)
		{
			$.each(allGrinders, function(){
				if( this.visible != show) 
				{
					this.visible = show;
					this.dirty = true;
				}
				
			});
		} 
		else 
		{ 
			GrinderFinder.updateDisplay();
		}
		
		GrinderFinder.renderUpdates();
		
	},
	
	toggleUnits: function() {
		unitType = unitType ? 0 : 1; 
		
		GrinderFinder.setUnits(unitType);
	},
	
	setUnits: function(unitType) {
	
		// set checkbox labels 
		for (index = 0; index < 7; index++ )
		{
			$("#range_"+index).next().text(unitData[unitType][0][index]);
			
		}
		
		// set marker labels 
		for (index = 0; index < 9; index++ )
		{
			$(".mark-"+index).text(unitData[unitType][1][index]);
			
		}
		
		unitSwitcher = "";
		
		if (unitType == 1)
		{
			unitSwitcher = "<div>CAPACITY (LB)<br/> <span> <a href='#' onclick='GrinderFinder.toggleUnits();return false;'>KG</a> | LB<span></div>";
		} else 
		{
			unitSwitcher = "<div>CAPACITY (KG)<br/> <span> KG | <a href='#' onclick='GrinderFinder.toggleUnits();return false;'>LB</a></span></div>";
		}
		
		$("#grinder-finder #labels").html( $(unitSwitcher));
		
	},
	
	updateDisplay: function () {
		
		/* Read UI values */
		
		// Categories
		showGourmetCat = $('#cat_gourmet').is(':checked');
		showIndustrialCat = $('#cat_industrial').is(':checked');
	
		// Capacity Ranges
		ranges = new Array(7);
		ranges[0]= $("#range_0").is(':checked');
		ranges[1]= $("#range_1").is(':checked');
		ranges[2]= $("#range_2").is(':checked');
		ranges[3]= $("#range_3").is(':checked');
		ranges[4]= $("#range_4").is(':checked');
		ranges[5]= $("#range_5").is(':checked');
		
		// grinder types
		showUltrafine = $("#check-ultrafine").is(':checked');
		showEspresso = $("#check-espresso").is(':checked');
		showFilter = $("#check-filter").is(':checked');
		showSoluble = $("#check-soluble").is(':checked');
		
		anyGrindType = (showUltrafine || showEspresso || showFilter || showSoluble );
		anyCapacity = (ranges[0] || ranges[1] || ranges[2] || ranges[3] || ranges[4] || ranges[5]);
		
		
		GrinderFinder.ghostCapacity(!anyGrindType)
		
		
		/* Determine which grinders should be visible & hidden */
		
		if ((!ranges[0]) && (!ranges[1]) && (!ranges[2]) && (!ranges[3]) && (!ranges[4]) && (!ranges[5]) && (!anyGrindType))
		{
			$.each(allGrinders, function(){
				this.visible = false;
				this.dirty = true;
			});
		}
		else 
		{
			
			$.each(allGrinders, function(){
				if ((showUltrafine && this.isUltrafine == showUltrafine) || 
				(showEspresso && this.isEspresso == showEspresso) ||
				(showFilter && this.isFilter == showFilter) || 
				(showSoluble && this.isSoluble == showSoluble)){
				
					if (this.visible == false) 
					{
						this.visible = true;
						this.dirty = true;
					}
				} else {
					if (this.visible){
						this.visible = false;
						this.dirty = true;
					}
				}
			});
			
			if (anyCapacity)
			{
				$.each(allGrinders, function(){
					if ((!(ranges[0] && this.range_0 == true)) &&
					(!(ranges[1] && this.range_1 == true)) && 
					(!(ranges[2] && this.range_2 == true)) && 
					(!(ranges[3] && this.range_3 == true)) && 
					(!(ranges[4] && this.range_4 == true)) && 
					(!(ranges[5] && this.range_5 == true)))
					{
						if (this.visible) 
						{
							this.visible = false;
							this.dirty = true;
						}
					} 
				});
			}
		
		}
		
		
	},
	
	renderUpdates: function ()
	{
		
		/* Update grinderfinder display */

		$.each( allGrinders, function(){
			
			if (this.dirty) {
			
				grinderElement = $("#"+this.DomId);
			
				if (this.visible) {
				
					$(grinderElement).slideDown("normal", function() {
			
						$(".segments",this).show("slide", {}, 500, function() {
						
							$(this).prev(".name").fadeIn("slow");		
									
						});
					});
			
				} else {
					$(grinderElement).hide("slow");			
					$(".segments",grinderElement).css({display: "none"});
					$(".name", grinderElement).css({display: "none"});		
				}	
				this.dirty = false;
			}
		});
		
		hiddenCount = 0;
		$.each(gourmeteGrinders, function()
		{
			if(this.visible == false) { hiddenCount++; }	
		});
		
		if (hiddenCount != gourmeteGrinders.length) {
			$("#gourment-empty").hide();
		} else {
			$("#gourment-empty").show();
		}
		
		hiddenCount = 0;
		$.each(industrialGrinders, function()
		{
			if(this.visible == false) { hiddenCount++; }	
		});
		
		if (hiddenCount != industrialGrinders.length) {
			$("#industrial-empty").hide();
		} else {
			$("#industrial-empty").show();
		}
		
	}, 
	
	updateGroups: function () {
	
		/* Read UI values */
		
		showGourmetCat = $('#cat_gourmet').is(':checked');
		showIndustrialCat = $('#cat_industrial').is(':checked');
	
		/* Update groups display */
		
		if (!showGourmetCat && gourmetGroupVisible != false) 
		{
			$("#gourmet-group").hide("slow");
			gourmetGroupVisible = false;
		} 
		
		if (showGourmetCat && gourmetGroupVisible != true)
		{
			$("#gourmet-group").slideDown("slow");
			gourmetGroupVisible = true;
		}
				
		if (!showIndustrialCat && industrialGroupVisible != false){
			$("#industrial-group").hide("slow");
			industrialGroupVisible = false;
		} 
		
		if (showIndustrialCat && industrialGroupVisible != true)
		{
			$("#industrial-group").slideDown("slow");
			industrialGroupVisible = true;
		}
		
		if (showGourmetCat == false && showIndustrialCat == false)
		{
			$("#no-groups").slideDown("slow");
		}
		else 
		{
			$("#no-groups").hide("slow");
		}
	},
	
	addGrinderToGroup: function(groupId) 
	{
		grinderObj = new Object();
		
		grinderObj.name = props.name;
		
		grinderObj.isUltrafine = props.isUltrafine;
		grinderObj.isEspresso = props.isEspresso;
		grinderObj.isFilter = props.isFilter;
		grinderObj.isSoluble = props.isSoluble;
		
		grinderObj.minCap = props.minCap;
		grinderObj.maxCap = props.maxCap;
		
		grinderObj.range_1 = false;
		grinderObj.range_2 = false;
		grinderObj.range_3 = false;
		grinderObj.range_4 = false;
		grinderObj.range_5 = false;
		grinderObj.range_6 = false;
		
		if (!(props.maxCap < 0 || props.minCap > 200 )) {
			grinderObj.range_0 = true;
		}
		
		if (!(props.maxCap < 200 || props.minCap >400)) {
			grinderObj.range_1 = true;
		}
		
		if (!(props.maxCap < 400 || props.minCap > 800)) {
			grinderObj.range_2 = true;
		}
		
		if (!(props.maxCap < 800 || props.minCap > 1600)) {
			grinderObj.range_3 = true;
		}
		
		if (!(props.maxCap < 1600 || props.minCap > 3200)) {
			grinderObj.range_4 = true;
		}
		
		if (!(props.maxCap <  3200 ||  props.minCap > 7000)) {
			grinderObj.range_5 = true;
		}
		
		aGrinder = $(grinderElement).clone(true);
		
		uniqueId = $.uuid();
		aGrinder.attr("id",uniqueId);
		grinderObj.DomId = uniqueId;
		grinderObj.visible = false;
		grinderObj.dirty = false;
		
		$(groupId).append(aGrinder);
		allGrinders.push(grinderObj);
		
		if (groupId == "#industrial-group") {
			industrialGrinders.push(grinderObj);
		} else {
			gourmeteGrinders.push(grinderObj);
		}
		
	}
}

