/* diapazon calculator
 * widget by IonDen
 * v 2.0
 * 30.03.2011
 * rev. 5
 * depends on jQuery 1.5.1+
 * UTF-8
 */
 
(function($){
    $.fn.set_diapazon = function(options) {
        var defaults = {
            min: 2000,
            max: 50000,
			sel_min: 14000,
			sel_max: 38000
        }; 
		var options = $.extend(defaults, options);
		
		// задаем пачку переменных и кэшируем элементы
		var $this = $(this);
		var $bar_mid = $this.find("div.bar_mid");
		var $bar_left = $this.find("div.bar_left");
		var $bar_right = $this.find("div.bar_right");
		
		var $from = $this.find("input.from_value");
		var $to = $this.find("input.to_value");
		
		var base_width = $bar_mid.width();
		var base_persent = base_width / 100;
		var barLeft_base = $bar_left.position().left;
		var barRight_base = $bar_right.position().left;
		
		var current_min = options.sel_min;
		var current_max = options.sel_max;
		
		// расставляем циферки в линейку
		for(var i = 1; i < 6; i++) {
            var diapazon_num = (options.max - options.min) / 4 * (i - 1);
            diapazon_num = Math.round(diapazon_num) + options.min;
			var diapazon_num_text = diapazon_num.toString().replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ');
			$this.find("div.ln_" + i).text(diapazon_num_text);
		}
		
		// передвигаем ползунки в нестандартную позицию
		var persent = (options.max - options.min) / 100;
		var min_persent = (options.sel_min - options.min) / persent;
		var max_persent = (options.sel_max - options.min) / persent;
		var barLeft_current = barLeft_base + (base_persent * min_persent);
		var barRight_current = barRight_base - base_width + (base_persent * max_persent);
		
		$bar_left.css("left",barLeft_current);
		$bar_right.css("left",barRight_current);
		follow_bars();
		
		// таскаем ползунки
		var drag_min = false;
		var drag_max = false;
		var drag_mid = false;
		var mouse_X = 0;
		var p_X = 0;
		var bm_width = 0;
		
		$bar_left.mousedown(function(event) {
			p_X = mouse_X - $(this).position().left;
			drag_min = true;
			if($.browser.msie) $("*").attr('unselectable', 'on');
			return false;
		});
		$bar_right.mousedown(function(event) {
			p_X = mouse_X - $(this).position().left;
			drag_max = true;
			if($.browser.msie) $("*").attr('unselectable', 'on');
			return false;
		});
		$bar_mid.mousedown(function(event) {
			bm_width = $bar_mid.width();
			p_X = mouse_X - $(this).position().left;
			drag_mid = true;
			if($.browser.msie) $("*").attr('unselectable', 'on');
			return false;
		});
		$(document).bind("mouseup",function(e){
			drag_min = false;
			drag_max = false;
			drag_mid = false;
			if($.browser.msie) $("*").attr('unselectable', 'off');
		});
		$(document).bind("mousemove",function(e){
			mouse_X = e.pageX;
			if(drag_min == true) {
				barLeft_current = mouse_X - p_X;
				if(barLeft_current < barLeft_base) {barLeft_current = barLeft_base};
				if(barLeft_current >= barRight_current - 9) {barLeft_current = barRight_current - 9};
				$bar_left.css("left",barLeft_current);
				follow_bars();

			}
			if(drag_max == true) {
				barRight_current = mouse_X - p_X;
				if(barRight_current > barRight_base) {barRight_current = barRight_base};
				if(barRight_current <= barLeft_current + 9) {barRight_current = barLeft_current + 9};
				$bar_right.css("left",barRight_current);
				follow_bars();
			}
			if(drag_mid == true) {
				var mx = mouse_X - p_X - 9;
				if(mx < barLeft_base) {mx = barLeft_base};
				if(mx > barRight_base - bm_width - 9) {mx = barRight_base - bm_width - 9};
				barLeft_current = mx;
				barRight_current = barLeft_current + 9 + bm_width;
				
				$bar_left.css("left",barLeft_current);
				$bar_right.css("left",barRight_current);
				follow_bars();
			}
		});
		
		// следуем за ползунками и вычисляем все значения
		function follow_bars() {
			$bar_mid.css("left",barLeft_current + 9).width(barRight_current - (barLeft_current + 9));
			current_min = options.min + Math.round((barLeft_current + 6) / base_width * 100 * persent);
			current_max = options.min + Math.round((barRight_current - 3) / base_width * 100 * persent);
			
			var current_min_text = current_min.toString().replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ');
			var current_max_text = current_max.toString().replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ');
			
			$from.val(current_min_text);
			$to.val(current_max_text);
		
		}

		// отслеживаем фокус в полях с цифрами
		$from.focusin(function(){
			$(this).val(current_min);
				
		});
		$from.focusout(function(){
			var current_min_text = $(this).val().toString().replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ');
			$(this).val(current_min_text);
		});
		$to.focusin(function(){
			$(this).val(current_max);
		});
		$to.focusout(function(){
			var current_max_text = $(this).val().toString().replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ');
			$(this).val(current_max_text);
		});

		// отслеживаем изменения в полях с цифрами
		$from.change(function(){
			current_min = $(this).val() - 0;
			var nan = isNaN(current_min);
			if(nan == true) {current_min = options.min};
			if(current_min < options.min) {current_min = options.min};
			if(current_min > current_max) {current_min = current_max};
			barLeft_current = (current_min - options.min) / (options.max - options.min) * 100 * base_persent;
			barLeft_current = barLeft_current - 6;

			$bar_left.css("left",barLeft_current);
			follow_bars();
		});
		$to.change(function(){
			current_max = $(this).val() - 0;
			var nan = isNaN(current_max);
			if(nan == true) {current_max = options.max};
			if(current_max < current_min) {current_max = current_min};
			if(current_max > options.max) {current_max = options.max};
			barRight_current = (current_max - options.min) / (options.max - options.min) * 100 * base_persent;
			barRight_current = barRight_current + 3;

			$bar_right.css("left",barRight_current);
			follow_bars();
		});
    }
})(jQuery);
