$(function(){ // // слайдер для цены // $('#sliderPrice').realtySlider(new Price(), '#scaleSliderPrice'); // // // слайдер для площади // $('#sliderPlotArea').realtySlider(new Area(), '#scaleSliderPlotArea'); // $('#sliderTotalArea').realtySlider(new totalArea(), '#scaleSliderTotalArea'); // $('#sliderLivingArea').realtySlider(new livingArea(), '#scaleSliderLivingArea'); }); /** * Абстрактный класс для работы слайдера с диапазоном значений */ var Range = function() {}; $.extend(Range.prototype, { /** * Возвращает макс./мин. границу диапазона * (требует перегрузки в конкретных классах) */ _rangeVal : function(key) { throw 'Must be overloaded!' }, /** * Возвращает макс. границу диапазона */ rangeMax : function() { var max = Math.ceil(this._rangeVal('max')); if (max == this.rangeMin()) { max++; } return max; //return Math.ceil(this._rangeVal('max')); }, /** * Возвращает мин. границу диапазона */ rangeMin : function() { return Math.floor(this._rangeVal('min')); }, rangeMiddle : function() { return Math.round(this._rangeVal('middle')); }, /** * Возвращает макс. выбранное значение в диапазоне */ maxVal : function() { if (this.$max.val() == '') { this.$max.val(this.rangeMax()); } return Math.ceil(this.$max.val()); }, /** * Возвращает мин. выбранное значение в диапазоне */ minVal : function() { if (this.$min.val() == '') { this.$min.val(this.rangeMin()); } return Math.floor(this.$min.val()); }, /** * Устанавливает макс. значение в диапазоне */ setMaxVal : function(value) { this.$max.val(value); //this.$max.val(this._normalizeVal(value)); }, /** * Устанавливает мин. значение в диапазоне */ setMinVal : function(value) { this.$min.val(value); //this.$min.val(this._normalizeVal(value)); }, _normalizeVal : function(value) { value = humanizeRound(value); if (value >= this.rangeMax()) { return this.rangeMax(); } else if (value <= this.rangeMin()) { return this.rangeMin(); } else { return value; } }, /** * Разметка диапозона */ scalePoints : function() { var min = this.rangeMin(); var max = this.rangeMax(); var middle = parseInt((min + max) / 2); var scale = [ min, parseInt((min + middle) / 2), middle, parseInt((middle + max) / 2), max ]; return scale; } }); var Price = function() { this.$min = $('#price_min'); this.$max = $('#price_max'); } Price.prototype = new Range(); $.extend(Price.prototype, { _rangeVal : function(key) { return window.stat['price_' + key]; } }); $.fn.realtySlider = function(Range, domScale) { var $slider = this.slider({ range: true, min: Range.rangeMin(), max: Range.rangeMax(), values: [Range.minVal(), Range.maxVal()], slide: function(e, ui) { var values = $slider.slider('option', 'values'); Range.setMinVal(values[0]); Range.setMaxVal(values[1]); }, stop: function(e, ui) { Range.$min.trigger('change'); } }); $handlesArea = $('.ui-slider-handle', $slider); $handlesArea.eq(0).addClass('ui-slider-handle-left'); $handlesArea.eq(1).addClass('ui-slider-handle-right'); //div для допустимых значений $handlesArea.eq(1).after('
'); var $scale = $(domScale).scaleSlider(Range.scalePoints()); function fixMinValue() { var value = Range.minVal(); if (value >= Range.rangeMax()) { value = Range.rangeMax(); } else if (value < Range.rangeMin()) { value = Range.rangeMin(); } $slider.slider('values', 0, value); } function fixMaxValue() { var value = Range.maxVal(); if (value > Range.rangeMax()) { value = Range.rangeMax(); } else if (value <= Range.rangeMin()) { value = Range.rangeMin(); } $slider.slider('values', 1, value); } Range.$min .blur(fixMinValue) .keydown(function(event){ if (event.keyCode == 13) { fixMinValue(); } }); fixMinValue(); Range.$max .blur(fixMaxValue) .keydown(function(event){ if (event.keyCode == 13) { fixMaxValue(); } }); fixMaxValue(); return this; } $.fn.scaleSlider = function(scale) { for (var i in scale) { scale[i] = humanizeNumber(scale[i]); } //scale[scale.length-1] = '>' + scale[scale.length-1]; $(this).addClass('slider-num').html('' + scale.join('
') + '