/** @file products_filter.js
 * Tvori filter pro produkty podle ceny a jejich strankovani.
 * Ajaxove stahne a zobrazi produkty, ktere filtru odpovidaji.
 * Nastaveny filtr uklada do cookies, cili si pamatuje posledni
 * nastevenou pozici (a na ktere strance to bylo).
 * Potrebuje knihovnu pro praci s cookies (trida Cookies, metody get a set).
 * Predpoklada spravne prednastavene promenne
 *		base_url, slider_minimum, slider_maximum, active_tab_id,
 *		active_category_id, products_pagination_link
 */

document.observe('dom:loaded', initSlider);

// Control.Slider vytvoreny na slideru
var productsSlider = null;
// velikost handlu v hodnotach slideru
var productsHandleWidth;

function initSlider(){
	var slider = $('slider');
	if(!slider){
		return;
	}
	// velikost slideru v hodnotach
	var range = slider_maximum - slider_minimum;
	// velikost handlu v pixelech (plus nejaky margin)
	var realHandleWidth = slider.select('.handle').first().getWidth() +1;
	// velikost handlu v hodnotach slideru
	productsHandleWidth = range * realHandleWidth / slider.getWidth();
	productsSlider = new Control.Slider(
		slider.select('.handle'), slider, {
			restricted: true,
			// TODO increment
			range: $R(slider_minimum, slider_maximum),
			sliderValue: [slider_minimum, slider_maximum],
			onSlide: sliderMoved,
			onChange: sliderChanged
		});
	// inputy pro rucni zadavani hranice
	var lowerInput = $('slider_handle_0');
	var upperInput = $('slider_handle_1');
	lowerInput.observe('change', inputChanged);
	lowerInput.value = round(slider_minimum);
	lowerInput.title = 'Minimální cena: '+slider_minimum;
	upperInput.observe('change', inputChanged);
	upperInput.value = round(slider_maximum);
	upperInput.title = 'Maximální cena: '+slider_maximum;
	// nastavit podle cookies
	var myCookie = new Cookies();
	if(active_tab_id==myCookie.get('productsFilterTab') &&
			active_category_id==myCookie.get('productsFilterCategory')){
		var lower = parseFloat(myCookie.get('productsFilterLower'));
		var upper = parseFloat(myCookie.get('productsFilterUpper'));
		var limit = myCookie.get('productsFilterLimit');
		productsSlider.setValue(lower, 0);
		productsSlider.setValue(upper, 1);
		updateProducts(limit);
	}
}

function inputChanged(){
	var handleIndex = this.id.substr(this.id.lastIndexOf('_')+1);
	var value = round(parseFloat(this.value));
	if(value!=round(productsSlider.values[handleIndex])){
		productsSlider.setValue(value, handleIndex);
	}
}

function sliderMoved(values) {
	$('slider_handle_0').value = round(values[0]);
	$('slider_handle_1').value = round(values[1]);
}

function sliderChanged(values){
	if(values[0]+productsHandleWidth >= values[1]){
		// zakazat rekurzivni volani teto fce
		productsSlider.options.onChange = function(){};
		// nastavit lepsi hodnoty
		if(lastUsedHandle()==0){
			productsSlider.setValue(values[1]-productsHandleWidth, 0);
		} else {
			productsSlider.setValue(values[0]+productsHandleWidth, 1);
		}
		// nastavit zpet tuto fci na onChange
		productsSlider.options.onChange = sliderChanged;
	}
	sliderMoved(productsSlider.values);
	updateProducts(0);
}

function lastUsedHandle(){
	var i;
	var handles = $('slider').select('.handle');
	for(i = 0 ; i < handles.length ; ++i ){
		if(handles[i].hasClassName('selected')){
			break;
		}
	}
	return i;
}

function round(val){
	return Math.round(val);
}

/**
 * Ajax.Request.abort
 * extend the prototype.js Ajax.Request object so that it supports an abort method
 */
Ajax.Request.prototype.abort = function() {
    // prevent and state change callbacks from being issued
    this.transport.onreadystatechange = Prototype.emptyFunction;
    // abort the XHR
    this.transport.abort();
    // update the request counter
    Ajax.activeRequestCount--;
};

var lastAjaxRequest = null;

/** Obnoveni produktu.
 * @param limit - od ktereho produktu se maji produkty zobrazovat
 * Ano, jedna se v podstate o offset, ale vzhledem k tomu, ze je to
 * spatne pojmenovane skoro na cele vasi-reklame, ponechavam zpetnou kompatibilitu
 * a pojmenovani promenne limit ikdyz se jedna o offset.
 */
function updateProducts(limit){
	var lower = productsSlider.values[0];
	var upper = productsSlider.values[1];
	showLoading();
	if(lastAjaxRequest){
		lastAjaxRequest.abort();
	}
	lastAjaxRequest = new Ajax.Updater(
		'products_content', base_url+'price_filter/'+lower+'/'+upper+'/'+limit, {
			parameters: {
					tab: active_tab_id,
					category: active_category_id,
					link: products_pagination_link
				},
			onComplete: function(){
					lastAjaxRequest = null;
					hideLoading();
					initExpanders();
					$$('#products_content .pagination a').each( function(anchorEl){
							anchorEl.observe('click', filterPaginationAnchorClicked);
						});
					// nastavit do cookies
					var myCookie = new Cookies();
					myCookie.set('productsFilterTab', active_tab_id);
					myCookie.set('productsFilterCategory', active_category_id);
					myCookie.set('productsFilterLower', lower);
					myCookie.set('productsFilterUpper', upper);
					myCookie.set('productsFilterLimit', limit);
					// fix for adding the abort method
					if(Ajax.activeRequestCount < 0){
						Ajax.activeRequestCount = 0;
					}
				}
		});
}

function filterPaginationAnchorClicked(event){
	event.stop();
	updateProducts(this.href.substr(this.href.lastIndexOf('#')+1));
}

function showLoading(){
	$$('#slider img.loading').first().appear();
}
function hideLoading(){
	$$('#slider img.loading').first().fade();
}
