var Dom = YAHOO.util.Dom;
var Ev = YAHOO.util.Event;
Dom.hide = function(el) { Dom.setStyle(Dom.get(el),'display','none'); };
Dom.show = function(el) { Dom.setStyle(Dom.get(el),'display',''); };

var localeMenu;
var priceRangeSlider, ratingSlider;
var overlays = {};
var wineriesPopulated = false;
var SLIDER_WIDTH = 193;

function generateQueryParams(obj) {
	var p = [];
	var keys = ['txt','dims','i','n','tab','price_min','price_max','rating_min','raters','sort','sort_dir','stock','expose'];

	for (var i = 0; i < keys.length; i++) {
		var key = keys[i];

		if (typeof(obj[key]) != 'undefined') {
			p.push(key + '=' + obj[key]);
		}
	}

	return p.join('&');
}

function selectRegion(ev) {
	localeMenu.align();
	localeMenu.show();
	Ev.preventDefault(ev);
}

function handleRatingChange(offset) {
	var selectedArea = Dom.get('expert_slider_selected_bg');
	Dom.setStyle(selectedArea,'left',(offset+7) + 'px');
	Dom.setStyle(selectedArea,'width',(SLIDER_WIDTH-offset) + 'px');

	var minRatingContainer = Dom.get('min_rating_container');
	Dom.setStyle(minRatingContainer,'left',offset + 'px');
	var r = getMinRating(ratingSlider);
	if (r == 100) {
		var ratingText = "100";
	} else {
		var ratingText = r + "+";
	}
	Dom.get('min_rating').innerHTML = ratingText;

	// if no expert checkboxes are checked, check them all
	var expertCBs = Dom.getElementsByClassName('expert_cb','input','expert_list');	
	var hasCheck = false;
	for (idx in expertCBs) {
		var cb = expertCBs[idx];
		if (cb.checked) {
			hasCheck = true;
			break;
		}	
	}

	if (!hasCheck) {
		expertCBs[0].checked = true;
	}

	enableExpertGo();
}

function enableExpertGo(ev) {
	var goLink = Dom.get('expert_slider_go_link');
	if (goLink.style.display == "none") {
		goLink.style.opacity = 0;
		Dom.show(goLink);
		new YAHOO.util.Anim(goLink,{ opacity: { to: 1 } },1,YAHOO.util.Easing.easeBothStrong).animate();
		Ev.addListener(goLink,'click',doRating);
	}
}

function enablePriceRangeGo(ev) {
	var goLink = Dom.get('slider_go_link');
	if (goLink.style.display == "none") {
		goLink.style.opacity = 0;
		Dom.show(goLink);
		new YAHOO.util.Anim(goLink,{ opacity: { to: 1 } },1,YAHOO.util.Easing.easeBothStrong).animate();
		Ev.addListener(goLink,'click',doPriceRange);
	}
}

function handlePriceRangeChange(slider) {
	var min = slider.minVal;
	var max = slider.maxVal;

	var selectedArea = Dom.get('price_slider_selected_bg');
	Dom.setStyle(selectedArea,'left',(min+7) + 'px');
	Dom.setStyle(selectedArea,'width',(max-min) + 'px');

	var priceRange = getPriceRange(slider);
	var minPriceDollars = priceRange[0];
	var maxPriceDollars = priceRange[1];
	
	var minPriceContainer = Dom.get('min_price_container');
	Dom.setStyle(minPriceContainer,'left',min + 'px');
	var minPrice = Dom.get('min_price').innerHTML = minPriceDollars;

	var maxPriceContainer = Dom.get('max_price_container');
	Dom.setStyle(maxPriceContainer,'left',max + 'px');
	var maxPrice = Dom.get('max_price').innerHTML = (maxPriceDollars == 100) ? "100+" : maxPriceDollars;

	enablePriceRangeGo();
}

function getMinRating(slider) {
	var offset = slider.getValue();

	var ratingPerPixel = 15/SLIDER_WIDTH;
	var rating = 100 - (15 - Number(ratingPerPixel * offset).toFixed());

	return rating;
}

function getPriceRange(slider) {
	var min = slider.minVal;
	var max = slider.maxVal;

	var pricePerPixel = 100.0/SLIDER_WIDTH;
	
	var minPriceDollars = Number(pricePerPixel * min).toFixed();
	var maxPriceDollars = Number(pricePerPixel * max).toFixed();

	return [minPriceDollars,maxPriceDollars];
}

function doRating() {
	var minRating = getMinRating(ratingSlider);

	params['rating_min'] = minRating;

	var experts = [];
	var expertChecks = Dom.getElementsByClassName('expert_cb','input','expert_list');
	for (var i = 0; i < expertChecks.length; i++) {
		var c = expertChecks[i];
		if (c.checked) { experts.push(c.value); }
	}
	params['raters'] = experts.join(';');

	location.href = 'results.adp?' + generateQueryParams(params);
}

function doPriceRange(ev) {
	var priceRange = getPriceRange(priceRangeSlider);

	params['price_min'] = priceRange[0];
	params['price_max'] = priceRange[1];
	location.href = 'results.adp?' + generateQueryParams(params);
}

function changeResultsPerPage(ev) {
	var t = Ev.getTarget(ev);
	params['n'] = t.value;
	params['i'] = 0;
	location.href = 'results.adp?' + generateQueryParams(params);
}

function changePage(ev) {
	var t = Ev.getTarget(ev);
	var pageNum = t.value;
	params['i'] = params['n'] * (pageNum-1);
	location.href = 'results.adp?' + generateQueryParams(params);
}

function getWineriesOK(resp) {
	var json = resp.responseText;

	try {
		var wineries = YAHOO.lang.JSON.parse(json);
	} catch (e) {
		alert('JSON parsing failed');
		getWineriesFailed(null);
		return;
	}

	var container = Dom.get('winery_content');
	container.innerHTML = '';
	var activeLetter = null;
	var subcontainer = null;
	var originalDims = params['dims'];
	for (var i = 0; i < wineries.length; i++) {
		var winery = wineries[i];
		var letter = winery.name[0].toUpperCase();

		if (!activeLetter || letter != activeLetter) {
			// make the letter header
			var div = document.createElement('div');
			Dom.setAttribute(div,'id','letter_' + letter.toLowerCase());
			Dom.setAttribute(div,'class','letter');
			div.innerHTML = letter;
			container.appendChild(div);

			// make the container
			var ul = document.createElement('ul');
			container.appendChild(ul);
			subcontainer = ul;

			// activate the letter link
			Dom.removeClass('link_to_' + letter.toLowerCase(), 'inactive');

			activeLetter = letter;
		}

		// make the link
		var li = document.createElement('li');
		var a = document.createElement('a');
		params['dims'] = originalDims + '%20' + winery.id;
		Dom.setAttribute(a,'href','results.adp?' + generateQueryParams(params));
		params['dims'] = originalDims;
		a.innerHTML = winery.name;

		li.appendChild(a);
		subcontainer.appendChild(li);
	}

	wineriesPopulated = true;

	Dom.hide('winery_scroll_spinner');
}

function getWineriesFailed(resp) {
	Dom.get('winery_content').innerHTML = "We apologize, but we encountered an error while processing your request. Please try again shortly.";

	Dom.hide('winery_scroll_spinner');
}

function toggleVisible(ev,o) {
	if (o.element.style.visibility == 'hidden') {
		o.show();
		o.align();
		
		// if wineries, populate the list
		if (o == overlays['wineries'] && !wineriesPopulated) { 
			var el = Ev.getTarget(ev);		
			var dimId = Dom.getAttribute(el,'dim_id');
			params['expose'] = dimId;
			var exposeLink = "_expose.tcl?" + generateQueryParams(params);
			params['expose'] = '';

			var callback = {
				success: getWineriesOK,
				failure: getWineriesFailed,
				timeout: 30000,
				cache: false
			};
			var tx = YAHOO.util.Connect.asyncRequest('GET',exposeLink, callback);
		} 
	} else {
		o.hide();
	}
}

function scrollWineries(ev) {
	Ev.preventDefault(ev);

	var el = Ev.getTarget(ev);
	if (Dom.hasClass(el,'inactive')) { return; }

	var letter = el.id.split('_')[2];
	Dom.get('winery_content').scrollTop = Dom.get('letter_' + letter).offsetTop;
}

function initExpertOverlay() {
	var p = new YAHOO.widget.Panel('expert_overlay', {
		zIndex: 10,
		fixedcenter: true,
		modal: true,
		visible: false,
		close: false,
		draggable: false,
		underlay: 'none'
	});
	p.render();
	overlays['expert_overlay'] = p;
	Dom.show('expert_overlay');

	Ev.addListener('reviewer_guide_link','click',function(ev) {
		Ev.preventDefault(ev);
		overlays['expert_overlay'].show();
	});

	Ev.addListener('expert_overlay_close','click',function(ev) {
		Ev.preventDefault(ev);
		overlays['expert_overlay'].hide();
	});
}

function initSearchNav() {
	if (!Dom.get('search_nav')) { return; }

	// region menu
	localeMenu = new YAHOO.widget.Menu('locale_hierarchy', {
		position: 'dynamic',
		context: ['locale_hierarchy_container','tl','tl'],
		zIndex: 10
	});
	localeMenu.render();
	Dom.show('locale_hierarchy');

	Ev.addListener('select_region_link','click',selectRegion);

	// price range slider
	priceRangeSlider = YAHOO.widget.Slider.getHorizDualSlider('price_slider_bg','price_slider_thumb1','price_slider_thumb2',SLIDER_WIDTH);
	priceRangeSlider.subscribe('change',handlePriceRangeChange);
	priceRangeSlider.minRange = 1000.0/SLIDER_WIDTH;
	
	if (typeof(params['price_min']) != "undefined" && params['price_min'] != 0 && params['price_min'] != '') {
		priceRangeSlider.setMinValue(params['price_min'] * (SLIDER_WIDTH/100));
	}
	if (typeof(params['price_max']) != "undefined" && params['price_max'] != 100 && params['price_max'] != '') {
		priceRangeSlider.setMaxValue(params['price_max'] * (SLIDER_WIDTH/100));
	}

	// expert selections
	var expertChecks = Dom.getElementsByClassName('expert_cb','input','expert_list');
	for (var i = 0; i < expertChecks.length; i++) {
		var c = expertChecks[i];
		Ev.addListener(c,'click',enableExpertGo);
	}
		
	// expert rating slider
	ratingSlider = YAHOO.widget.Slider.getHorizSlider('expert_slider_bg','expert_slider_thumb1',0,SLIDER_WIDTH);
	if (typeof(params['rating_min']) != "undefined" && params['rating_min'] != 0) {
		var offset = (15 - (100 - params['rating_min'])) * (SLIDER_WIDTH/15);
		ratingSlider.setValue(offset);
	}
	ratingSlider.subscribe('change',handleRatingChange);

	// results per page
	Ev.addListener('per_page_select','change',changeResultsPerPage);	

	// page selector
	Ev.addListener('page_select','change',changePage);

	// overlays
	var overlay_names = ['vintages','grapes','wineries'];
	for ( var idx in overlay_names ) {
		var overlay_name = overlay_names[idx];
		var link_name = 'all_' + overlay_name + '_link';
		var o = new YAHOO.widget.Overlay(overlay_name + '_overlay', {
			visible: false,
			context: [link_name,'tl','tr']
		});
		o.render();
		Dom.show(overlay_name + '_overlay');	
		Ev.addListener(link_name,'click',function(ev,overlay) {
		      Ev.preventDefault(ev); 
		      toggleVisible(ev,overlay);
		}, o);
		Ev.addListener(overlay_name + '_close','click',function(ev,overlay) { 
			toggleVisible(ev,overlay);
		}, o);

		overlays[overlay_name] = o;
	}

	// set up wineries overlay
	var letters = Dom.getElementsByClassName('winery_top_link','a','winery_top_links');
	for (var idx in letters) {
		var letter_link = letters[idx];

		Ev.addListener(letter_link, 'click', scrollWineries); 
	}

	initExpertOverlay();

	// expert info links
	var links = Dom.getElementsByClassName('expert_info_link','img','search_results');
	for (var idx in links) {
		var link = links[idx];
		Ev.addListener(link,'click',function(ev) {
			overlays['expert_overlay'].show();
		});
	}

	Ev.addListener('out_of_stock_cb','click',function(ev) {
		el = Ev.getTarget(ev);
		if (el.checked) {
			params['stock'] = 'all';
		} else {
			params['stock'] = '';
		}

		location.href = 'results.adp?' + generateQueryParams(params);
	});

	// producer blurb more links
	var links = Dom.getElementsByClassName('blurb_more_link','a','search_sort');
	for (var idx in links) {
		var link = links[idx];
		var id = link.id.split('_')[1];

		Ev.addListener(link,'click',function(ev, id) {
			Dom.hide('blurb_' + id + '_less');
			Dom.setStyle('blurb_' + id + '_more', 'opacity', 0);
			Dom.show('blurb_' + id + '_more');
			new YAHOO.util.Anim('blurb_' + id + '_more', { opacity: { to: 1 }, duration: 0.1 },0.5,YAHOO.util.Easing.easeBothStrong).animate();
	
			Ev.preventDefault(ev);
		}, id);
	}
}

Ev.onDOMReady(initSearchNav);
