/* Requires className.js file */

function addEvent(event,method){
	this[event] = method;
}
function removeEvent(event){
	this[event] = null;
}
function getElement(name,nest){
	nest = nest ? "document."+nest+"." : "";
	var el = document.getElementById(name);
	return initElement(el);
}
function initElement(el)
{
	el.css = el.style;
	el.getTop = function(){return parseInt(el.css.top) || 0};
	el.setTop = function(y){el.css.top = y+"px"};
	el.getHeight = function(){return el.offsetHeight};
	el.getClipHeight = function(){return el.offsetHeight};
	el.hideVis = function(){el.css.visibility="hidden"};
	el.addEvent = addEvent;
	el.removeEvent = removeEvent;
	return el;
}

var iex = document.all;
function getYMouse(e){
	return iex ? event.clientY : e.pageY;
}

document.addEvent = addEvent;
document.removeEvent = removeEvent;

// ||||||||||||||||||||||||||||||||||||||||||||||||||
// Scroll Functions

/*Scroll objects class names*/
var CNTrack = "track";
var CNUp = "up";
var CNDown = "down";
var CNDrag = "drag";
var CNContentMask = "contentMask";
var CNContentArea = "contentArea";
var CNScrollBarContainer = "scrollBar";
ScrollObj = function(containerId)
{
	this.container = getElement(containerId);
	this.contentMaskObj = initElement(getElementsByClassName(CNContentMask,"DIV",this.container)[0]); // Reference to the content mask div
	this.contentMaskHeight = this.contentMaskObj.getClipHeight();// Height of the div that masks the content div
	this.contentObj = initElement(getElementsByClassName(CNContentArea,"DIV",this.container)[0]);
	this.contentObjHeight = this.contentObj.getClipHeight();// Height of the div that masks the content div
	if (this.contentObjHeight <= this.contentMaskHeight)
	{
		getElementsByClassName(CNScrollBarContainer,"DIV",this.container)[0].style.visibility = "hidden";
	}
	this.scrollSpeed = 10; // scrolling speed
	this.trackObj = initElement(getElementsByClassName(CNTrack,"DIV",this.container)[0]); // Reference to the scrollbar track div
	this.trackHeight = this.trackObj.getHeight(); // Height of scrollbar track
	this.upObj = initElement(getElementsByClassName(CNUp,"DIV",this.container)[0].firstChild); // Reference to the up arrow div
	this.downObj = initElement(getElementsByClassName(CNDown,"DIV",this.container)[0].firstChild); // Reference to the down arrow div
	this.dragObj = initElement(getElementsByClassName(CNDrag,"DIV",this.container)[0].firstChild); // Reference to the scrollbar drag div
	this.dragHeight = this.dragObj.getHeight(); // Height of scrollbar drag
	this.trackTop = this.dragObj.getTop(); // Scrollbar top contraint
	this.trackLength = this.trackHeight-this.dragHeight; // Adjusted track height
	this.trackBottom = this.trackTop+this.trackLength; // Scrollbar bottom contraint
	this.contentHeight = this.contentObj.getHeight(); // Height of the content div
	this.contentLength = this.contentHeight-this.contentMaskHeight; // Adjusted content height
	this.scrollLength = this.trackLength/this.contentLength; // Height difference between the scrollbar track and the content
	this.scrollTimer = null;

	this.obj = containerId+"Object";
	eval(this.obj+"=this");

	this.scrollRefresh = null;
	
	var self = this;
	this.trackObj.addEvent("onmousedown", function(e){self.dragStartMouse = getYMouse(e);self.dragStartOffset = self.dragObj.getTop();self.scrollJump(e);return false});
	this.upObj.addEvent("onmousedown", function(){self.scroll(self.scrollSpeed);return false});
	this.upObj.addEvent("onmouseup", function(){self.stopScroll()});
	this.upObj.addEvent("onmouseout", function(){self.stopScroll()});
	this.downObj.addEvent("onmousedown", function(){self.scroll(-self.scrollSpeed);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});
	this.dragObj.addEvent("onmouseup", function(){self.stopDrag()});
	this.dragObj.addEvent("ondragstart", function(){return false});
	this.dragObj.addEvent("ondragleave", function(){self.stopDrag()});
}

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 self = this;
	self.contentHeight = self.contentObj.getHeight(); // Height of the content div
	self.contentLength = self.contentHeight-self.contentMaskHeight; // Adjusted content height
	self.scrollLength = self.trackLength/self.contentLength; // Height difference between the scrollbar track and the content

	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 self = this;
	self.contentHeight = self.contentObj.getHeight(); // Height of the content div
	self.contentLength = self.contentHeight-self.contentMaskHeight; // Adjusted content height
	self.scrollLength = self.trackLength/self.contentLength; // Height difference between the scrollbar track and the content

	var contentMovement = self.contentObj.getTop()+speed;
	var dragMovement = self.trackTop-Math.round(self.contentObj.getTop()*(self.trackLength/self.contentLength));
	if(contentMovement > 0){
		contentMovement = 0;
	}else if(contentMovement < -self.contentLength){
		contentMovement = -self.contentLength;
	}
	if(dragMovement < self.trackTop){
		dragMovement = self.trackTop;
	}else if(dragMovement > self.trackBottom){
		dragMovement = self.trackBottom;
	}
	this.contentObj.setTop(contentMovement);
	this.dragObj.setTop(dragMovement);
	this.scrollTimer = window.setTimeout(self.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 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.scrollUpTo = function(speed,pos){
	var self = this;
	self.contentHeight = self.contentObj.getHeight(); // Height of the content div
	self.contentLength = self.contentHeight-self.contentMaskHeight; // Adjusted content height
	self.scrollLength = self.trackLength/self.contentLength; // Height difference between the scrollbar track and the content
	
	if (self.contentLength > 0)
	{
		if(self.contentObj.getTop() <= pos)
		{
			self.stopScroll();
			self.scrollDownTo(-(speed),pos);
			//window.clearTimeout(self.scrollRefresh);
			return;
		}
		else
		{
			self.scrollTimer = window.setTimeout(self.obj+".scrollUpTo("+speed+","+pos+")",25);
			//self.scrollRefresh = window.setTimeout(self.obj+".Refresh()",25);
		}	

		var contentMovement = self.contentObj.getTop()+speed;
		var dragMovement = self.trackTop-Math.round(self.contentObj.getTop()*(self.trackLength/self.contentLength));
		if(contentMovement > 0){
			contentMovement = 0;
		}else if(contentMovement < -self.contentLength){
			contentMovement = -self.contentLength;
			self.stopScroll();
		}
		if(dragMovement < self.trackTop){
			dragMovement = self.trackTop;
		}else if(dragMovement > self.trackBottom){
			dragMovement = self.trackBottom;
		}
		this.contentObj.setTop(contentMovement);
		this.dragObj.setTop(dragMovement);
		
	}
}

ScrollObj.prototype.scrollDownTo = function(speed,pos){
	var self = this;
	self.contentHeight = self.contentObj.getHeight(); // Height of the content div
	self.contentLength = self.contentHeight-self.contentMaskHeight; // Adjusted content height
	self.scrollLength = self.trackLength/self.contentLength; // Height difference between the scrollbar track and the content
	
	if (self.contentLength > 0)
	{
		if(self.contentObj.getTop() >= pos)
		{
			self.stopScroll();
			window.clearTimeout(self.scrollRefresh);
			return;
		}
		else
		{
			self.scrollTimer = window.setTimeout(self.obj+".scrollDownTo("+speed+","+pos+")",25);
			//self.scrollRefresh = window.setTimeout(self.obj+".Refresh()",25);
		}	

		var contentMovement = self.contentObj.getTop()+speed;
		var dragMovement = self.trackTop-Math.round(self.contentObj.getTop()*(self.trackLength/self.contentLength));
		if(contentMovement > 0){
			contentMovement = 0;
		}else if(contentMovement < -self.contentLength){
			contentMovement = -self.contentLength;
			self.stopScroll();
		}
		if(dragMovement < self.trackTop){
			dragMovement = self.trackTop;
		}else if(dragMovement > self.trackBottom){
			dragMovement = self.trackBottom;
		}
		this.contentObj.setTop(contentMovement);
		this.dragObj.setTop(dragMovement);
		
	}
}

ScrollObj.prototype.Refresh = function(){
	var self = this;

	self.contentMaskHeight = self.contentMaskObj.getClipHeight();// Height of the div that masks the content div
	self.contentObjHeight = self.contentObj.getClipHeight();// Height of the div that masks the content div

	self.RefreshHeight();
	self.contentObj.setTop(0);	
	self.dragObj.setTop(0);
	if (self.contentObjHeight > self.contentMaskHeight)
	{
		getElementsByClassName(CNScrollBarContainer,"DIV",self.container)[0].style.visibility = "visible";
		return;
	}
	else
	{
		getElementsByClassName(CNScrollBarContainer,"DIV",self.container)[0].style.visibility = "hidden";
		return;
	}
}
ScrollObj.prototype.RefreshHeightscroller = function() {
/*
	this.obj = objRef+"Object";
	eval(this.obj+"=this");
*/

	var self = this;
	self.contentHeight = self.contentObj.getHeight(); // Height of the content div
	self.contentLength = self.contentHeight-self.contentMaskHeight; // Adjusted content height
	self.scrollLength = self.trackLength/self.contentLength; // Height difference between the scrollbar track and the content

	var contentMovement = self.contentObj.getTop();
	var dragMovement = self.trackTop-Math.round(self.contentObj.getTop()*(self.trackLength/self.contentLength));
	if(contentMovement > 0){
		contentMovement = 0;
	}else if(contentMovement < -self.contentLength){
		contentMovement = -self.contentLength;
	}
	if(dragMovement < self.trackTop){
		dragMovement = self.trackTop;
	}else if(dragMovement > self.trackBottom){
		dragMovement = self.trackBottom;
	}

	self.contentMaskHeight = self.contentMaskObj.getClipHeight();// Height of the div that masks the content div
	self.contentObjHeight = self.contentObj.getClipHeight();// Height of the div that masks the content div

	if (self.contentObj.getTop()<0)
	{
		self.contentObj.setTop(contentMovement);
		self.dragObj.setTop(dragMovement);
	}

	if (self.contentObjHeight <= self.contentMaskHeight)
	{
		getElementsByClassName(CNScrollBarContainer,"DIV",self.container)[0].style.visibility = "hidden";
		self.contentObj.setTop(0);
	}
	else
	{
		getElementsByClassName(CNScrollBarContainer,"DIV",self.container)[0].style.visibility = "visible";
	}
}

