/* ==============================================================
   << slider object >>
              for Netscape Navigator 4.0
              and Internet Explorer  4.0+

   Author : Shinichi Hagiwara
   Type   : library - free software

   history:
     09/19/2000 remake for my book
     07/01/2001 support Mozilla( NN6 )

   Require JS Lib
          : LibCrossBrowser.js  - Common functions for cross browser
          : EventHandler.js     - Event handling functions for cross browser

   Copyright(C) 2000 ShinSoft. All rights reserved.
 ================================================================ */
// Slider オブジェクト( 関数 )
function Slider(div,dir,len,min,max,pos,stcb,stcd,mvcb,mvcd,edcb,edcd){
  var ctrl=ech_attachMouseDrag(div,
             slideStart,null, slideMove,null, slideEnd,null, null,null);
  var x=getDivLeft(div), y=getDivTop(div);
  ctrl.dir = dir; ctrl.len = len;
  ctrl.min = min; ctrl.max = max;
  if(dir==0){   // horizontal
    ctrl.minX = x-Math.abs((pos-min)*len/(max-min));
    ctrl.maxX = x+Math.abs((max-pos)*len/(max-min));
    ctrl.minY = y; ctrl.maxY = y;
  } else {      // vertical
    ctrl.minX = x; ctrl.maxX = x;
    ctrl.minY = y-Math.abs((pos-min)*len/(max-min));
    ctrl.maxY = y+Math.abs((max-pos)*len/(max-min));
  }
  ctrl.slideStartCB=stcb; ctrl.slideStartCD=stcd;
  ctrl.slideMoveCB =mvcb; ctrl.slideMoveCD =mvcd;
  ctrl.slideEndCB  =edcb; ctrl.slideEndCD  =edcd;
  ctrl.getPos      = getSliderPos;
  ctrl.slideTo     = slideTo;
  ctrl.slideBy     = slideBy;
  return ctrl;
}
// 現在位置取り出しメソッド
function getSliderPos(){
  return this.dir==0?
    ((getDivLeft(this.div)-this.minX)*(this.max-this.min)/this.len+this.min):
    ((getDivTop (this.div)-this.minY)*(this.max-this.min)/this.len+this.min);
}
// 位置変更メソッド( 絶対値 )
function slideTo(pos,norep){
  if(this.max>this.min){
    if(pos>this.max) pos=this.max;
    if(pos<this.min) pos=this.min;
  }
  else {
    if(pos>this.min) pos=this.min;
    if(pos<this.max) pos=this.max;
  }
  var x=(this.maxX-this.minX)*(pos-this.min)/(this.max-this.min)+this.minX;
  var y=(this.maxY-this.minY)*(pos-this.min)/(this.max-this.min)+this.minY;
  if(x<this.minX) x=this.minX;
  if(x>this.maxX) x=this.maxX;
  if(y<this.minY) y=this.minY;
  if(y>this.maxY) y=this.maxY;
  if(x!=getDivLeft(this.div)||y!=getDivTop(this.div)){
    moveDivTo(this.div,x,y);
    if((arguments<2 || !norep) && this.slideMoveCB)
      this.slideMoveCB(this,this.slideMoveCD,pos);
  }
}
// 位置変更メソッド( 相対値 )
function slideBy(pos,norep){
  this.slideTo(this.getPos()+pos,norep);
}
// ハンドラ( ドラッグ開始 )
function slideStart(ctrl,client){
  if(ctrl.slideStartCB) ctrl.slideStartCB(ctrl,ctrl.slideStartCD,ctrl.getPos());
}
// ハンドラ( ドラッグ )
function slideMove(ctrl,client){
  var x=ox=getDivLeft(ctrl.div), y=oy=getDivTop(ctrl.div);
  switch(ctrl.dir){
  case 0:          // horizontal
    if(ctrl.pageX>ctrl.maxX)      x=ctrl.maxX;
    else if(ctrl.pageX<ctrl.minX) x=ctrl.minX;
    else {
      x+=ctrl.pageX-ctrl.curX;
      if(x<ctrl.minX) x=ctrl.minX;
      if(x>ctrl.maxX) x=ctrl.maxX;
    }
    break;
  case 1:          // vertical
    if(ctrl.pageY>ctrl.maxY)      y=ctrl.maxY;
    else if(ctrl.pageY<ctrl.minY) y=ctrl.minY;
    else {
      y+=ctrl.pageY-ctrl.curY;
      if(y<ctrl.minY) y=ctrl.minY;
      if(y>ctrl.maxY) y=ctrl.maxY;
    }
    break;
  }
  if(ox!=x||oy!=y){
    moveDivTo(ctrl.div,x,y);
    if(ctrl.slideMoveCB)
      ctrl.slideMoveCB(ctrl,ctrl.slideMoveCD,ctrl.getPos());
  }
}
// ハンドラ( ドラッグ終了 )
function slideEnd(ctrl,client){
  if(ctrl.slideEndCB) ctrl.slideEndCB(ctrl,ctrl.slideEndCD,ctrl.getPos());
}

