
(function($) {
	
	if(typeof window.IdleWine == 'undefined')
		window.IdleWine = {};
	
	window.IdleWine.LeftNav = {
		
		firstLoad: true,
		hasInit: false,
		currentQueryString: '',
		
		init: function() {
			
			var oThis = this;
			
			// Update page on address change
			$.address.change(function(event) {
				if(oThis.firstLoad)
					oThis.firstLoad = false;
				else
					oThis.updatePage(event.value.substr(1));
			});
			
			// Hide expandable content
			document.write("<style type=\"text/css\">#left-nav li.toggleField .fieldContent {display:none;}</style>");
			
			// Show price band slider
			document.write("<style type=\"text/css\">#left-nav li.priceBandField {display:block;}</style>");
			
			// Preload button images
			(new Image()).src = "/images/static/search-field-radio-checked.gif";
			(new Image()).src = "/images/static/search-field-value-checked.gif";
			
			$(function() {
				oThis.onLoadInit();
			});
			
			this.hasInit = true;
		},
		
		onLoadInit: function() {
			var oThis = this;
			
			this.div = $('#left-nav');
			this.ul = this.div.find("ul.search-fields");
			
			// Show expandable content with active filters
			this.div.find("li.field a.checked").parents("ul.fieldContent").show().prev().addClass("open").removeClass("closed");
			
			// Handle expand clicks
			this.div.find("li.toggleField>a").click(function() {
				$(this).toggleClass("open").toggleClass("closed").next().toggle();
				return false;
			});
			
			// Handle checkbox clicks
			this.ul.find("li.checkbox>a").click(function() {
				$(this).toggleClass("checked");
				
				if($(this).parent().hasClass("radiobox")) {
					$(this).parent().siblings("li.radiobox").children("a").removeClass("checked");
				}
				
				if(oThis.isResultsPage()) {
					var queryIndex = this.href.indexOf("?");
					var queryString = queryIndex == -1 ? "" : this.href.substr(queryIndex+1);
					
					$.address.value(queryString);
					return false;
				}
			});
			
			// Handle quicksearch
			this.div.find("form.quickSearchForm").submit(function() {
				$(this).find("input[type=submit],input[type=image]").attr("disabled", "disabled");
			});
			
			// Handle page buttons
			this.hookPageButtons();
		},
		
		hookPageButtons: function() {
			var oThis = this;
			
			if(!this.isResultsPage())
				return;
			
			$('div.pageNav a').click(function() {
				var queryIndex = this.href.indexOf("?");
				var queryString = queryIndex == -1 ? "" : this.href.substr(queryIndex+1);
				
				oThis.resultsPageOnly = true;
				$.address.value(queryString);
				return false;
			});
		},
		
		isResultsPage: function() {
			return window.location.pathname == "/shop/";
		},
		
		updatePage: function(queryData) {
			var oThis = this;
			
			if(this.resultsPageOnly) {
				// Only refresh results pane
				this.resultsPageOnly = false;
				
				$.get("/ajax/product-results", queryData, function(data) {
					$('#resultsContainer').html(data);
					oThis.onLoadInit();
				});
				
			} else {
				// Refresh results page and navigation
				$.getJSON("/ajax/search", queryData, function(data) {
					$('#resultsContainer').html(data.results);
					$('#leftNavContainer').html(data.leftNav);
					oThis.onLoadInit();
					oThis.onLoadInitSlider();
				});
			}
		},
		
		// Handle price band slider
		initSlider: function(minPrice, maxPrice) {
			if(!this.hasInit)
				return;
			
			var oThis = this;
			
			$(function() {
				oThis.onLoadInitSlider();
			});
		},
		
		sliderResolution: 178,
		
		onLoadInitSlider: function() {
			var oThis = this;
			
			this.sliderDiv = this.div.find("li.priceBand");
			
			if(this.sliderDiv.length == 0)
				return;
			
			//this.minPrice = this.priceRange.min;
			this.minPrice = 0;
			this.maxPrice = this.priceRange.max;
			
			if(this.sliderDiv.length == 0)
				return;
			
			var rawValues = this.priceValues;
			
			var normValues = [
				rawValues.min == "min" ? 0 : Math.pow((rawValues.min - this.minPrice) / (this.maxPrice - this.minPrice), 1/2),
				rawValues.max == "max" ? 1 : Math.pow((rawValues.max - this.minPrice) / (this.maxPrice - this.minPrice), 1/2)
			];
			
			var values = [
				Math.floor(normValues[0] * this.sliderResolution),
				Math.ceil(normValues[1] * this.sliderResolution)
			];
			
			this.sliderDiv.slider({
				range: true,
				min: 0,
				max: this.sliderResolution,
				values: values,
				slide: function(event, ui) {
					oThis.updateSliderHandles();
				},
				change: function(event, ui) {
					oThis.changeSliderValue();
				}
			});
			
			this.minHandle = $(document.createElement("span")).appendTo($(document.createElement("span")).addClass("minHandle").appendTo(this.sliderDiv.find("a.ui-slider-handle:eq(0)")));
			this.maxHandle = $(document.createElement("span")).appendTo($(document.createElement("span")).addClass("maxHandle").appendTo(this.sliderDiv.find("a.ui-slider-handle:eq(1)")));
			
			this.updateSliderHandles();
		},
		
		updateSliderHandles: function() {
			// Update text
			this.minHandle.html("&pound;" + this.getSliderValue("min"));
			this.maxHandle.html("&pound;" + this.getSliderValue("max"));
			
			// Prevent overlap
			var minPos = this.sliderDiv.slider('values', 0);
			var maxPos = this.sliderDiv.slider('values', 1);
			
			var buffer = 55;
			var diff = maxPos - minPos;
			var margin = Math.max(0, buffer - diff);
			
			if(maxPos > (this.sliderResolution - buffer)) {
				var weighting = Math.max(1 - (this.sliderResolution-maxPos) / buffer, 0.5);
			} else if(minPos < buffer) {
				var weighting = Math.min(minPos / buffer, 0.5);
			} else {
				var weighting = 0.5;
			}
			
			this.minHandle.css('marginLeft', -Math.ceil(margin * weighting));
			this.maxHandle.css('marginLeft', Math.floor(margin * (1-weighting)));
		},
		
		changeSliderValue: function() {
			var range = {"min": this.getSliderValue("min"), "max": this.getSliderValue("max")};
			var queryString = this.currentQueryString.substr(1) + "&price-min=" + range.min + "&price-max=" + range.max;
			
			$.address.value(queryString);
		},
		
		getSliderValue: function(type) {
			var index = type == "min" ? 0 : 1;
			var roundFn = type == "min" ? Math.ceil : Math.floor;
			
			var rawValue = this.sliderDiv.slider('values', index);
			var normValue = Math.pow(rawValue / this.sliderResolution, 2);
			
			if(normValue == index) {
				return type;
			}
			
			var priceValue = (this.maxPrice - this.minPrice) * normValue + this.minPrice;
			var interval = this.getSliderInterval(priceValue);
				
			return roundFn(priceValue / interval) * interval;
		},
		
		getSliderInterval: function(price) {
			var interval = 5;
			
			if(price > 50)
				interval = 10;
			if(price > 100)
				interval = 20;
			if(price > 300)
				interval = 50;
			if(price > 1000)
				interval = 100;
			if(price > 3000)
				interval = 500;
			
			return interval;
		}
	}
	
})(jQuery);



