var LayeredNavigation = Class.create();
    LayeredNavigation.prototype = {
        initialize: function(config) {
            this.useAjax = parseInt(config.useAjax);
            this.sliderFlag = parseInt(config.slider);
            this.minRange = parseInt(config.minRange);
            this.maxRange = parseInt(config.maxRange);
            this.minPrice = parseInt(config.minRange);
            this.maxPrice = parseInt(config.maxRange);
            this.mediaUrl = config.mediaUrl;
            this.categoryUrl = config.categoryUrl;
            
            this.home = parseInt(config.isHome);
            
            this.currentUrlParams = document.location.search;
            
            if (this.sliderFlag) {
                this.addPriceSlider();
            }
            this.addObservers();
            this.checkUrlHash();
        },

        addObservers: function() {
            var self = this;
            
            $$('.ajax-option-link').each(function(el) {
                Event.observe(el, 'click', function(e) {
                    e.stop();
                    self.reload.bind(self, this.href)();
                });
            });
            
            $$('.ajaxlayerednavigation-img-link').each(function(el) {
                Event.observe(el, 'click', function(e) {
                    e.stop();
                    self.reload.bind(self, this.href)();
                });
            });
            
            $$('.ajax-option-select').each(function(el) {
                Event.observe(el, 'change', function(e) {
                    if (this.value) {
                        self.reload.bind(self, this.value)();
                    }
                });
            });
            
            $$('.ajax-option-checkbox').each(function(el) {
                Event.observe(el, 'click', function(e) {
                    self.reload.bind(self, this.value)();
                });
            });

            $$('a.list').each(function(el) {
                Event.observe(el, 'click', function(e) {
                    e.stop();
                    var query = self.getUrlQuery(this.href);
                    if (query) {
                        var url = self.categoryUrl + query;
                    } else {
                        var url = self.categoryUrl;
                    }
                    self.reload.bind(self, url)();
                });
            });

            $$('a.grid').each(function(el) {
                Event.observe(el, 'click', function(e) {
                    e.stop();
                    var query = self.getUrlQuery(this.href);
                    if (query) {
                        var url = self.categoryUrl + query;
                    } else {
                        var url = self.categoryUrl;
                    }
                    self.reload.bind(self, url)();
                });
            });
            
            $$('div.sort-by select').each(function(el) {
                el.stopObserving('change');
                el.onchange = function() {
                    return false;
                }
                Event.observe(el, 'change', function(e) {
                    e.stop();
                    var query = self.getUrlQuery(this.value);
                    if (query) {
                        var url = self.categoryUrl + query;
                    } else {
                        var url = self.categoryUrl;
                    }
                    self.reload.bind(self, url)();
                });
            });

            $$('div.sort-by a').each(function(el) {
                Event.observe(el, 'click', function(e) {
                    e.stop();
                    var query = self.getUrlQuery(this.href);
                    if (query) {
                        var url = self.categoryUrl + query;
                    } else {
                        var url = self.categoryUrl;
                    }
                    self.reload.bind(self, url)();
                });
            });

            $$('div.limiter select').each(function(el) {
                el.stopObserving('change');
                el.onchange = function() {
                    return false;
                }
                Event.observe(el, 'change', function(e) {
                    e.stop();
                    var query = self.getUrlQuery(this.value);
                    if (query) {
                        var url = self.categoryUrl + query;
                    } else {
                        var url = self.categoryUrl;
                    }
                    self.reload.bind(self, url)();
                });
            });

            $$('a.btn-remove').each(function(el) {
                Event.observe(el, 'click', function(e) {
                    e.stop();
                    var query = self.getUrlQuery(this.href);
                    if (query) {
                        var url = self.categoryUrl + query;
                    } else {
                        var url = self.categoryUrl;
                    }
                    self.reload.bind(self, url)();
                    
                });
            });

            $$('div.actions a').each(function(el) {
                Event.observe(el, 'click', function(e) {
                    e.stop();
                    var query = self.getUrlQuery(this.href);
                    if (query) {
                        var url = self.categoryUrl + query;
                    } else {
                        var url = self.categoryUrl;
                    }
                    self.reload.bind(self, url)();
                });
            });
            
            $$('div.pages li a').each(function(el) {
                Event.observe(el, 'click', function(e) {
                    e.stop();
                    
                    var query = self.getUrlQuery(this.href);
                    if (query) {
                        var url = self.categoryUrl + query;
                    } else {
                        var url = self.categoryUrl;
                    }
                    
                    self.reload.bind(self, url)();
                });
            });
            
            
            if (self.sliderFlag) {
                $('from-price-range').observe('change', function(e) {
                    self.slider.setValue(this.value, 0);
                });
                $('to-price-range').observe('change', function(e) {
                    self.slider.setValue(this.value, 1);
                });
            }
            
        },
        
        checkUrlHash: function() {
        	var url = this.categoryUrl;
        	var hash = document.location.hash;
        	if (hash != '') {
        		var query = hash.replace('#', '?');
	        	url += query;
	        	this.reload(url);
        	}
        },

        addPriceSlider: function() {
            var handles = ['handle_from-tmaln', 'handle_to-tmaln'];

            var self = this;

            this.slider = new Control.Slider(handles , 'track-tmaln', {
               range: $R(self.minRange, self.maxRange),
               sliderValue: [self.minPrice, self.maxPrice],
               restricted: true,
               onChange: function(values){
                   var from = Math.round(parseInt(values[0]));
                   var to = Math.round(parseInt(values[1]));
                   
                   self.reload(self._buildQuery({
                       'price': from + ',' + to
                   }));
                   
                   $('from-price-range').value = Math.round(parseInt(values[0]));
                   $('to-price-range').value = Math.round(parseInt(values[1]));
                   self.minPrice = Math.round(parseInt(values[0]));
                   self.maxPrice = Math.round(parseInt(values[1]));
                   
               },
               onSlide: function(values) {
                   $('from-price-range').value = Math.round(parseInt(values[0]));
                   $('to-price-range').value = Math.round(parseInt(values[1]));
               }
            });
        },

        reload: function(url) {
            var self = this;
            this.currentUrl = url;
            var query = this.getUrlQuery(url);
            if (this.home) {
                if (query && this.useAjax) {
                    hash = query.substr(1, query.length);
                    window.location = this.categoryUrl + '#' + hash;
                } else {
                    window.location = this.currentUrl;
                }
                return;
            }
            
            if (query && this.useAjax) {
                hash = query.substr(1, query.length);
                document.location.hash = hash;
            } else {
                if (this.useAjax) {
                    document.location.hash = '';
                }
            }
            
            if (this.sliderFlag) {
                $('hidden-url').value=this.categoryUrl;
            }
            if (this.useAjax) {
                this.showLoader();
                new Ajax.Request(this.currentUrl, {
                method: 'post',
                onSuccess: function(transport) {
                    var response = transport.responseText.evalJSON();
                    $$('div.block-layered-nav')[0].update(response.filter);
                    // $$('div.col-main')[0].update(response.list);category-products
                    $$('div.col-main')[0].update(response.brend + response.categoryName + response.list);
                                        
                    if (self.sliderFlag) {
                        self.minPrice = response.minPrice;
                        self.maxPrice = response.maxPrice;
                        // self.minRange = self.minPrice;
                        // self.maxRange = self.maxPrice;
                        self.updateSliderValues();
                        // if (!self.getUrlPriceParam(self.currentUrl)) {
                            // self.defaultPriceValue();
                        // }
                        self.slider = null;
                        self.addPriceSlider();
                    }
                    
                    self.addObservers();
                    self.hideLoader();
                 }
                });
            } else {
                window.location = this.currentUrl;
            }
        },
        
        updateSliderValues: function() {
            $('from-price-range').value = this.minPrice;
            $('to-price-range').value = this.maxPrice;
        },

        showLoader: function() {
            var layered = $$('div.block-layered-nav')[0];
            
            layered.setOpacity(0.2);
            if (undefined !== $$('div.category-products')[0]) {
                var productsGrid = $$('div.col-main')[0]; 
                productsGrid.setOpacity(0.2);
            } else {
                var productsGrid = $$('div.col-main')[0];
                $$('div.col-main')[0].setOpacity(0.2);
            }
            
            var eltLayer = layered;
            var eltGrid = productsGrid;
            
            var loaderLayer = $('ajax-loading-layer');
            var loaderGrid = $('ajax-loading-grid');
            
            var eltDimsLayer = eltLayer.getDimensions();
            var eltDimsGrid = eltGrid.getDimensions();
              
            var yLayer = eltDimsLayer.height / 2;
            var xLayer = eltDimsLayer.width / 2;
            
            var yGrid = eltDimsGrid.height / 2;
            var xGrid = eltDimsGrid.width / 2;

            var posLayer = Position.cumulativeOffset(eltLayer);
            var posGrid = Position.cumulativeOffset(eltGrid);
            
            var leftLayer = posLayer[0] + xLayer;
            var topLayer = posLayer[1] + yLayer;
            
            var leftGrid = posGrid[0] + xGrid;
            var topGrid = posGrid[1] + yGrid;
            
            var stylesLayer = { 
                position : 'absolute',
                top : (topLayer - 16) + 'px',
                left : (leftLayer - 16) + 'px',
                zIndex : 999,
                display : 'block'
             };
             
             var stylesGrid = { 
                position : 'absolute',
                top : (topGrid - 16) + 'px',
                left : (leftGrid - 16) + 'px',
                zIndex : 999,
                display : 'block'
             };
              
            loaderLayer.setStyle(stylesLayer);
            loaderGrid.setStyle(stylesGrid);
        },

        hideLoader: function() {
            var loaderLayer = $('ajax-loading-layer');
            var loaderGrid = $('ajax-loading-grid');
            var styles = { 
                display : 'none'
             };

            loaderLayer.setStyle(styles); 
            loaderGrid.setStyle(styles);
            $$('div.block-layered-nav')[0].setOpacity(1);
            $$('div.col-main')[0].setOpacity(1);
            $$('div.category-products')[0].setOpacity(1); 
        },
        
        defaultPriceValue: function() {
            this.minPrice = this.minRange;
            this.maxPrice = this.maxRange;
            $('from-price-range').value = this.minPrice;
            $('to-price-range').value = this.maxPrice;
        },
        
        getUrlPriceParam: function(links) {
            var strReturn = "";
            var strHref = links;
            if ( strHref.indexOf("?") > -1 ){
                var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
                var aQueryString = strQueryString.split("&");
                for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
                    if (aQueryString[iParam].indexOf("price" + "=") > -1 ){
                        var aParam = aQueryString[iParam].split("=");
                        strReturn = aParam[1];
                        break;
                    }
                }
            }
            if (strReturn.length > 0) {
                return true;
            } else {
                return false;
            }
        },
        getUrlQuery: function(url) {
        	var strHref = url;
            if ( strHref.indexOf("?") > -1 ){
                var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
                
                return strQueryString;
            }
            
            return false;
        },
        
        _getAllUrlParams: function(Url) {
            Url = Url.replace(/.*\?(.*?)/,"$1");
            Variables = Url.split ("&");
            
            return Variables;
        },

        _buildQuery: function(params) {
            var oldParams = this._getAllUrlParams($('hidden-url').value);
            
            var defaultPrice = false;
            this.defaultSlderValues = false;
            
            oldParams.each(function(item) {
                if ('' == item) {
                    throw $break;
                }
                param = item.split('=');
                
                if (undefined === params[param[0]]) {
                    params[param[0]] = param[1];
                }
            });
            
            var query = [];
            for (var i in params) {
                if (undefined !== params[i]) {
                    query.push(i + '=' + params[i]);
                }
            }
            
            this.currentUrlParams = '?' + query.join('&');
            var url = this.categoryUrl.replace(this.categoryUrl.search, '');
            
            return url + this.currentUrlParams;
        }
    };

