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();
				//quickshoping fix
				if (initQuickShoppingJs) {
                    $('lightwindow') && $('lightwindow').remove();
                    $('lightwindow_overlay') && $('lightwindow_overlay').remove();
                    initQuickShoppingJs();
                }
		
		if (AjaxPro) {
      		    AjaxPro.addObservers();
		}	
             }
            });
        } 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;
    }
};

if (Prototype.Browser.IE && document.documentMode >= 9) {
    // IE 9 fix
    Control.Slider.prototype.startDrag = function(event) {
        if (0 == event.button) {
          if (!this.disabled){
            this.active = true;

            var handle = Event.element(event);
            var pointer  = [Event.pointerX(event), Event.pointerY(event)];
            var track = handle;
            if (track==this.track) {
              var offsets  = Position.cumulativeOffset(this.track);
              this.event = event;
              this.setValue(this.translateToValue(
               (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
              ));
              var offsets  = Position.cumulativeOffset(this.activeHandle);
              this.offsetX = (pointer[0] - offsets[0]);
              this.offsetY = (pointer[1] - offsets[1]);
            } else {
              // find the handle (prevents issues with Safari)
              while((this.handles.indexOf(handle) == -1) && handle.parentNode)
                handle = handle.parentNode;

              if (this.handles.indexOf(handle)!=-1) {
                this.activeHandle    = handle;
                this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
                this.updateStyles();

                var offsets  = Position.cumulativeOffset(this.activeHandle);
                this.offsetX = (pointer[0] - offsets[0]);
                this.offsetY = (pointer[1] - offsets[1]);
              }
            }
          }
          Event.stop(event);
        }
    }
}

