function RangeSliderLowerLimit()
{
  return this.m_imgSliderBar_width+this.m_imgSliderPlus_width+eval(this.m_Slider_id).style.pixelLeft;
}

function RangeSliderUpperLimit()
{
  return this.LowerLimit()+eval(this.m_Slider_id).width;
}

function RangeSliderSetLimits(nLowerLimit, nUpperLimit)
{
  if (nLowerLimit >= nUpperLimit) 
  {
    return;
  }
  if (nLowerLimit<0)
  {
     nLowerLimit=0;
  }
  if (nLowerLimit>this.m_imgSliderBar_width)
  {
     nLowerLimit=this.m_imgSliderBar_width-1;
  }
  if (nUpperLimit<0)
  {
     nUpperLimit=1;
  }
  if (nUpperLimit>this.m_imgSliderBar_width)
  {
     nUpperLimit=this.m_imgSliderBar_width;
  }
  eval(this.m_Minus_id).style.left=nLowerLimit+"px";
  eval(this.m_Minus_id).title="Drag the slider to query data.";
  eval(this.m_Slider_id).style.left=(-this.m_imgSliderBar_width-this.m_imgSliderPlus_width+nLowerLimit)+"px";
  eval(this.m_Slider_id).style.posWidth =  nUpperLimit - nLowerLimit;
  eval(this.m_Plus_id).style.left=-this.m_imgSliderBar_width+nUpperLimit+"px";
  eval(this.m_Plus_id).title="Drag the slider to query data.";
  eval(this.m_Slider_id).title=eval(this.m_fnTitle)(this);
  eval(this.m_fnUpdate)(this);
}

function RangeSliderReset()
{
 eval(this.m_fnReset)(this);
}

function RangeSliderMove(nDeltaLower, nDeltaUpper)
{
 this.SetLimits(this.LowerLimit()+nDeltaLower, this.UpperLimit()+nDeltaUpper);
}

function RangeSliderActivate(Obj)
{
  this.m_ActiveObj=Obj;
  Obj.setCapture();
}

function RangeSliderDeactivate(Obj)
{
  this.m_ActiveObj=null;
  Obj.releaseCapture();
}

function RangeSliderMouseMove(offsetX, srcElement_id, Obj)
{
  if( (this.m_ActiveObj!=null)&&(this.m_ActiveObj===Obj) )
  {
    if (srcElement_id==this.m_Slider_id)
    {
      if(this.m_ActiveObj.id==this.m_Plus_id)
      {
        this.SetLimits(this.LowerLimit(), this.LowerLimit()+offsetX);
      }
      if(this.m_ActiveObj.id==this.m_Minus_id)
      {
        this.SetLimits(this.LowerLimit()+offsetX, this.UpperLimit());
      }
      else if(this.m_ActiveObj.id==this.m_Slider_id)
      {
        this.Move(offsetX, offsetX);
      }
    }
    else if (srcElement_id==this.m_Plus_id)
    {
      this.Move(0, offsetX);
    }
    else if (srcElement_id==this.m_Minus_id)
    {
      if(this.m_ActiveObj.id==this.m_Minus_id)
      {
        if (offsetX>9) 
        {
          this.Move(offsetX, 0);
        }
      }
      else if(this.m_ActiveObj.id==this.m_Slider_id)
      {
        this.Move(-offsetX, -offsetX);
      }
    }
    else if (srcElement_id==this.m_SliderBar_id)
    {
      if(this.m_ActiveObj.id==this.m_Plus_id)
      {
        this.SetLimits(this.LowerLimit(), offsetX);
      }
      else if(this.m_ActiveObj.id==this.m_Minus_id)
      {
        this.Move(offsetX-this.LowerLimit(), 0);
      }
    }
  }
}

// construct "class" RangeSliderClass
function RangeSliderClass(nLowerLimit, nUpperLimit, SliderBar_id, Slider_id, Minus_id, Plus_id, Identity, fnUpdate, fnReset, fnTitle)
{
  this.m_imgSliderBar_width=100;
  this.m_imgSliderPlus_width=9;
  this.m_SliderBar_id=SliderBar_id;
  this.m_Slider_id=Slider_id;
  this.m_Minus_id=Minus_id;
  this.m_Plus_id=Plus_id;
  this.m_ActiveObj=null;
  this.m_Identity=Identity;
  this.m_fnUpdate=fnUpdate;
  this.m_fnTitle=fnTitle;
  this.m_fnReset=fnReset;
  this.SetLimits(nLowerLimit, nUpperLimit);
}
RangeSliderClass.prototype.LowerLimit=RangeSliderLowerLimit;
RangeSliderClass.prototype.UpperLimit=RangeSliderUpperLimit;
RangeSliderClass.prototype.SetLimits=RangeSliderSetLimits;
RangeSliderClass.prototype.Move=RangeSliderMove;
RangeSliderClass.prototype.MouseMove=RangeSliderMouseMove;
RangeSliderClass.prototype.Activate=RangeSliderActivate;
RangeSliderClass.prototype.Deactivate=RangeSliderDeactivate;
RangeSliderClass.prototype.Reset=RangeSliderReset;

// handlers
function onMouseDownRangeSlider(obj)
{
  eval(obj.sliderObj).Activate(obj);
}

function onMouseUpRangeSlider(obj)
{
  eval(obj.sliderObj).Deactivate(obj);
}

function onMouseMoveRangeSlider(obj)
{
  eval(obj.sliderObj).MouseMove(event.offsetX, event.srcElement.id, obj);
}
