/**
 * Aktivace ajaxoveho filtru
 *
 * @return void
 */
function aktivuj_filtr(options,reloadnow){
	var defaults = {
			symbolLevy : '',
			symbolPravy: 'Kč',
			param	   : {}
		};
	var opt = $.extend({}, defaults, options);

    var minPrice = parseInt($('#min_price').val());
    var maxPrice = parseInt($('#max_price').val());
    var step     = parseInt($('#step_price').val());
    var expire   = 5 * 1000;

    // inicializace loading obrazku
    loading(opt.txt_nacitam);

    // vybrani prislusnych textboxu a pridani akci pri blur
    // nacteni prislusne hodnoty a nasledne predani do posuvniku
    $('#price_from, #price_to').blur(function(){
        var value       = $(this).val();
        var handleIndex = ("price_from" == $(this).attr("id")) ? 0 : 1;
        var from        = parseInt($('#price_from').val());
        var to          = parseInt($('#price_to').val());

        if (value < minPrice) {
            value = minPrice;
            $(this).val(value);
        }
        if (value > maxPrice) {
            value = maxPrice;
            $(this).val(value);
        }

        // From musi byt mensi nez To, jinak uprav rozsah a vypis hlasku
        // pokud bude vse OK, tak spust AJAX filtr
        if (from > to) {
            alert(opt.txt_od_mensi);
            if (0 == handleIndex) {
                value = minPrice;
                $('#price_from').val(minPrice);
            } else {
                value = maxPrice;
                $('#price_to').val(maxPrice);
            }
        } else {
            updateSumFilter(from, to);
            // zakomentovano ... nejdrive zak. musi nastavit ceny a pak kliknout na tlacitko
			//ajax_reload(null,false);
        }

        $('#slider-range').slider("values", handleIndex, value);
    });
	// deaktivace tlacitka pro odeslani rozsahu cen, aby nereloadoval stranku
	// ajax odeslani formulare a reload stranky
	$('#price_submit').click(function(){
		ajax_reload(null,false);
		return false;
	});

    // aktivace a nastaveni slideru
    $('#slider-range').slider({
        range  : true,
        min    : minPrice,
        max    : maxPrice,
        step   : step,
        animate: true,
        values : (function(){
	                var values = [];
	                $('#price_from, #price_to').each(function(){
	                values.push($(this).val());
	                });
	                return values;
        })(),
        slide: function(event, ui) {
            $("#show_price_from").html(opt.symbolLevy + " " +
				$().number_format(
				ui.values[0] , {
				numberOfDecimals:0,
				decimalSeparator: ',',
				thousandSeparator: ' ',
				symbol: ''})
				+ " " + opt.symbolPravy);
			$("#show_price_to").html(opt.symbolLevy + " " +
				$().number_format(
				ui.values[1] , {
				numberOfDecimals:0,
				decimalSeparator: ',',
				thousandSeparator: ' ',
				symbol: ''})
				+ " " + opt.symbolPravy);
        },
        stop: function(event, ui) {
            $("#price_from").val(ui.values[0]);
			$("#price_to").val(ui.values[1]);

            updateSumFilter(ui.values[0], ui.values[1]);
            // spusteni AJAXu
            ajax_reload(null,false);
        }
    });

    // prepinani zobrazeni mezi slidrem a input boxy a nastaveni akce pri kliknuti
    $('#toggle_price_view').toggle(
        function(){
            $('#slider').hide();
            $('#price_inputs').show();
            setCookie('show_price_inputs', 1, expire);
        },
        function(){
            var from = $().number_format(
				$('#price_from').val(), {
				numberOfDecimals:0,
				decimalSeparator: ',',
				thousandSeparator: ' ',
				symbol: ''});
			var to = $().number_format(
				$('#price_to').val(), {
				numberOfDecimals:0,
				decimalSeparator: ',',
				thousandSeparator: ' ',
				symbol: ''});
            $("#show_price_from").html(opt.symbolLevy + " " + from + " " + opt.symbolPravy);
	    $("#show_price_to").html(opt.symbolLevy + " " + to + " " + opt.symbolPravy);
            $('#slider').show();
            $('#price_inputs').hide();
            setCookie('show_price_inputs', 0, expire);
        }
    ).click(function(){
        return false;
    });

    // na zaklade cookie se zobrazi bud inputy nebo slider
    if (1 == getCookie('show_price_inputs')) {
        $('#toggle_price_view').click();
    } else {
        $('#price_inputs').hide();
    }

    // po nacteni stranky se vypisi u slaideru hodnoty od-do
    $("#show_price_from").html(opt.symbolLevy + " " +
		$().number_format(
			$("#slider-range").slider("values", 0), {
			numberOfDecimals:0,
			decimalSeparator: ',',
			thousandSeparator: ' ',
			symbol: ''})
		+ " " + opt.symbolPravy);
    $("#show_price_to").html(opt.symbolLevy + " " +
		$().number_format(
			$("#slider-range").slider("values", 1) , {
			numberOfDecimals:0,
			decimalSeparator: ',',
			thousandSeparator: ' ',
			symbol: ''})
		+ " " + opt.symbolPravy);

    $('#vzestupne, #sestupne').bind('click', function(){
    	var element   = $('#trideni-select').val();

    	direction = ($(this).hasClass('DESC') ? " DESC" : "");

    	// update hidden inputu s tridenim
    	$("#filtry :input[name='Trideni']").val(element + direction);

    	// spusteni AJAXu
        ajax_reload(null,false);

    	return false;
    });

    $('#trideni-select').bind('change', function(){
    	var element = $(this).val();

    	$("#filtry :input[name='Trideni']").val(element);

    	// spusteni AJAXu
        ajax_reload(null,false);

    	return false;
    });


    // pri kliknuti na checkbox proved sestaveni filtru a proved ajax akci
    $('#filtry :checkbox.filtr_checkbox').bind('click', function(){
    	var id         = $(this).attr('id');
    	var classGroup = id.replace(/_\d+/, ''); // nacteni class urcite skupiny napr. filtr_vyr apod.
        var $checked   = $('#filtry :checkbox.' + classGroup +':checked');
        var prefix     = classGroup.replace(/filtr_/, '') + '~';

        var values = [];
        $checked.each(function(i){
            values[i] = $(this).val();
        });

        if (values.length) {
        	updateDivFilter('pomocny_' + classGroup, prefix + values.join('-'));
        } else {
        	updateDivFilter('pomocny_' + classGroup, '');
        }

        // spusteni AJAXu
        ajax_reload(null,false);

        return false;
    });

    // pri vybrani v selectbox filtru proved sestaveni filtru a proved ajax akci
    $('#filtry .filtr_selectbox').bind('change', function(){
    	var name       = $(this).attr('name');
    	var value      = $(this).val();
    	var nameHelp   = 'pomocny_' + name;
    	var nameFilter = name.replace(/filtr_/, '') + '~';

    	if (value.length) {
    		updateDivFilter(nameHelp, nameFilter + value);
    	} else {
    		updateDivFilter(nameHelp, '');
    	}

    	// spusteni AJAXu
    	ajax_reload(null,false);

        return false;
    });


	/**
	 * Aktualizace cenoveho filtru v hidden inputu
	 *
	 * @param int from
	 * @param int to
	 * @return void
	 */
	function updateSumFilter(from, to) {
	    // aktualizace cenoveho filtru
	    $("#filtry #pomocny_filtr_sum").val('sum~' + from + '-' + to);

	    updateGlobalFilter();
	}

	/**
	 * Aktualizace DIV filtru v hidden inputech
	 *
	 * @param string classGroup
	 * @param string value
	 * @return void
	 */
	function updateDivFilter(classGroup, value) {
	    // aktualizace pomocneho filtru
	    $("#filtry #" + classGroup).val(value);

	    updateGlobalFilter();
	}

	/**
	 * Aktualizace celeho filtru v hidden inputech
	 *
	 * @param string filter
	 * @return void
	 */
	function updateGlobalFilter() {
		var values = [];
		var i = 0;

		$('#filtry :input.pomocny_filtr').each(function(){
			if ($(this).val().length && undefined !== $(this).val())
				values[i++] = $(this).val();
        });

	    $("#filtry :input[name='filtr']").val(values.join('|')); // aktualizace zaznamu v hidden inputech
	}



	/**
	 * Zablokovani ajax filtru po dobu nactitani
	 * @return void
	 */
	function disable_filter()
	{

		$("#filter_disable").css("height", $("#filtry").height());
		$("#filter_disable").css("width", $("#filtry").width());
		$("#filter_disable").css("position", "absolute").css("z-index", "10").css("display", "block");
		$("#filter_disable").css("background-color", "#fff")
							.css("background-image", "url('" + web_root + "images/loading.gif')")
							.css("background-repeat", "no-repeat")
							.css("background-attachment", "scroll")
							.css("background-position", "50% 50%")
							.css("opacity", "0.5");
	}

	/**
	 * Provedeni AJAX dotazu na server a prekresleni stranky
     * @param string hash pokud je zadan, je podle nej filtr rekonstruovan
     * @param boolean dontUpdateAddressBar pokud je true, neupdatuji se po nacteni
     * noveho obsahu addressbar ani odkazy strankovani
	 * @return void
	 */
	function ajax_reload(hash, dontUpdateAddressBar) {
	    var param = getParams(hash);
	    param = $.extend({}, param, opt.param);
	    disable_filter();

	    $.ajax({
	        type   : 'GET',
	        url    : opt.urlAjax,
	        data   : param,
	        success: function(msg){
	            $('#page_reload').replaceWith(msg);
	            aktivuj_filtr({
	            	symbolLevy : opt.symbolLevy,
	            	symbolPravy: opt.symbolPravy,
	            	urlAjax    : opt.urlAjax,
	            	urlGET     : opt.urlGET,
	            	param	   : opt.param
	            	//KID        : opt.KID,
	            	//trideni    : opt.trideni
	            });
                if (!dontUpdateAddressBar) {
                    updateAddressBar();
                    updatePagination();
                }
	        },
	        error: function(msg){
	            location.reload(); // refresh stranky
	        }
	    });
	}

	/**
	 * Nacteni parametru ze skrytych poli
	 *
     * @param string hash
	 * @return object
	 */
	function getParams(hash) {
	    var id      = $("#filtry :input[name='return_kid']").val();
	    var sort    = $("#filtry :input[name='Trideni']").val();
	    var filter  = $("#filtry :input[name='filtr']").val();
        if (hash !== null && hash !== false) filter = hash;

	    var param   = {url: opt.urlGET, id: id};

	    if(sort.length) {
	    	param = $.extend(param, {Trideni: sort});
	    }

	    if(filter.length) {
	    	param = $.extend(param, {filtr: filter});
	    }

	    return param;
	}

    /**
     * vrati retezec filtru, ktery se pak dava do url
     * priklad: sum~445-900|~|vyr~46-43-16-24
     */
    function getUrlParams() {
        var filter  = $("#filtry :input[name='filtr']").val();
        return filter;
    }

    /**
     * odstrani z URL pridavne veci za #, ? nebo &
     */
    function removeSuffixFromUrl(str) {
        return str.replace(/[&?#]{1}.*$/g, "");
    }

    /**
     * odstrani z URL strankovani .../3/ => .../
     */
    function removePagingFromUrl(str) {
        if (str[str.length-1] == "/") {
            hlp = str.split("/");
            var lastUrlSegment = hlp[hlp.length-2];
            if (isNumeric(lastUrlSegment)) {
                hlp.pop();
                hlp.pop();
                str = hlp.join("/") + "/";
                return str;
            } else return str;
        } else return str;
    }

    function isNumeric(inputVal) {
        if (isNaN(parseFloat(inputVal))) {
            return false;
        }
        return true
    }

    /*
     * v adresovem radku prohlizece upravi stav filtru na aktualni tvar
     */
    function updateAddressBar() {
        var actualUrl = window.location.href;
        var actualHash = window.location.hash;

        // osekani pridavnych veci za url
        actualUrl = removeSuffixFromUrl(actualUrl);

        // osekani pocatecniho #
        while (actualHash.substr(0,1) == "#") {
            actualHash = actualHash.substr(1, actualHash.length - 1);
        }

        // odstraneni pripadneho strankovani
        var refreshNeeded = false;
        newActualUrl = removePagingFromUrl(actualUrl);
        if (newActualUrl != actualUrl)
            refreshNeeded = true;

        // pridani noveho
        var newFiltr = getUrlParams();
        var newHash = "";
        if (newFiltr && newFiltr != "" && newFiltr != "~")
            newHash = newFiltr;
        // a nakonec bud refresh nebo jen aktualizace hashe
        if (refreshNeeded) {
            if (newHash != "")
                window.location.href = newActualUrl + "#" + newHash;
            else
                window.location.href = newActualUrl;
        } else
            window.location.hash = newHash;
    }

    /**
     * odkazum s cisly stranek strankovani priradi spravny hash
     */
    function updatePagination() {
        $("a.pagination_page_number").each(function() {
            var href = $(this).attr("href");
            href = removeSuffixFromUrl(href);
            href += window.location.hash;
            $(this).attr("href", href);
        });
    }

	/**
	 * Nacteni parametru ze skrytych poli
	 *
	 * @return string
	 */
	/*
	function getParams() {
	    var url     = 'url=' + opt.urlGET;
	    var id      = 'id=' + $("#filtry :input[name='return_kid']").val();
	    var sort    = $("#filtry :input[name='Trideni']").val();
	    var filter  = $("#filtry :input[name='filtr']").val();
	    var param   = [url, id];
	    var i       = param.length;

	    if(sort.length) {
	        param[i++] = 'Trideni=' + sort;
	    }

	    if(filter.length) {
	        param[i++] = 'filtr=' + filter;
	    }

	    return param.join('&');
	}
	*/

   /*
    * zkontroluje jestli obsah stranky souhlasi s filtrem nastavenym v hashi
    * pokud ne tak dojde k obnoveni obsahu pomoci filtru v hashi
    */
   if (reloadnow) {
        $(document).ready(function() {
            var filter  = $("#filtry :input[name='filtr']").val();
            var hash = window.location.hash;
            while (hash.substr(0,1) == "#") {
                hash = hash.substr(1, hash.length - 1);
            }
            if (filter != hash) {
                ajax_reload(hash, false);
            }
        });
        updatePagination();
    }
}

/**
 * Ulozeni informace do cookie
 *
 * @param string     c_name
 * @param string|int value
 * @param int        expire
 * @return void
 */
function setCookie(c_name, value, expire) {
    var exdate = new Date();
    exdate.setDate(exdate.getDate() + expire);
    document.cookie = c_name + "=" + escape(value) +
        ((expire == null) ? "" : ";expires=" + exdate.toGMTString());
}

/**
 * Nacteni konkretniho cookie
 *
 * @param string c_name
 * @return string|int
 */
function getCookie(c_name) {
    if (document.cookie.length > 0) {
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1) {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) c_end = document.cookie.length;
                return unescape(document.cookie.substring(c_start, c_end));
        }
    }
    return "";
}

/**
 * Vytvoreni nacitaciho obrazku
 * @return void
 */
function loading(txt_nacitam) {
	if (!$('#loading').length) {
		var $loadingDiv = $('<div></div>')
							.attr('id', 'loading')
							.hide()
							.html('<img src="' + web_root + 'images/loading.gif" alt="' + txt_nacitam + '" />')
							.appendTo('body');
	}
}

/**
 * Zobrazeni nacitaciho obrazku
 * @return
 */
function showLoading() {
	if ($('#loading').length) {
		$('#loading').show();
	}
}

/**
 * Skryti nacitaciho obrazku
 * @return
 */
function hideLoading() {
	if ($('#loading').length) {
		$('#loading').hide();
	}
}

// TODO ... odstranit ... jen pro vyvoj aplikace
function log(data, msg) {
    if (msg) {
        msg += ': ';
    } else {
        msg = '';
    }

    console.log(msg, data);
}
