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 ajaxfilter_make_request(param)
{
    if (param) $('adj-nav-params').value = param;
    ajaxfilter_hide_products();
    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){
                            Effect.ScrollTo('top');
                         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)
{
    var pos = href.indexOf('?p=');
    if (pos > -1){
        ajaxfilter_add_params('p', href.substring(pos+3, href.length), 1);
    }
    var pos = href.indexOf('?mode=');
    if (pos > -1){
        ajaxfilter_add_params('mode', href.substring(pos+6, href.length), 1);
    }
    var pos = href.indexOf('?limit=');
    if (pos > -1){
        ajaxfilter_add_params('limit', href.substring(pos+7, href.length), 1);
    }
    var pos = href.indexOf('?order=');
    if (pos > -1){
        ajaxfilter_add_params('order', href.substring(pos+7, href.indexOf('&dir=')), 1);
    }
    var pos = href.indexOf('&dir=');
    if (pos > -1){
        ajaxfilter_add_params('dir', href.substring(pos+5, href.length), 1);
    }
    ajaxfilter_make_request();
}

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);
                });

