var dom = document.getElementById;
	var iex = document.all;
	var ns4 = document.layers;
	
	function addEvent(event,method){
		this[event] = method;
		if(ns4) this.captureEvents(Event[event.substr(2,event.length).toUpperCase()]);
	}
	function removeEvent(event){
		this[event] = null;
		if(ns4) this.releaseEvents(Event[event.substr(2,event.length).toUpperCase()]);
	}
	function getElement(name,nest){
		nest = nest ? "document."+nest+"." : "";
		var el = dom ? document.getElementById(name) : iex ? document.all[name] : ns4 ? eval(nest+"document."+name) : false;
		el.css = ns4 ? el : el.style;
		el.getTop = function(){return parseInt(el.css.top) || 0};
		el.setTop = function(y){el.css.top = ns4 ? y: y+"px"};
		el.getHeight = function(){return ns4 ? el.document.height : el.offsetHeight};
		el.getClipHeight = function(){return ns4 ? el.clip.height : el.offsetHeight};
		el.hideVis = function(){el.css.visibility="hidden"};
		el.addEvent = addEvent;
		el.removeEvent = removeEvent;
		return el;
	}
	function getYMouse(e){
		return iex ? event.clientY : e.pageY;
	}
	
	document.addEvent = addEvent;
	document.removeEvent = removeEvent;
	
	// ||||||||||||||||||||||||||||||||||||||||||||||||||
	// Scroller Class
	
	ScrollObj = function(speed, dragHeight, trackHeight, trackObj, upObj, downObj, dragObj, contentMaskObj, contentObj){
		this.speed = speed;
		this.dragHeight = dragHeight;
		this.trackHeight = trackHeight;
		this.trackObj = getElement(trackObj);
		this.upObj = getElement(upObj);
		this.downObj = getElement(downObj);
		this.dragObj = getElement(dragObj);
		this.contentMaskObj = getElement(contentMaskObj);
		this.contentObj = getElement(contentObj,contentMaskObj);
		this.obj = contentObj+"Object";
		eval(this.obj+"=this");
		
		this.trackTop = this.dragObj.getTop();
		this.trackLength = this.trackHeight-this.dragHeight;
		this.trackBottom = this.trackTop+this.trackLength;
		this.contentMaskHeight = this.contentMaskObj.getClipHeight();
		this.contentHeight = this.contentObj.getHeight();
		this.contentLength = this.contentHeight-this.contentMaskHeight;
		this.scrollLength = this.trackLength/this.contentLength;
		this.scrollTimer = null;
		
		if(this.contentHeight <= this.contentMaskHeight){
			this.dragObj.hideVis();
			this.upObj.hideVis();
			this.downObj.hideVis();
		}else{
			var self = this;
			this.trackObj.addEvent("onmousedown", function(e){self.scrollJump(e);return false});
			this.upObj.addEvent("onmousedown", function(){self.scroll(self.speed);return false});
			this.upObj.addEvent("onmouseup", function(){self.stopScroll()});
			this.upObj.addEvent("onmouseout", function(){self.stopScroll()});
			this.downObj.addEvent("onmousedown", function(){self.scroll(-self.speed);return false});
			this.downObj.addEvent("onmouseup", function(){self.stopScroll()});
			this.downObj.addEvent("onmouseout", function(){self.stopScroll()});
			this.dragObj.addEvent("onmousedown", function(e){self.startDrag(e);return false});
			if(iex) this.dragObj.addEvent("ondragstart", function(){return false});
			this.contentObj.addEvent("onmousewheel", function(){self.wheel(event)});
		}
	}
	ScrollObj.prototype.wheel = function(event){
				if(this.scrollTimer == null){
					if(event.wheelDelta < 0){
						this.scroll(-15);
					} else if(event.wheelDelta > 0){
						this.scroll(15);
					}
					this.scrollTimer = window.setTimeout(this.obj+".stopScroll()",200);
					return false;
				}
	}
	ScrollObj.prototype.startDrag = function(e){
		this.dragStartMouse = getYMouse(e);
		this.dragStartOffset = this.dragObj.getTop();
		var self = this;
		document.addEvent("onmousemove", function(e){self.drag(e)});
		document.addEvent("onmouseup", function(){self.stopDrag()});
	}
	ScrollObj.prototype.stopDrag = function(){
		document.removeEvent("onmousemove");
		document.removeEvent("onmouseup");
	}
	ScrollObj.prototype.drag = function(e){
		var currentMouse = getYMouse(e);
		var mouseDifference = currentMouse-this.dragStartMouse;
		var dragDistance = this.dragStartOffset+mouseDifference;
		var dragMovement = (dragDistance<this.trackTop) ? this.trackTop : (dragDistance>this.trackBottom) ? this.trackBottom : dragDistance;
		this.dragObj.setTop(dragMovement);
		var contentMovement = -(dragMovement-this.trackTop)*(1/this.scrollLength);
		this.contentObj.setTop(contentMovement);
	}
	ScrollObj.prototype.scroll = function(speed){
		var contentMovement = this.contentObj.getTop()+speed;
		var dragMovement = this.trackTop-Math.round(this.contentObj.getTop()*(this.trackLength/this.contentLength));
		if(contentMovement > 0){
			contentMovement = 0;
		}else if(contentMovement < -this.contentLength){
			contentMovement = -this.contentLength;
		}
		if(dragMovement < this.trackTop){
			dragMovement = this.trackTop;
		}else if(dragMovement > this.trackBottom){
			dragMovement = this.trackBottom;
		}
		this.contentObj.setTop(contentMovement);
		this.dragObj.setTop(dragMovement);
		this.scrollTimer = window.setTimeout(this.obj+".scroll("+speed+")",25);
	}
	ScrollObj.prototype.stopScroll = function(){
		if(this.scrollTimer){
			window.clearTimeout(this.scrollTimer);
			this.scrollTimer = null;
		}
	}
	ScrollObj.prototype.scrollJump = function(e){
		var currentMouse = getYMouse(e);
		var dragDistance = currentMouse-(this.dragHeight/2);
		var dragMovement = (dragDistance<this.trackTop) ? this.trackTop : (dragDistance>this.trackBottom) ? this.trackBottom : dragDistance;
		this.dragObj.setTop(dragMovement);
		var contentMovement = -(dragMovement-this.trackTop)*(1/this.scrollLength);
		this.contentObj.setTop(contentMovement);
	}
	
	// ||||||||||||||||||||||||||||||||||||||||||||||||||
	// Misc Functions
	
	function fixNetscape4(){
		if(ns4origWidth != window.innerWidth || ns4origHeight != window.innerHeight){
			window.location.reload();
		}	
	}
	if(document.layers){
		ns4origWidth = window.innerWidth;
		ns4origHeight = window.innerHeight;
		window.onresize = fixNetscape4;
	}