function xslider(config)
{
  if (typeof(config.up_elem)=='object')    this.up_elem=config.up_elem;          else this.up_elem= document.getElementById(config.up_elem);

  if (typeof(config.inp_from)=='object')    this.inp_from=config.inp_from;       else this.inp_from = document.getElementById(config.inp_from);
  if (typeof(config.inp_to)=='object')      this.inp_to=config.inp_to;           else this.inp_to = document.getElementById(config.inp_to);
  if (typeof(config.slider_from)=='object') this.slider_from=config.slider_from; else this.slider_from = document.getElementById(config.slider_from);
  if (typeof(config.slider_to)=='object')   this.slider_to=config.slider_to;     else this.slider_to = document.getElementById(config.slider_to);

  if (typeof(config.scale10)=='object')   this.scale10=config.scale10;     else this.scale10 = document.getElementById(config.scale10);
  if (typeof(config.scale100)=='object')  this.scale100=config.scale100;   else this.scale100 = document.getElementById(config.scale100);
  if (typeof(config.scale1000)=='object') this.scale1000=config.scale1000; else this.scale1000 = document.getElementById(config.scale1000);

  this.value_max=config.value_max;
  this.value_min=config.value_min;
  this.value_max_null=true;
  this.value_min_null=true;
  this.mouse_pos=0;
  this.mouse_offset=0;
  this.cur_elem=null;
  this.old_up=null;
  this.old_move=null;
  this.ranges=new Array();
//  alert(this.up_elem.offsetWidth);

  var self = this;
  this.max_ranges = function()
  {
    var range_cnt=3;
    var percnt=100/range_cnt;
    for (var max_range=0;self.value_max>Math.pow(10,max_range);max_range++) {}
    var add_percnt=(percnt*(1-(self.value_max/Math.pow(10,max_range))))/(range_cnt-1);
//    alert(max_range-range_cnt);
    for (var i=max_range-range_cnt;i<max_range;i++) 
    {
      var xobj=null;
      with (self)
      {
        eval('xobj=self.scale'+Math.pow(10,i+1));
      }
      if (typeof(xobj)!='undefined')
      {
        xobj.style.display='block';
        xobj.style.left=((self.ranges.length+1)*(percnt+add_percnt))+'%';
      }
      self.ranges[self.ranges.length]={start:Math.pow(10,i),stop:((Math.pow(10,i+1)<self.value_max)?Math.pow(10,i+1):self.value_max),range_start:(self.ranges.length)*(percnt+add_percnt), range_stop:((self.ranges.length+1)*(percnt+add_percnt)<100?(self.ranges.length+1)*(percnt+add_percnt):100)};
    }
  }

  this.load_inp_values= function()
  {
    var is_not_null= self.corect_inputs();
    var val1=parseFloat(self.inp_from.value);
    var val2=parseFloat(self.inp_to.value);

    if (isNaN(val1)) val1=self.value_min;
    if (isNaN(val2)) val2=self.value_max;

    if (val1>val2) val1 = this.value = val2;
    var prc1=self.get_procent(val1);
    var prc2=self.get_procent(val2);
    self.slider_from.style.left = (prc1*100)+'%';
    self.slider_to.style.left = (prc2*100)+'%';
  }

  this.inp_from.onchange= function()
  {
    var is_not_null= self.corect_inputs();
    var val1=parseFloat(self.inp_from.value);
    var val2=parseFloat(self.inp_to.value);

    if (isNaN(val1)) val1=self.value_min;
    if (isNaN(val2)) val2=self.value_max;
   
    if (val1>val2) val1 = this.value = val2;
    var prc=self.get_procent(val1);
    self.slider_from.style.left = (prc*100)+'%';
  }

  this.inp_to.onchange= function()
  {
    var is_not_null= self.corect_inputs();
    var val1=parseFloat(self.inp_to.value);
    var val2=parseFloat(self.inp_from.value);

    if (isNaN(val1)) val1=self.value_max;
    if (isNaN(val2)) val2=self.value_min;

    if (val1<val2) val1 = this.value = val2;
    var prc=self.get_procent(val1);
    self.slider_to.style.left = (prc*100)+'%';
  }
  
  this.slider_to.onmousedown=function(ev)
  {
    ev = ev || window.event;
    self.cur_elem=this;
    self.mouse_offset = self.get_mouse_offset(this, ev);
    self.set_move();
    self.set_up();
    return false;
  }
  
  this.slider_from.onmousedown=function(ev)
  {
    ev = ev || window.event;
    self.cur_elem=this;
    self.mouse_offset = self.get_mouse_offset(this, ev);
    self.set_move();
    self.set_up();
    return false;
  }

  this.get_position=function (e)
  {
    var left = 0;
    var top  = 0;
    while (e.offsetParent)
    {
      left += e.offsetLeft;
      top  += e.offsetTop;
      e     = e.offsetParent;
    }
    left += e.offsetLeft;
    top  += e.offsetTop;

    return {x:left, y:top};
  };
  
  this.mouse_coords = function(ev)
  {
    if(ev.pageX || ev.pageY)
    {
      return {x:ev.pageX, y:ev.pageY};
    }
    return {x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,y:ev.clientY + document.body.scrollTop  - document.body.clientTop};
  }

  this.get_mouse_offset = function(target, ev){
    ev = ev || window.event;

    var mousePos  = self.mouse_coords(ev);
    return {x:mousePos.x - target.offsetLeft, y:mousePos.y - target.offsetTop};
  }
  this.mouse_move = function(ev)
  {
    ev           = ev || window.event;
    self.mouse_pos = self.mouse_coords(ev);
    if (self.cur_elem)
    {
      var is_not_null = self.corect_inputs();
      var pri_prc=((self.mouse_pos.x - self.get_position(self.up_elem).x)/self.up_elem.offsetWidth);
      if (pri_prc>1) pri_prc=1;
      else if (pri_prc<0) pri_prc=0;
      var new_value=-1;
      for (var i=0,n=self.ranges.length;i<n;i++)
      {
        if (self.ranges[i].range_start<=pri_prc*100 && self.ranges[i].range_stop>=pri_prc*100)
        {
          new_value=
          self.ranges[i].start+
          (self.ranges[i].stop-self.ranges[i].start)*
          ((pri_prc*100-self.ranges[i].range_start)/(self.ranges[i].range_stop-self.ranges[i].range_start));
//          document.getElementById('slowoklucz').value=Math.round(pri_prc*100)+' '+' '+Math.round(self.ranges[i].range_start)+' '+Math.round(self.ranges[i].range_stop)+' '+' '+(self.ranges[i].start)+' '+(self.ranges[i].stop)+' '+Math.round(new_value);
          break;
        }
      }

      if (self.cur_elem==self.slider_from)
      {
//        var prc=((self.mouse_pos.x - self.get_position(self.up_elem).x+self.cur_elem.offsetWidth)/self.up_elem.offsetWidth);
        var prc=pri_prc;
        
        if (new_value<self.value_min||new_value==-1)
        {
          self.inp_from.value=self.value_min;
          var prc=0;
        }
        else if (new_value>parseFloat(self.inp_to.value))
        {
          self.inp_from.value=self.inp_to.value;
          var prc=self.get_procent(self.inp_from.value);
        }
        else
          self.inp_from.value=Math.round(new_value);

      }
      else if (self.cur_elem==self.slider_to)
      {
//        var prc=((self.mouse_pos.x - self.get_position(self.up_elem).x-self.cur_elem.offsetWidth)/self.up_elem.offsetWidth);
        var prc=pri_prc;
        if (new_value>self.value_max||new_value==-1)
        {
          self.inp_to.value=self.value_max;
          var prc=1;
        }
        else if (new_value<parseFloat(self.inp_from.value))
        {
          self.inp_to.value=self.inp_from.value;
          var prc=self.get_procent(self.inp_to.value);
        }
        else
          self.inp_to.value=Math.round(new_value);
      }

      self.cur_elem.style.left = (prc*100)+'%';

      return false;
    }

  }
  this.corect_inputs = function()
  {
    var val1=parseFloat(self.inp_from.value);
    var val2=parseFloat(self.inp_to.value);
    var ret=true;
    if (self.value_min_null && isNaN(val1)) {self.inp_from.value = ''; ret=false;}
    else if (isNaN(val1)||val1 < self.value_min) self.inp_from.value = self.value_min;
    if (self.value_max_null && isNaN(val2)) {self.inp_to.value = ''; ret=false;}
    else if (isNaN(val2)||val2 > self.value_max) self.inp_to.value = self.value_max;
    return ret;
  }
  this.mouse_up = function()
  {
    self.cur_elem=null;
    document.onmousemove = self.old_move;
    document.onmouseup = self.old_up;
  }

  this.set_move = function()
  {
    self.old_move = document.onmousemove;
    document.onmousemove = self.mouse_move;
  }

  this.set_up = function()
  {
    self.old_up = document.onmouseup;
    document.onmouseup = this.mouse_up;
  }

  this.get_procent = function(val)
  {
    var prc=null;
    for (var i=0,n=self.ranges.length;i<n;i++)
    {
      if (self.ranges[i].start<=val && self.ranges[i].stop>=val)
      {
//        document.getElementById('slowoklucz').value=((parseFloat(val)-self.ranges[i].start)/(self.ranges[i].stop-self.ranges[i].start));
        prc=(self.ranges[i].range_start+((self.ranges[i].range_stop-self.ranges[i].range_start)*((parseFloat(val)-self.ranges[i].start)/(self.ranges[i].stop-self.ranges[i].start))))/100;
        break;
      }
    }
    return prc;
  }
  
  this.max_ranges();
  this.load_inp_values();
} 
