function ajaxfilter_hide_products()
{
//    var items = $('narrow-by-list').select('a', 'input');
//    n = items.length;
//    for (i=0; i<n; ++i){
//        items[i].addClassName('adj-nav-disabled');
//    }

//   if (typeof(adj_slider) != 'undefined')
//       adj_slider.setDisabled();

	var divs = $$('div.adj-nav-progress');
	for (var i=0; i<divs.length; ++i)
		divs[i].show();
}

function ajaxfilter_show_products(transport)
{
	var resp = {} ;
	if (transport && transport.responseText){
		try {
			resp = eval('(' + transport.responseText + ')');
		}
		catch (e) {
			resp = {};
		}
	}

	if (resp.products){
		var el = $('adj-nav-container');
		var ajaxUrl = $('adj-nav-ajax').value;

		el.update(resp.products.gsub(ajaxUrl, $('adj-nav-url').value));
		ajaxfilter_toolbar_init(); // reinit listeners

		$('adj-nav-navigation').update(resp.layer.gsub(ajaxUrl, $('adj-nav-url').value));

		$('adj-nav-ajax').value = ajaxUrl;
	}

	var items = $('narrow-by-list').select('a','input');
	n = items.length;
	for (i=0; i<n; ++i){
		items[i].removeClassName('adj-nav-disabled');
	}
	if (typeof(adj_slider) != 'undefined')
		adj_slider.setEnabled();
}

function ajaxfilter_add_params(k, v, isSingleVal)
{
	var el = $('adj-nav-params');
	var params = el.value.parseQuery();
	var strVal = params[k];
	if (typeof strVal == 'undefined' || !strVal.length){
		params[k] = v;
	}
	else if('clear' == v ){
		params[k] = 'clear';
	}
	else {
		if (k == 'price')
			var values = strVal.split(',');
		else
			var values = strVal.split('-');

		if (-1 == values.indexOf(v)){
			if (isSingleVal)
				values = [v];
			else
				values.push(v);
		}
		else {
			values = values.without(v);
		}

		params[k] = values.join('-');
	}
	el.value = Object.toQueryString(params).gsub('%2B', '+');
}

function ajaxfilter_toolbar_init()
{
	var items = $('adj-nav-container').select('.pages a', '.view-mode a', '.sort-by a');
	var i, n = items.length;
	for (i=0; i<n; ++i){
		Event.observe(items[i], 'click', ajaxfilter_toolbar_listener);
	}
}

function trim(string)
{
	return string.replace(/(^\s+)|(\s+$)/g, "");
}


function ajaxfilter_make_request(param)
{
	if (param)
	{
		$('adj-nav-params').value = param;
	}
Effect.ScrollTo('top');
	ajaxfilter_hide_products();
	if (trim($('block-layered-nav').innerHTML) != '')
	{
		resetOptions();
	}
	new Ajax.Updater(
					{success:'adj-nav-container'},
					$('adj-nav-ajax').value,
					{method: 'post',
					postBody: (param?param:$('adj-nav-params').value),
					evalScripts: true,
					onSuccess: function(v){
						window.location.hash = $('adj-nav-params').value;
						recentUrlHash = window.location.hash;
					}
				}
			);

}


function adj_update_links(evt, className, isSingleVal)
{
	var link = Event.findElement(evt, 'A'),
		sel = 'selected';

	if (link.hasClassName(sel))
		link.removeClassName(sel);
	else
		link.addClassName(sel);

	//only one  price-range can be selected
	if (isSingleVal){
		var items = $('narrow-by-list').getElementsByClassName(className);
		var i, n = items.length;
		for (i=0; i<n; ++i){
			if (items[i].hasClassName(sel) && items[i].id != link.id)
				items[i].removeClassName(sel);
		}
	}
	ajaxfilter_add_params(link.id.split('-')[0], link.id.split('-')[1], isSingleVal);
	ajaxfilter_make_request();

	Event.stop(evt);
}

function ajaxfilter_attribute_listener(evt)
{
	ajaxfilter_add_params('p', 'clear', 1);
	adj_update_links(evt, 'adj-nav-attribute', 0);
}

function ajaxfilter_icon_listener(evt)
{
	ajaxfilter_add_params('p', 'clear', 1);
	adj_update_links(evt, 'adj-nav-icon', 0);
}

function ajaxfilter_price_listener(evt)
{
	ajaxfilter_add_params('p', 'clear', 1);
	adj_update_links(evt, 'adj-nav-price', 1);
}

function ajaxfilter_clear_listener(evt)
{
	var link = Event.findElement(evt, 'A'),
		varName = link.id.split('-')[0];

	ajaxfilter_add_params('p', 'clear', 1);
	ajaxfilter_add_params(varName, 'clear', 1);

	if ('price' == varName){
		var from =  $('adj-nav-price-from'),
			to   = $('adj-nav-price-to');

		if (Object.isElement(from)){
			from.value = from.name;
			to.value   = to.name;
		}
	}

	ajaxfilter_make_request();

	Event.stop(evt);
}


function ajaxfilter_round(num){
	num = parseFloat(num);
	if (isNaN(num))
		num = 0;

	return Math.round(num);
}

function ajaxfilter_price_input_listener(evt){
	if (evt.type == 'keypress' && 13 != evt.keyCode)
		return;

	var numFrom = ajaxfilter_round($('adj-nav-price-from').value),
		numTo   = ajaxfilter_round($('adj-nav-price-to').value);

	if ((numFrom<0.01 && numTo<0.01) || numFrom<0 || numTo<0)
		return;

	ajaxfilter_add_params('p', 'clear', 1);
	ajaxfilter_add_params('price', numFrom + ',' + numTo, true);
	ajaxfilter_make_request();
}

function ajaxfilter_category_listener(evt){
	var link = Event.findElement(evt, 'A');
	var catId = link.id.split('-')[1];

	var reg = /cat=/;
	if (reg.test(link.href)){ //is search
		ajaxfilter_add_params('cat', catId, 1);
		ajaxfilter_add_params('p', 'clear', 1);
		ajaxfilter_make_request();
		Event.stop(evt);
	}
	//do not stop event
}

function ajaxfilter_toolbar_listener(evt){
	ajaxfilter_toolbar_make_request(Event.findElement(evt, 'A').href);
	Event.stop(evt);
}

function ajaxfilter_toolbar_make_request(href)
{
    href.replace('Lhttp::','http://');
	var pos = Math.max(href.indexOf('?p='), href.indexOf('&p='));
	if (pos > -1){
		ajaxfilter_add_params('p', href.substring(pos+3, href.length), 1);
	}
	var pos = Math.max(href.indexOf('?mode='), href.indexOf('&mode='));
	if (pos > -1){
		ajaxfilter_add_params('mode', href.substring(pos+6, href.length), 1);
	}
	var pos = Math.max(href.indexOf('?limit='), href.indexOf('&limit='));
	if (pos > -1){
		ajaxfilter_add_params('p', 'clear', 1);
		ajaxfilter_add_params('limit', href.substring(pos+7, href.length), 1);
	}
	var pos = Math.max(href.indexOf('?order='), href.indexOf('&order='));
	if (pos > -1){
		ajaxfilter_add_params('p', 'clear', 1);
		ajaxfilter_add_params('order', href.substring(pos+7, href.indexOf('&dir=')), 1);
	}
	var pos = href.indexOf('&dir=');
	if (pos > -1){
		ajaxfilter_add_params('p', 'clear', 1);
		ajaxfilter_add_params('dir', href.substring(pos+5, href.length), 1);
	}
	ajaxfilter_make_request($('adj-nav-params').value);
}

function ajaxfilter_dt_listener(evt){
	var e = Event.findElement(evt, 'DT');
	e.nextSiblings()[0].toggle();
	e.toggleClassName('adj-nav-dt-selected');
}

function ajaxfilter_clearall_listener(evt)
{
	var params = $('adj-nav-params').value.parseQuery();
	$('adj-nav-params').value = 'adjclear=true';
	if (params['q'])
	{
		$('adj-nav-params').value += '&q=' + params['q'];
	}
	ajaxfilter_make_request();
	Event.stop(evt);
}

function getRoundedSliderValues(){
	return [Math.round(slider.values[0]), Math.round(slider.values[1])];
}

function updateSliderLabels(sliderValues){
	var roundedValues = getRoundedSliderValues();
	$('filter-price-min-value').update('&euro;'+roundedValues[0]);
	$('filter-price-max-value').update('&euro;'+roundedValues[1]);
}

function priceRangeChanged(){
	var roundedValues = getRoundedSliderValues();
	ajaxfilter_add_params('price', roundedValues[0] + ',' + roundedValues[1], true);
	ajaxfilter_make_request();
}

function ajaxfilter_init()
{
	var items, i, j, n,
		classes = ['category', 'attribute', 'icon', 'price', 'clear', 'dt', 'clearall'];

	for (j=0; j<classes.length; ++j){
		items = $('narrow-by-list').select('.adj-nav-' + classes[j]);
		n = items.length;
		for (i=0; i<n; ++i){
			Event.observe(items[i], 'click', eval('ajaxfilter_' + classes[j] + '_listener'));
		}
	}

	var btn = $('adj-nav-price-go');
	if (Object.isElement(btn)){
		Event.observe(btn, 'click', ajaxfilter_price_input_listener);
		Event.observe($('adj-nav-price-from'), 'keypress', ajaxfilter_price_input_listener);
		Event.observe($('adj-nav-price-to'), 'keypress', ajaxfilter_price_input_listener);
	}
}


function ajaxfilter_create_slider(width, from, to, max_price)
{
	var price_slider = $('adj-nav-price-slider');

	return new Control.Slider(price_slider.select('.handle'), price_slider, {
		range: $R(0, width),
		sliderValue: [from, to],
		restricted: true,

	onChange: function (values){
		var f = ajaxfilter_round(max_price*values[0]/width),
			t = ajaxfilter_round(max_price*values[1]/width);

		ajaxfilter_add_params('price', f + ',' + t, true);

		// we can change values without sliding
		$('adj-nav-range-from').update(f);
		$('adj-nav-range-to').update(t);

		ajaxfilter_make_request();
		},
		onSlide: function(values) {
		$('adj-nav-range-from').update(ajaxfilter_round(max_price*values[0]/width));
		$('adj-nav-range-to').update(ajaxfilter_round(max_price*values[1]/width));
		}
	});
}

function initSlider()
{
	handles = [$('filter-price-min-handle'), $('filter-price-max-handle')];
	if (undefined == window.priceRangeInitial){
		window.priceRangeInitial = [1,2];
	}
	slider = new Control.Slider(handles, 'filter-price-slider', {
		range: $R(priceRangeInitial[0], priceRangeInitial[1]),
		sliderValue: setPriceRange(),
		spans: ['filter-price-slider-rangetrack'],
		restricted: true,
		onSlide: function(v){ updateSliderLabels(v); },
		onChange: function(v){ priceRangeChanged(v); }
	});
	updateSliderLabels();
}

var recentUrlHash = "";
function checkUrlHash() {
	if (window.location.hash==recentUrlHash) {
		return; // Nothing's changed since last check.
	}
	recentUrlHash = window.location.hash;
	ajaxfilter_make_request(window.location.hash.substr(1));
	}

Event.observe(window,
				'load',
				function(){
					if (window.location.hash)
					{
						checkUrlHash();
					}
					setInterval(checkUrlHash, 100);
				});

