// JavaScript Document

var
EndEvent = function(e) {
	e = e || window.event;
	e.stopPropagation ? (e.preventDefault(), e.stopPropagation()) : (e.cancelBubble = true, e.returnValue = false);
},

dm = function(dObj, area, handler) {
	_$(dObj).mousedown ( function(e) {
		var _mY , minY = area.minY, maxY = area.maxY, _tY = dObj.offsetTop , _sY = e.pageY;
		EndEvent(e);
		if(handler.down!=undefined) handler.down();
		addEvent(document,"onselectstart",EndEvent)
		_$().mousemove ( function(e){
			_mY = _tY+e.pageY-_sY;
			_mY = _mY<minY ? minY : _mY;
			_mY = _mY>maxY ? maxY : _mY;
			dObj.style.top = _mY +'px';
			if(handler.move!=undefined) handler.move(_mY);
		});
		_$().mouseup ( function() {
			_$().unbind( "mousemove" ) 
			_$().unbind( "mouseup" ) 
			removeEvent(document,"onselectstart",EndEvent)
			if(handler.up!=undefined) handler.up();
		})
	})
},

addEvent = function (o, t, fn){
	if(o[t + 'c'] == undefined){
		o[t + 'c'] = 0;
		o[t] = function(e){
		for(var i = 0; i < o[t + 'c']; i++) o[t + i](e||window.event)}
	}
	o[t + o[t + 'c']] = fn;
	o[t + 'c']++;
},
removeEvent = function (o, t, fn){
	var have = false;
	for(var i = 0; i < o[t + 'c']; i++){
		if(!have) have = o[t + i] == fn;
		if(have && (i+1) < o[t + 'c']) o[t + i] = o[t + (i+1)];
	}
	if(have) o[t + 'c']--;
};

function simScroll(inits) {
	var _s = this, _c = inits;
	_s.init = function() {
		_s.tiao		= _c.tiao;			
		_s.quyu		= _c.quyu;			
		_s.tiao.style.visibility = 'hidden';
		_s.quyu.scrollTop = 0;
		var tiaoDiv = _s.tiao.getElementsByTagName("div");
		for(var i=0; i<tiaoDiv.length; i++) {
			var _nm = tiaoDiv[i].className;
			if(_nm=="up_")		_s._Up	= tiaoDiv[i];
			if(_nm=="down_")	_s._Dw	= tiaoDiv[i];
			if(_nm=="da_")		_s._Ae	= tiaoDiv[i];
			if(_nm=="dg_")		_s._Dg	= tiaoDiv[i];
		}
		_s.gtou	= _s._Up==null ? 0 : _s._Up.offsetHeight;		
		_s.gwei	= _s._Dw==null ? 0 : _s._Dw.offsetHeight;		
		
		_s.jiange	= 0;
		_s.raito	= _s.quyu.offsetHeight/_s.quyu.scrollHeight;	
		_s.tiao.style.visibility =_s.raito<1? 'visible':'hidden';
		_s.raito	= _s.raito>1 ? 1 : _s.raito;
		_s._sclDH	= parseInt((_s.quyu.offsetHeight)*_s.raito);		
		
		_s._sclDH	= 28;
		_s._s_o	= _s.quyu.scrollHeight-_s.quyu.offsetHeight;		
		_s._300	= 300;	
		_s._50	= 50;	
		_s._20	= 2;	
		_s.gunchang	= 0;	
		_s._oT	= null;	
		_s._oI	= null;
		_s._minY	= _s.gtou+_s.jiange;
		_s._maxY	= _s.quyu.offsetHeight-_s._sclDH+_s._minY; 
		_s._Ae.style.height = _s.quyu.offsetHeight+_s.jiange*2 +"px";  
		_$(_s._Dg).css({position:"absolute",top : _s._minY +"px",width :_s.tiao.offsetWidth +"px",height :_s._sclDH +"px"})
		_s._Dg.getElementsByTagName("div")[0].style.height=_s._sclDH +"px";
		if(_s._Up!=null) {
			_s._Up.onmouseover	= function() {this.className = "up_Over";}
			_s._Up.onmouseout	= function() {this.className = "up_"; _s.Stop();}
			_s._Up.onmousedown	= function() {_s.Scroll(-1);}
			_s._Up.onmouseup	= function() {_s.Stop();}
		}
		if(_s._Dw!=null) {
			_s._Dw.onmouseover= function() {this.className = "down_Over";}
			_s._Dw.onmouseout= function() {this.className = "down_"; _s.Stop();}
			_s._Dw.onmousedown= function() {_s.Scroll(1);}
			_s._Dw.onmouseup= function() {_s.Stop();}
		}
		_s._Dg.onmouseover = function() {
			this.className = "dg_Over";
			dm(
				this,
				{minY : _s._minY, maxY : _s._maxY},
				{down : _s.simStartDrag, move : _s.simDraging, up : _s.Dragstop}
			);
		}
		_s._Dg.onmouseout = function() {if(!_s._Ding) this.className = "dg_";}
		_$(_s._Ae).mousedown(_s.simPageScroll)
		_s._Ae.onmouseup = _s._Ae.onmouseout = function() {_s.Stop();}
		addEvent(_s.quyu, "onscroll",_s.tiaoDong);
		if (window.addEventListener) {
			_s.quyu.addEventListener('DOMMouseScroll', _s.simWheel, false);
			_s.tiao.addEventListener('DOMMouseScroll', _s.simWheel, false);
		}
		addEvent(_s.quyu, "onmousewheel", _s.simWheel);
		addEvent(_s.tiao, "onmousewheel", _s.simWheel);
		
	};
	_s.simPageScroll = function(e) {
		_mouseY = e.pageY-_$(_s.tiao).offset().top;
		
		var _sbjDragTop = parseInt(_s._Dg.style.top);
		if(_sbjDragTop>_mouseY) {_s.Scroll(-3);}
		else{_s.Scroll(3);}
	}
	_s.simDraging = function(y) {
		_s.raito = (y-_s.gtou-_s.jiange)/(_s._maxY-_s.gtou-_s.jiange);
		_s.quyu.scrollTop = parseInt(_s._s_o*_s.raito)
	}
	_s.domove = function() {_s.quyu.scrollTop += _s.gunchang;}
	_s.tiaoDong = function() {
		if(_s._Ding) return;
		_s.raito = _s.quyu.scrollTop/_s._s_o;
		_s._Dg.style.top =parseInt( (_s._maxY-_s.gtou-_s.jiange)*_s.raito)+_s.gtou+_s.jiange+"px";
	};
	_s.simStartDrag = function() {_s._Ding = true;}
	_s.Dragstop = function() {
		_s._Ding = false;
		_s._Dg.className = "dg_";
	}
	_s.going = function() {
		clearInterval(_s._oI);
		_s._oI = setInterval(function() {_s.domove();}, _s._50);
	};
	
	_s.Stop = function() {
		clearTimeout(_s._oT);
		clearInterval(_s._oI);
	};
	_s.Scroll = function(_m) {
		var _doDefer = false;
		switch(_m) {
			case -3 :	
			_s.gunchang = -(_s.quyu.offsetHeight-_s._20);
			_doDefer = true;
			break;
			case -2 :	
			_s.gunchang = -_s._20*3;
			break;
			case -1 :	
			_s.gunchang = -_s._20*3;
			_doDefer = true;
			break;
			case 1 :	
			_s.gunchang = _s._20*3;
			_doDefer = true;
			break;
			case 2 :	
			_s.gunchang = _s._20*3;
			break;
			case 3 :	
			_s.gunchang = _s.quyu.offsetHeight-_s._20;
			_doDefer = true;
			break;
		}
		_s.domove();
		if(_doDefer) {
			clearTimeout(_s._oT);
			_s._oT = setTimeout(_s.going, _s._300);
		}
	};
	_s.simWheel = function(e){
		var dl = 0;
		e = window.event || e;
		if (e.wheelDelta) dl = e.wheelDelta/120;
		else if (e.detail)dl = -e.detail/3;
		if(dl>0) _s.Scroll(-2);
		else _s.Scroll(2);
		EndEvent(e);
	};
}

