// reallysimplehistory initialisation for prototype
window.dhtmlHistory.create({
    toJSON: function(o) {
      return Object.toJSON(o);
    },
    fromJSON: function(s) {
      return s.evalJSON();
    }
});
window.dhtmlHistory.fireOnNewListener = false;

myDeco.search = {
    lastLocation: '',
    
    checkLocation: function() {
        if (location && location.href && location.href.indexOf('#') > 0) {
            var loc = location.href.substr(location.href.indexOf('#') + 1);
            if (loc != myDeco.search.lastLocation) {
                myDeco.search.historyListener(loc, '');
            }
        }
    },
    
    historyListener: function(newLocation, historyData) {
        if (!newLocation) return; //newLocation == ''
        myDeco.search.makeQuery(unescape(newLocation));
        myDeco.search.lastLocation = newLocation;
    },
    
    init: function() {
        try {
            myDeco.search.request_count = 0;
            myDeco.search.url = myDeco.urls.search_ajax;
            myDeco.search.initLoaders();
            myDeco.search.initSliders();
            myDeco.search.initRefiners();
            myDeco.search.initHoverBubbles();
            myDeco.search.initFacetsCollapse();
            dhtmlHistory.initialize();
            dhtmlHistory.addListener(myDeco.search.historyListener);

            /*dhtmlHistory don't want to fire historyEvents when page
            is opened from bookmark, so we manually check location.href
            and make AJAX-query if page was not yet updated.*/
            myDeco.search.checkLocation();
        }
        catch (e) {
            console.log('Error : search.js : myDeco.search.init : ' + e );
        }
    },
    
    initLoaders : function() {
    	myDeco.search.loaders = $$('.ajax-loader');
    },
    
    initSliders : function() {
        myDeco.search.sliders = {};
        $$('.search-slider-container').each(myDeco.search.initSlider);
    },

    initSlider : function(slider) {
        var slider_name = slider.id.substr(0, slider.id.indexOf('-'));
        var min_input = $('min-' + slider_name + '-txtf');
        var max_input = $('max-' + slider_name + '-txtf');

        if (min_input != null && max_input != null) {
            var min_val = min_input.value;
            var max_val = max_input.value;

            if (min_val.substr(0, 1) == myDeco.settings.LOCALECONV.currency_symbol) {
                min_val = min_val.substr(1);
            }
            if (max_val.substr(0, 1) == myDeco.settings.LOCALECONV.currency_symbol) {
                max_val = max_val.substr(1);
            }
            min_val = parseFloat(min_val);
            max_val = parseFloat(max_val);

            if (!isNaN(min_val) && !isNaN(max_val)) {
                var handles = [slider_name + '-slider-handle-min', slider_name + '-slider-handle-max'];
                var values = [min_val, max_val]; // First handle at 0, 2nd at 100
                var alignXVals = [0, 1000];
                var step = slider_name == 'price' ? 1 : 0.01;
                var slider = new Control.Slider(handles, slider_name + '-slider-track', {
                    'range':$R(min_val, max_val, false),
                    'step': step,
                    'restricted':true,
                    'sliderValue': values,
                    'alignX': alignXVals
                  });
                slider.options.onSlide =  myDeco.search.updateSliderVals;
                slider.options.onChange = myDeco.search.refineBySlider;
                slider.name = slider_name;
                slider.min_input = min_input;
                slider.max_input = max_input;
                myDeco.search.sliders[slider_name] = slider;
            
                min_input.prevValue = min_val;
                max_input.prevValue = max_val;
            
                if (slider_name == 'price') {
                    // set min/max via jscript to add currency symbol and round vals
                    min_input.value = myDeco.settings.LOCALECONV.currency_symbol + min_val;
                    max_input.value = myDeco.settings.LOCALECONV.currency_symbol + max_val;
                    min_input.observe('focus', myDeco.search.rmCurrencySymbol);
                    min_input.observe('blur', myDeco.search.addCurrencySymbol);
                    max_input.observe('focus', myDeco.search.rmCurrencySymbol);
                    max_input.observe('blur', myDeco.search.addCurrencySymbol);
                }
            
                new Form.Element.Observer(
                    min_input,
                    2,
                    myDeco.search.refineSliderByRange
                )
                new Form.Element.Observer(
                    max_input,
                    2,
                    myDeco.search.refineSliderByRange
                )
            }
        }
    },
    
    updateSliderVals : function(values, slider) {
        if (slider.name == 'price') {
            var prefix = myDeco.settings.LOCALECONV.currency_symbol;
            var step = 1;
        } else {
            var prefix = '';
            var step = 0.01;
        }
        slider.min_input.value = prefix + Math.round(values[0] / step) * step;
        slider.max_input.value = prefix + Math.round(values[1] / step) * step;
    },
    
    initRefiners : function() {
        var refiners = $$('.ajax-search-refiner');
        refiners.each(function(refiner) {
            if (refiner.__processed) return;
            
            myDeco.search['init' + refiner.tagName.capitalize() + 'Refiner'](refiner);
            refiner.__processed = true;
        });
        var jrefiners = $$('.js-search-refiner');
        jrefiners.each(function(refiner) {
            if (refiner.__processed) return;
            refiner.observe('change', myDeco.search.reloadByForm);
            refiner.observe('click', function(e){ Event.element(e).blur(); });
            refiner.__processed = true;
        });
        myDeco.multipleFacets.init();
    },
    
    initARefiner : function(el) {
        el.observe('click', myDeco.search.refineByHref);
    },
	
    initAreaRefiner : function(el) {
        el.observe('click', myDeco.search.refineByArea);
    },
    initSelectRefiner : function(el) {
        el.observe('change', myDeco.search.refineByForm);
    },
    
    initInputRefiner : function(el) {
        el.observe('click', myDeco.search.refineByForm);
    },

    initHoverBubbles : function() {
        if($$('.images-only').length > 0){
            myDeco.hoverBubble.initBubbles('.images-only li.product','imagecontainer','bubble');
        }
        
        // hover bubble for BTL search results
        if($('buy-the-look-results')) {
            myDeco.hoverBubble.initBubbles('#buy-the-look-results li','btl-link','bubble');
        }
    },

    initFacetsCollapse : function() {
        $$('#facet-links h2, #dimension-sliders h2').each(function(h) {
            h.observe('mouseover', function(e) { Event.findElement(e, 'h2').addClassName('prepared'); });
            h.observe('mouseout', function(e) { Event.findElement(e, 'h2').removeClassName('prepared'); });
            h.observe('click', function(e) { 
                var el = Event.findElement(e, 'h2');
                var next = el.next();
                if (next.tagName == "UL") {
                    next.toggleClassName('hidden');
                    el.toggleClassName('closed'); 
                } else {
                    next.toggleClassName('dim-sliders-hidden');
                    next.next().toggleClassName('dim-sliders-hidden');
                    el.toggleClassName('closed'); 
                }
            });
        });
    },

    addCurrencySymbol : function(e) {
        var el = Event.findElement(e, 'input');
        if (el.value.substr(0, 1) == myDeco.settings.LOCALECONV.currency_symbol) return;
        var fvalue = parseFloat(el.value);
        if (!fvalue) fvalue = 0;
        el.value = myDeco.settings.LOCALECONV.currency_symbol + fvalue;
    },
    
    rmCurrencySymbol : function(e) {
        var el = Event.findElement(e, 'input');
        el.value = Math.round(parseFloat(el.value.substr(1)));
    },
    
    refineSliderByRange : function(el, value) {
        var prefix = '';
        if (el.value.substr(0, 1) == myDeco.settings.LOCALECONV.currency_symbol) {
            el.value = el.value.substr(1);
            prefix = myDeco.settings.LOCALECONV.currency_symbol;
        }
        el.value = parseFloat(el.value);
        if (!el.value) el.value = 0;
        fvalue = el.value;
        el.value = prefix + el.value;
        if (fvalue == el.prevValue) return;
        el.prevValue = fvalue;
        
        if (el.name.substr(0, 3) == 'min') var id = 0;
        else var id = 1;
        
        var slider_name = el.name.substr(4, el.name.indexOf('-', 4) - 4);
        myDeco.search.sliders[slider_name].setValue(parseFloat(fvalue), id);
    },
    
    refineByParams : function(params) {
        myDeco.search.makeQuery($H(params).toQueryString());
    },
    
    makeQuery : function(query_string) {
        myDeco.search.request_count++;
        new Ajax.Request(myDeco.search.url + '?' + query_string, {
            asynchronous: true,
            onCreate : myDeco.search.showLoader,
            onSuccess : myDeco.search.handleSuccess,
            onFailure : myDeco.search.handleFailure
        });
        dhtmlHistory.add(escape(query_string), "");
    },
    
    refineBySlider : function(range, slider) {
        var params = $(slider.name + '_slider_url').href.toQueryParams();
        var from_val = range[0];
        var to_val = range[1];
        if (params.ranges == undefined) {
            params.ranges = slider.name + ',' + from_val + ',' + to_val;
        } else if (typeof(params.ranges) == "string") {
            params.ranges = [params.ranges,slider.name + ',' + from_val + ',' + to_val];
        } else {
            params.ranges[params.ranges.length] = slider.name + ',' + from_val + ',' + to_val;
        }
        myDeco.search.refineByParams(params);
    },
    
    refineByHref : function(e) {
        Event.stop(e);
        var params = Event.findElement(e, 'A').href.toQueryParams();
        myDeco.search.refineByParams(params);
    },
    refineByArea : function(e) {
        Event.stop(e);
        var params = Event.findElement(e, 'AREA').href.toQueryParams();
        myDeco.search.refineByParams(params);
    },
    
    refineByForm : function(e) {
        var params = Form.serialize(Event.findElement(e, 'FORM')).toQueryParams();
        myDeco.search.refineByParams(params);
    },
    
    reloadByForm : function(e) {
        var params = Event.findElement(e, 'FORM').submit();
    },
    
    handleSuccess : function(t) {
        try {
            myDeco.search.request_count--;
            if (myDeco.search.request_count > 0) return;
            var response = t.responseText.evalJSON();
            if (response.success) {
            	$$('.ajax-search-block').each(function(block){
	            	block.innerHTML = '';
	            });
                $H(response.blocks).each(function(block) {
                    var el = $(block[0]);
                    el.innerHTML = block[1];
                });
                myDeco.search.initRefiners();
                // need to recreate the bubbles for the new HTML
                myDeco.bubbles.init();
                //also, popups need recreation too
                myDeco.infoPopups.build('.favourite-retailers');
                myDeco.search.initHoverBubbles();
            }
            else {
                myDeco.search.showError(response.errmsg || response.error && response.error.message);
            }
            myDeco.search.hideLoader();
        }
        catch (e) {
            console.log('search.js : handleSuccess : ' + e);
        }
    },
    
    handleFailure : function(t) {
        console.log('Failure');
        myDeco.search.showError('AJAX request was failed.');
        myDeco.search.hideLoader();
    },
    
    showLoader : function() {
        if (myDeco.search.request_count > 1) return;
        myDeco.search.loaders.each(function(loader) {
        	loader.removeClassName('ajax-loader-hidden');
        });
    },
    
    hideLoader : function() {
        myDeco.search.loaders.each(function(loader) {
        	loader.addClassName('ajax-loader-hidden');
        });
    },
    
    showError : function(message) {
        console.log('showError' + message + $('search-result'));
        if ($('search-result')) {
            $('search-result').innerHTML = '<em class="error">Error: ' + message + '</em>';
        }
    }
}

addLoadEvent(myDeco.search.init);

myDeco.multipleFacets = {
init : function() {
           var multifacets = $$('.multifacets');
           if (multifacets.length == 0) return;
           var facet = multifacets[0].id;
           multifacets.each(function(f) {
               f.observe('click', myDeco.multipleFacets.show);
           });
       },

show : function(e) {
           Event.stop(e);
           var link = Event.findElement(e, 'A');
           var facet = link.id.substr(0, link.id.indexOf('-'));
           var checkboxes = $$('.' + facet + '-facet');
           checkboxes.each(function(el) {
               el.style.display = 'inline';
               var facet_link = el.next('a');
               facet_link.stopObserving('click', myDeco.search.refineByHref);
               facet_link.observe('click', myDeco.multipleFacets.select);
           });
           link.innerHTML = '>> Search <<';
           link.stopObserving('click', myDeco.multipleFacets.show);
           link.observe('click', myDeco.multipleFacets.search);
       },

select : function(e) {
             Event.stop(e);
             var link = Event.findElement(e, 'A');
             var chbox = link.previous('input');
             if (chbox.checked == true) {
                 chbox.checked = false;
             } else {
                 chbox.checked = true;
             }
         },

search : function(e) {
             Event.stop(e);
             var link = Event.findElement(e, 'A');
             var chboxes = $$('.' + link.id.replace('multifacets', 'facet'));
             var base_url = $('facet_url').href;
             var add_params = '';
             chboxes.each(function(c) {
                 if (c.checked) {
                     var flink = c.next('a');
                     add_params += flink.href.substr(base_url.length, flink.href.length);
                 }
             });
             if (add_params == '') return;
             
             myDeco.search.refineByParams((base_url + add_params).toQueryParams());
         }
}
